Как проверить, существует ли переменная? - PullRequest
772 голосов
/ 09 мая 2009

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

try:
   myVar
except NameError:
   # Do something.

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

Ответы [ 9 ]

1347 голосов
/ 09 мая 2009

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

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

Чтобы проверить существование глобальной переменной:

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

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

if hasattr(obj, 'attr_name'):
  # obj.attr_name exists.
103 голосов
/ 09 мая 2009

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

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

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

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

33 голосов
/ 04 июня 2015

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

Затем позже:

if myVar is not None:
    # Do something
20 голосов
/ 09 мая 2009

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

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

my_variable = None

def InitMyVariable():
  global my_variable
  if my_variable is None:
    my_variable = ...
15 голосов
/ 28 октября 2014

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

'var' in dir(obj)

Например,

>>> class Something(object):
...     pass
...
>>> c = Something()
>>> c.a = 1
>>> 'a' in dir(c)
True
>>> 'b' in dir(c)
False
10 голосов
/ 26 марта 2014

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

class InitMyVariable(object):
  my_variable = None

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

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

def InitMyVariable():
  if InitMyVariable.my_variable is None:
    InitMyVariable.my_variable = ...
InitMyVariable.my_variable = None
7 голосов
/ 09 мая 2009

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

5 голосов
/ 31 октября 2016

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

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

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

5 голосов
/ 08 сентября 2010

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