2011-06-17 25 views
13

Duplicar posible:
Python - checking variable existingPython: comprobar si existe algún objeto en su alcance

¿Hay una manera eficiente, simple y Pythonic para comprobar si existe un objeto en el alcance?

En Python todo es un objeto (variables, funciones, clases, instancias de clases, etc.), así que estoy buscando una prueba de la existencia de un objeto genérico, no importa lo que es.

I la mitad esperaba que hubiera un exists()built-in function, pero no pude encontrar ninguno que se ajustara a la factura.

Respuesta

17

siempre se puede:

try: 
    some_object 
except NameError: 
    do_something() 
else: 
    do_something_else() 
+2

Esto generalmente se considera la forma "Pythonic" de hacerlo. – martineau

+3

Esto es eficaz cuando en la mayoría de los casos el objeto existe como la captura de una excepción es un evento costoso – Jonathan

5

Creo que usted está buscando algo así como locals. Así es como funciona:

>>> foo = 1 
>>> l = locals() 
>>> print l 
{'__builtins__': <module '__builtin__' (built-in)>, 'l': {...}, 
'__package__': None,'__name__':'__main__', 'foo': 1, '__doc__': None} 
>>> print l['foo'] 
1 
+0

Tendrá que llamar a la gente para actualizar los locales diccionario cada vez que se desea comprobar la existencia, mi conjetura sería que esto es menos eficientes que los 'locales Try-excepto método, aunque un punto de referencia está en orden – Jonathan

+1

es mejor utilizar l.has_key ('foo') para comprobar la existancy – prgbenz

+0

la secuencia de operaciones de búsqueda que Python normalmente hace por un nombre es()' , 'globals()' y 'vars (__ builtin __)' - por lo que esta * no * se está comprobando para ver si un nombre está actualmente en el alcance. – martineau

1

Es posible escribir su propio:

import __builtin__ 
import sys 

def exists(name): 
    return (name in sys._getframe(1).f_locals # caller's locals 
     or name in sys._getframe(1).f_globals # caller's globals 
     or name in vars(__builtin__)   # built-in 
    ) 

if __name__=='__main__': 
    def foobar(): 
     local_var = 42 
     print 'exists("global_var"):', exists("global_var") 
     print 'exists("local_var"):', exists("local_var") 

    print 'exists("baz"):', exists("baz") # undefined 
    print 'exists("dict"):', exists("dict") # built-in 
    foobar() # global_var doesn't exist yet 
    global_var = 'I think, therefore I am' 
    print 'exists("global_var"):', exists("global_var") 
    foobar() # now global_var exists 
5

Habrá una diferencia si usted está tratando de determinar si existe un local o un atributo de un objeto. Para un objeto, hasattr (objeto, "atributo") hará el truco.

Esto también funciona en los módulos:

import math 
hasattr(math,"pow") => True 

Pero por lo que podemos llamar la principal alcance, que tendrá que utilizar los locales(), como hasattr() necesita algún tipo de objeto a excavar en . En este caso no hay ninguno ...

exists_mainscope = lambda name: locals().has_key(name) 
exists_mainscope("test") => False 

lo tanto, lo que busca podría ser el siguiente:

def exists(name,obj=None): 
if obj is None: return locals().has_key(name) 
else: return hasattr(obj,name) 

enter code here 
19

Usted parece ser la búsqueda de hasattr(). Lo usa para ver si, en el ámbito del espacio de nombres de un objeto (e incluso los módulos importados son objetos), existe un nombre de atributo dado.

Por lo tanto, no puedo hacer:

>>> import math 
>>> hasattr(math, 'atan') 
True 

o algo así:

>>> class MyClass(object): 
...  def __init__(self): 
...   self.hello = None 
... 
>>> myObj = MyClass() 
>>> hasattr(myObj, 'hello') 
True 
>>> hasattr(myObj, 'goodbye') 
False 
+0

Hah. No hay respuesta para hablar sobre hasattr, así que creo uno, asegurándome de que mis ejemplos funcionen correctamente, luego lo publico y ¡PRISIONERO! @ Dog-eat-cat-world me ha ganado. –

Cuestiones relacionadas