2012-02-22 18 views
30

Esto es bastante básico, pero yo estaba codificando y empecé a preguntarme si había una manera pitónica de comprobar si algo no existe. Así es como lo haría si su verdadero:manera pitonica para verificar si algo existe?

var = 1 
if var: 
    print 'it exists' 

pero cuando puedo comprobar si algo no existe, a menudo hago algo como esto:

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

parece un desperdicio si todo lo que me importa es ¿Hay alguna forma de verificar si algo no existe sin el otro?

+0

Siempre hay ternario: http://stackoverflow.com/questions/394809/python-ternary-operator :) ... pensé que podría no ser la forma más pitonica de escribirlo. – summea

+3

Si 'var' en realidad no ** existe **, entonces usted recibirá una excepción al tratar de usarlo. Eso está fuera de lo que 'if' /' else' puede manejar. 'si var' ** asume ** que' var' existe, y ** prueba ** si es "verdadero-ish" (se convierte en True en lugar de False si se convierte en booleano). –

+1

No está comprobando la existencia de una variable, pero verifica si su valor es 'True' como un contexto booleano. – FallenAngel

Respuesta

83

estilo LBYL, "mirar antes de saltar":

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

estilo EAFP, "más fácil pedir perdón que pedir permiso":

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

Prefiero el segundo estilo (EAFP) al codificar en Python, porque generalmente es más confiable.

+0

Prueba si var no existe: 'var' no en locales() y 'var' no en globales() – MyopicVisage

16

yo creo que hay que tener cuidado con su terminología, si algo existe y algo que se evalúa como Falso son dos cosas diferentes. Suponiendo que usted quiere este último, sólo tiene que hacer:

if not var: 
    print 'var is False' 

En el primer caso, sería la menos elegante:

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

voy a dar un salto y de riesgo, sin embargo, que todo lo hace que quieras comprobar si una variable está definida, probablemente pueda resolverse de una manera más elegante.

+0

lo siento no significaba falso. significaba si no existe. Lo uso más a menudo en consultas sql (envuelvo una instrucción if en una consulta de selección y si no hay resultados, entonces trabajo), por lo que no es falso que no exista. – Lostsoul

+0

bien 'config = config()' y luego 'if not config:' me da "configuración de variable local referenciada antes de la asignación" :) – holms

0

¿Qué tal la negación?

if not var: 
    print 'nope it does not' 

aunque esto es para ver si el var es falsa/ninguno y explotaría si no se define var.

Para ver si se define var:

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' 

en Python si varibale es tener cualquier valor entre Ninguno/Falso/0 entonces If var condición fallará ...

y por otra objetos llamará al método __nonzero__ pythonic que puede devolver True o False dependiendo de su funcionalidad.

+2

Esto no manejará el caso donde la variable nunca fue definida, que es la pregunta de OP. – btown

2

Para comprobar si un var se ha definido:

var = 2 

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

Para comprobar si es Ninguno/Falso

if varz is None 

... o

if not varz 
2

Si se trata de una diccionario, puede tener

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

Sin embargo, has_key() se elimina por completo desde Python 3.x, por lo tanto, la forma en Python es usar in

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

Se puede utilizar para in tupla, lista, y establecer así.


Por supuesto, si no se ha definido la variable, se tiene que levantar una excepción en silencio (justo plantear ninguna excepción ... dejarlo pasar), si excepción no es lo que quiere ver (que es útil para muchas aplicaciones, sólo tiene que registrar la excepción.)


siempre es más seguro para definir una variable antes de usarla (que se ejecutará en la "asignación antes de referencia local", que significa "var no está en el alcance "en inglés simple". Si hace algo con la consulta, existe la posibilidad de que desee tener un diccionario y verificar si una clave existe o no, use in.

+0

La más simple de todas las soluciones – DrStrangepork

Cuestiones relacionadas