Ответ 1
try:
thevariable
except NameError:
print("well, it WASN'T defined after all!")
else:
print("sure, it was defined.")
Возможный дубликат:
Простой способ проверить, что переменная определена в 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?
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
.