Как проверить, существует ли переменная?

Я хочу проверить, существует ли переменная. Сейчас я делаю что-то вроде этого:

try:
   myVar
except NameError:
   # Do something.

существуют ли другие способы без исключений?

10 ответов


чтобы проверить наличие локальной переменной:

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

чтобы проверить наличие глобальной переменной:

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

чтобы проверить, имеет ли объект атрибут:

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

использование переменных, которые не были определены или установлены (неявно или явно) - это почти всегда плохо в любой язык, поскольку он указывает, что логика программы не была продумана должным образом и, вероятно, приведет к непредсказуемому поведению.

следующий трюк, который похож на ваш, гарантирует, что переменная имеет некоторые значение перед использованием:

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

тем не менее, я все еще не думаю, что это хорошо идея - на мой взгляд, вы должны реорганизовать код так, что эта ситуация не происходит.


простой способ-инициализировать его сначала говоря myVar = None

позже:
if myVar is not None:
    # Do something

использование try / except-лучший способ проверить существование переменной. Но почти наверняка есть лучший способ сделать то, что вы делаете, чем установка/тестирование глобальных переменных.

например, если вы хотите инициализировать переменную уровня модуля при первом вызове какой-либо функции, вам лучше использовать код примерно так:

my_variable = None

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

для объектов/модулей, вы также можете

'var' in dir(obj)

например,

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

я предположу, что тест будет использоваться в функции, аналогичной user97370 это. Мне не нравится этот ответ, потому что он засоряет глобальное пространство имен. Один из способов исправить это-использовать класс вместо:

class InitMyVariable(object):
  my_variable = None

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

мне это не нравится, потому что это усложняет код и открывает такие вопросы, как, должно ли это подтвердить шаблон Одноэлементного программирования? К счастью, Python позволил функциям иметь атрибуты на некоторое время, что дает нам это простое решение:

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

catch называется except в Python. кроме этого, это нормально для таких простых случаев. Есть AttributeError Это можно использовать для проверки, имеет ли объект атрибут.


способ, который часто хорошо работает для обработки такого рода ситуации, - это не явно проверять, существует ли переменная, а просто продолжить и обернуть первое использование возможно несуществующей переменной в try / except 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
  ...

Это просто дополнение к предыдущим ответам, чтобы проверить, присутствует ли ключ в JSON / Dict или нет в python

'имя объекта Json / Dict'.has_key('имя ключа')

это вернет True или False


попробовать:`

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

надеюсь, что это помогает!