Определить, определена ли переменная в Python

Возможный дубликат:
Простой способ проверить, что переменная определена в python?
Как проверить, существует ли переменная в Python?

Откуда вы знаете, была ли переменная задана в определенном месте кода во время выполнения? Это не всегда очевидно, потому что (1) переменная может быть условно установлена, и (2) переменная может быть условно удалена. Я ищу что-то вроде defined() в Perl или isset() в PHP или defined? в Ruby.

if condition:
    a = 42

# is "a" defined here?

if other_condition:
    del a

# is "a" defined here?

Ответ 1

try:
    thevariable
except NameError:
    print("well, it WASN'T defined after all!")
else:
    print("sure, it was defined.")

Ответ 2

'a' in vars() or 'a' in globals()

если вы хотите быть педантичным, вы также можете проверить встроенные функции
'a' in vars(__builtins__)

Ответ 3

Я думаю, что лучше избегать ситуации. Чище и понятнее писать:

a = None
if condition:
    a = 42

Ответ 4

try:
    a # does a exist in the current namespace
except NameError:
    a = 10 # nope

Ответ 5

Возможная ситуация, когда это может понадобиться:

Если вы используете блок finally для закрытия соединений, но в блоке try, программа завершает работу с sys.exit() до того, как будет определено соединение. В этом случае будет вызываться блок finally, и оператор закрытия соединения будет терпеть неудачу, поскольку не было создано никакого соединения.

Ответ 6

Для этого конкретного случая лучше a = None вместо del a. Это приведет к уменьшению количества ссылок на объект a, который был (если есть) назначен и не будет терпеть неудачу, если a не определен. Обратите внимание, что оператор del не вызывает деструктор объекта напрямую, но отвязывает его от переменной. Деструктор объекта вызывается, когда число ссылок становится равным нулю.

Ответ 7

Если вы хотите поймать попытки доступа к неопределенной переменной внутри объекта, это очень простой способ:

class Whatever(object):
  def __getattr__(self, key):
    return None

Здесь python сначала пытается найти атрибут внутри объекта или дерева объектов, и только если это не работает, вызывается функция __getattr__(self, key). Это означает, что если __getattr__ вызывается, мы можем просто вернуть None.