Pregunta ¿Cómo puedo verificar si existe una variable?


Quiero verificar si existe una variable. Ahora estoy haciendo algo como esto:

try:
   myVar
except NameError:
   # Do something.

¿Hay otras formas sin excepciones?


617
2018-05-09 13:10


origen


Respuestas:


Para verificar la existencia de una variable local:

if 'myVar' in locals():
  # myVar exists.

Para verificar la existencia de una variable global:

if 'myVar' in globals():
  # myVar exists.

Para verificar si un objeto tiene un atributo:

if hasattr(obj, 'attr_name'):
  # obj.attr_name exists.

1099
2018-05-09 13:16



El uso de variables que no han sido definidas o establecidas (implícita o explícitamente) es casi siempre una mala cosa en alguna idioma ya que indica que la lógica del programa no se ha pensado correctamente, y es probable que dé lugar a un comportamiento impredecible.

El siguiente truco, que es similar al tuyo, asegurará que una variable tenga algunos valor antes del uso:

try:
    myVar
except NameError:
    myVar = None
# Now you're free to use myVar without Python complaining.

Sin embargo, todavía no creo que sea una buena idea, en mi opinión, debe refactorizar su código para que esta situación no ocurra.


84
2018-05-09 13:19



Usar try / except es la mejor forma de evaluar la existencia de una variable. Pero es casi seguro que hay una forma mejor de hacer lo que sea que estés haciendo que establecer / probar variables globales.

Por ejemplo, si desea inicializar una variable de nivel de módulo la primera vez que llama a alguna función, es mejor que tenga un código como este:

my_variable = None

def InitMyVariable():
  global my_variable
  if my_variable is None:
    my_variable = ...

17
2018-05-09 13:27



Una forma simple es inicializarlo al principio diciendo myVar = None

Luego más adelante:

if myVar is not None:
    # Do something

15
2018-06-04 18:46



para objetos / módulos, también puedes

'var' in dir(obj)

Por ejemplo,

>>> class Something(object):
...     pass
...
>>> c = Something()
>>> c.a = 1
>>> 'a' in dir(c)
True
>>> 'b' in dir(c)
False

13
2017-10-28 18:39



Asumiré que la prueba se usará en una función, similar a Respuesta de user97370. No me gusta esa respuesta porque contamina el espacio de nombres global. Una forma de solucionarlo es utilizar una clase en su lugar:

class InitMyVariable(object):
  my_variable = None

def __call__(self):
  if self.my_variable is None:
   self.my_variable = ...

No me gusta esto porque complica el código y abre preguntas como, ¿debería confirmar esto el patrón de programación de Singleton? Afortunadamente, Python ha permitido que las funciones tengan atributos por un tiempo, lo que nos brinda esta sencilla solución:

def InitMyVariable():
  if InitMyVariable.my_variable is None:
    InitMyVariable.my_variable = ...
InitMyVariable.my_variable = None

7
2018-03-25 20:31



catch se llama except en Python. aparte de eso, está bien para casos tan simples. Está el AttributeError que se puede usar para verificar si un objeto tiene un atributo.


6
2018-05-09 13:12



Una forma que a menudo funciona bien para manejar este tipo de situación es no verificar explícitamente si la variable existe, sino seguir adelante y ajustar el primer uso de la variable posiblemente no existente en try / excepto NameError:

# Search for entry.
for x in y:
  if x == 3:
    found = x

# Work with found entry.
try:
  print('Found: {0}'.format(found))
except NameError:
  print('Not found')
else:
  # Handle rest of Found case here
  ...

4
2017-09-08 03:05



Es solo una adición a las respuestas anteriores para verificar si una clave está presente en JSON / Dict o no en python

'Json / Dict object name'.has_key (' nombre clave ')

esto devolverá verdadero o falso


3
2017-10-31 04:30



prueba: `

Myvariable = ['v', 'a', 'r']
try:
    print(Myvariable)
except Nameerror:
    print('variable \"Myvariable\" not found')

¡espero que esto ayude!


-2
2017-08-07 11:43