14

Как проверить, существует ли переменная?

19

Я хочу проверить, существует ли переменная. В настоящее время я делаю это следующим образом:

try:
    myVar
except NameError:
    # Что-то делаем.

Есть ли другие способы проверки, не используя исключения?

5 ответ(ов)

23

Чтобы проверить существование локальной переменной, можно использовать следующий код:

if 'myVar' in locals():
    # myVar существует.

Для проверки существования глобальной переменной используйте этот код:

if 'myVar' in globals():
    # myVar существует.

Чтобы проверить, обладает ли объект атрибутом, можно воспользоваться следующим примером:

if hasattr(obj, 'attr_name'):
    # obj.attr_name существует.

Эти конструкции позволяют безопасно работать с переменными и атрибутами, избегая потенциальных ошибок.

1

Использование переменных, которые еще не были определены или инициализированы (косвенно или явно), зачастую является плохой практикой, так как это может указывать на то, что логика программы была недостаточно продумана, что может привести к непредсказуемому поведению.

Если вам действительно нужно это сделать в Python, я предлагаю следующий трюк, который похож на ваш, и который обеспечит наличие у переменной некоторого значения перед её использованием:

try:
    myVar
except NameError:
    myVar = None  # или любое другое значение по умолчанию

Теперь вы можете использовать myVar, не беспокоясь о том, что Python выдаст ошибку.

Значение, которое вы выберете, будет зависеть от ваших потребностей. Например, если это начальное значение для какого-то аккумулятора, вы можете установить его в ноль.


Тем не менее (и это мое мнение), лучше было бы переписать ваш код так, чтобы эта ситуация не возникала.

В качестве примера, вот код, к которому был дан комментарий в ответ на этот вопрос, для рисования линии от предыдущей точки до текущей:

if last:
    draw(last, current)
last = current

В случае, если last не связано с каким-то значением, это не поможет в Python, так как даже проверка last вызовет исключение. Лучше всего убедиться, что last имеет значение, которое можно использовать для проверки его действительности. Это могло бы выглядеть так:

last = None

# проходит время ...

if last is not None:
    draw(last, current)
last = current

Таким образом, вы гарантируете, что переменная существует и используете её только в случае, если она действительно валидна для вашей задачи.

Вы также можете добавить код, чтобы принудительно это сделать (если у вас нет контроля над начальной инициализацией переменной), используя метод с исключениями, указанный выше:

# Переменная 'last' может или не может быть связана с каким-то значением на этом этапе.

try:
    last
except NameError:
    last = None

# Теперь она всегда будет связана с каким-то значением на этом этапе.

if last is not None:
    draw(last, current)
last = current
0

Простой способ — инициализировать переменную с помощью myVar = None в начале.

А затем уже можно делать так:

if myVar is not None:
    # Выполнить некоторые действия
0

Вы можете использовать следующий код для проверки наличия атрибутов у объектов или модулей:

'var' in dir(obj)

Например:

>>> class Something(object):
...     pass
...
>>> c = Something()
>>> c.a = 1
>>> 'a' in dir(c)
True
>>> 'b' in dir(c)
False

В этом примере мы создали класс Something, создали его экземпляр c и добавили атрибут a со значением 1. С помощью функции dir() мы можем проверить, присутствует ли атрибут a в списке атрибутов объекта c. В результате мы получаем True, если атрибут существует, и False, если его нет.

0

Использование конструкции try/except для проверки существования переменной — это один из подходов, но, вероятно, есть более оптимальные способы решить вашу задачу, чем использование глобальных переменных.

Если, например, вы хотите инициализировать переменную на уровне модуля при первом вызове какой-либо функции, то лучше воспользоваться следующим шаблоном кода:

my_variable = None

def InitMyVariable():
    global my_variable
    if my_variable is None:
        my_variable = ...

Таким образом, вы избегаете ненужных ошибок, а код становится более читаемым и понятным.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь