Я хочу проверить, существует ли переменная. Теперь я делаю что-то вроде этого:
try:
myVar
except NameError:
# Do something.
Существуют ли другие способы без исключений?
Я хочу проверить, существует ли переменная. Теперь я делаю что-то вроде этого:
try:
myVar
except NameError:
# Do something.
Существуют ли другие способы без исключений?
Чтобы проверить существование локальной переменной:
if 'myVar' in locals():
# myVar exists.
Чтобы проверить существование глобальной переменной:
if 'myVar' in globals():
# myVar exists.
Чтобы проверить, имеет ли объект атрибут:
if hasattr(obj, 'attr_name'):
# obj.attr_name exists.
Использование переменных, которые еще не были определены или установлены (неявно или явно), почти всегда плохо на любом языке, поскольку это часто указывает на то, что логика программы не была продумана должным образом и, вероятно, приведет к в непредсказуемом поведении.
Если вам нужно сделать это в Python, следующий трюк, аналогичный вашему, гарантирует, что переменная имеет какое-то значение перед использованием:
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 answer. Мне не нравится этот ответ, потому что он загрязняет глобальное пространство имен. Один из способов исправить это - вместо этого использовать класс:
class InitMyVariable(object):
my_variable = None
def __call__(self):
if self.my_variable is None:
self.my_variable = ...
Мне это не нравится, потому что это усложняет код и открывает такие вопросы, как, если это подтвердит шаблон программирования Singleton? К счастью, 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')
надеюсь, что это поможет!
Это будет работать, чтобы увидеть, существует ли вообще переменная.
if myvar:
#It exists
else:
#It doesn't exist