Как проверить, существует ли переменная?
Я хочу проверить, существует ли переменная. Сейчас я делаю что-то вроде этого:
try:
myVar
except NameError:
# Do something.
существуют ли другие способы без исключений?
10 ответов
чтобы проверить наличие локальной переменной:
if 'myVar' in locals():
# myVar exists.
чтобы проверить наличие глобальной переменной:
if 'myVar' in globals():
# myVar exists.
чтобы проверить, имеет ли объект атрибут:
if hasattr(obj, 'attr_name'):
# obj.attr_name exists.
использование переменных, которые не были определены или установлены (неявно или явно) - это почти всегда плохо в любой язык, поскольку он указывает, что логика программы не была продумана должным образом и, вероятно, приведет к непредсказуемому поведению.
следующий трюк, который похож на ваш, гарантирует, что переменная имеет некоторые значение перед использованием:
try:
myVar
except NameError:
myVar = None
# Now you're free to use myVar without Python complaining.
тем не менее, я все еще не думаю, что это хорошо идея - на мой взгляд, вы должны реорганизовать код так, что эта ситуация не происходит.
простой способ-инициализировать его сначала говоря myVar = None
if myVar is not None:
# Do something
использование try / except-лучший способ проверить существование переменной. Но почти наверняка есть лучший способ сделать то, что вы делаете, чем установка/тестирование глобальных переменных.
например, если вы хотите инициализировать переменную уровня модуля при первом вызове какой-либо функции, вам лучше использовать код примерно так:
my_variable = None
def InitMyVariable():
global my_variable
if my_variable is None:
my_variable = ...
для объектов/модулей, вы также можете
'var' in dir(obj)
например,
>>> class Something(object):
... pass
...
>>> c = Something()
>>> c.a = 1
>>> 'a' in dir(c)
True
>>> 'b' in dir(c)
False
я предположу, что тест будет использоваться в функции, аналогичной user97370 это. Мне не нравится этот ответ, потому что он засоряет глобальное пространство имен. Один из способов исправить это-использовать класс вместо:
class InitMyVariable(object):
my_variable = None
def __call__(self):
if self.my_variable is None:
self.my_variable = ...
мне это не нравится, потому что это усложняет код и открывает такие вопросы, как, должно ли это подтвердить шаблон Одноэлементного программирования? К счастью, Python позволил функциям иметь атрибуты на некоторое время, что дает нам это простое решение:
def InitMyVariable():
if InitMyVariable.my_variable is None:
InitMyVariable.my_variable = ...
InitMyVariable.my_variable = None
catch
называется except
в Python. кроме этого, это нормально для таких простых случаев. Есть AttributeError
Это можно использовать для проверки, имеет ли объект атрибут.
способ, который часто хорошо работает для обработки такого рода ситуации, - это не явно проверять, существует ли переменная, а просто продолжить и обернуть первое использование возможно несуществующей переменной в try / except 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
...
Это просто дополнение к предыдущим ответам, чтобы проверить, присутствует ли ключ в JSON / Dict или нет в python
'имя объекта Json / Dict'.has_key('имя ключа')
это вернет True или False
попробовать:`
Myvariable = ['v', 'a', 'r']
try:
print(Myvariable)
except Nameerror:
print('variable \"Myvariable\" not found')
надеюсь, что это помогает!