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

Возможные Дубликаты:
простой способ проверить, что переменная определена в 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 ответов


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. Это уменьшит количество ссылок на object a был (если есть) назначен и не потерпит неудачу, когда a не определен. Заметьте, что del оператор не вызывает деструктор объекта напрямую,но развязывает его от переменной. Деструктор объекта вызывается, когда счетчик ссылок стал равен нулю.


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

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

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