Определите, определена ли переменная в Python [дубликат]


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

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

if condition:
    a = 42

# is "a" defined here?

if other_condition:
    del a

# is "a" defined here?
7 312

7 ответов:

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

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

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

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

a = None
if condition:
    a = 42
try:
    a # does a exist in the current namespace
except NameError:
    a = 10 # nope

одна из возможных ситуаций, когда это может потребоваться:

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

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

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

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

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