2012-02-22 29 views
30

Questo è piuttosto semplice ma stavo codificando e ho iniziato a chiedermi se esistesse un modo pitone per verificare se qualcosa non esiste. Ecco come lo faccio se il suo vero:modo pythonic per verificare se qualcosa esiste?

var = 1 
if var: 
    print 'it exists' 

ma quando posso controllare se qualcosa non esiste, spesso faccio qualcosa di simile:

var = 2 
if var: 
    print 'it exists' 
else: 
    print 'nope it does not' 

sembra uno spreco, se tutto quello che interessa è C'è un modo per verificare se qualcosa non esiste senza il resto?

+0

C'è sempre ternario: http://stackoverflow.com/questions/394809/python-ternary-operator :) ... pensavo che potesse non essere il modo più pitadico per scriverlo. – summea

+3

Se 'var' in realtà ** esiste **, allora si verificherà un'eccezione quando si tenta di usarlo. Questo è al di fuori di ciò che 'if' /' else' può gestire. 'if var' ** presuppone ** che' var' esista e ** test ** se è "true-ish" (diventa True piuttosto che False se convertito in booleano). –

+1

Non si sta verificando l'esistenza di una variabile, ma controllando se il suo valore è "Vero" come contesto booleano. – FallenAngel

risposta

83

stile LBYL, "guardare prima di saltare":

var_exists = 'var' in locals() or 'var' in globals() 

stile EAFP, "più facile chiedere perdono che il permesso":

try: 
    var 
except NameError: 
    var_exists = False 
else: 
    var_exists = True 

Preferisco il secondo stile (EAFP) quando si scrive codice in Python, perché è generalmente più affidabile.

+0

Verifica se var non esiste: 'var' non in locals() e 'var' non in globals() – MyopicVisage

16

Credo che bisogna stare attenti con la vostra terminologia, se qualcosa esiste e qualcosa restituisce False sono due cose diverse. Supponendo che si desidera questi ultimi, si può semplicemente fare:

if not var: 
    print 'var is False' 

Per i primi, sarebbe il meno elegante:

try: 
    var 
except NameError: 
    print 'var not defined' 

ho intenzione di fare un salto di qualità e di rischio, però, che tutto ciò che ti sta chiedendo di verificare se una variabile è definita può probabilmente essere risolta in un modo più elegante.

+0

scusa non significava falso. significava se non esiste. Lo uso più spesso in query SQL (avvolgo un'istruzione if in una query di selezione e se non viene restituito alcun risultato, allora lavoro un po '), quindi non sto cercando false non esistenti. – Lostsoul

+0

bene 'config = config()' e quindi 'se non config:' mi dà "config variabile locale di riferimento prima dell'assegnazione" :) – holms

0

E la negazione?

if not var: 
    print 'nope it does not' 

anche se questo è per vedere se il var è falsa/nessuno e sarebbe saltare in aria se var non è definito.

per vedere se var è definita:

try: 
    var 
except NameError: 
    print 'not defined' 
0
if not var: 
    #Var is None/False/0/ 

if var: 
    #Var is other then 'None/False/0' 

in Python se varibale sta avendo alcun valore da Nessuno/Falso/0 allora If var condizione fallirà ...

e per altri oggetti chiamerà il metodo __nonzero__ pythonic che può restituire True o False a seconda della sua funzionalità.

+2

Questo non gestirà il caso in cui la variabile non è mai stata definita, che è la domanda dell'OP. – btown

2

per verificare se una var è stata definita:

var = 2 

try: 
    varz 
except NameError: 
    print("No varz") 

per verificare se è None/Falso

if varz is None 

... o

if not varz 
2

Se questo è un dizionario, è possibile avere

mydict['ggg'] = '' // doesn't matter if it is empty value or not. 
if mydict.has_key('ggg'): 
    print "OH GEESH" 

Tuttavia, has_key() viene completamente rimosso dal Python 3.x, di conseguenza, il modo in cui Python è quello di utilizzare in

'ggg' in mydict  # this is it! 
# True if it exists 
# False if it doesn't 

È possibile utilizzare in per tuple, lista, e impostare pure.


Naturalmente, se non è stata definita la variabile, si dovrà sollevare un'eccezione in silenzio (basta sollevare alcuna eccezione ... lasciarlo passare), se eccezione non è ciò che si vuole vedere (che è utile per molte applicazioni, è sufficiente effettuare il login l'eccezione.)


E 'sempre sicuro di definire una variabile prima di utilizzarla (si andrà in "assegnazione prima di riferimento locale", che significa "var non è nello scopo "in inglese semplice). Se fai qualcosa con una query, la possibilità è che tu voglia avere un dizionario e controllare se esiste o meno una chiave, usa in.

+0

Più semplice di tutte le soluzioni – DrStrangepork

Problemi correlati