Ошибка Python NameError: переменная или функция не найдена

Раздел: Ошибки -> Ошибки выполнения

Основное решение: проверка определения имени или импорт

Ошибка NameError: name '...' is not defined возникает, когда интерпретатор Python не может найти имя (переменную, функцию, класс или модуль) в текущей области видимости. Самый прямой способ исправления - убедиться, что имя определено до его использования. Например, если переменная не объявлена, необходимо присвоить ей значение.

# Ошибка
print(age)  # NameError: name 'age' is not defined

# Исправление
age = 25
print(age)  # Выводит 25

Name is not defined python (ошибка 'nameerror: name is not defined' в python)

Если имя ссылается на функцию или класс из другого модуля, требуется импорт.

# Ошибка
sqrt(16)  # NameError: name 'sqrt' is not defined

# Исправление
from math import sqrt
sqrt(16)  # 4.0

Python return error (ошибка возврата в python)

Типичные сложности:

  • Опечатки в имени переменной (например, user_name вместо username).
  • Использование имени до его присваивания в коде.
  • Забытый импорт модуля (os, sys, re и т.д.).
  • Область видимости: переменная определена внутри функции, а используется снаружи.

Альтернативные подходы к устранению ошибки

Как проверить существование имени перед обращением к нему?

Иногда проще не предотвращать ошибку, а проверить, определено ли имя. Для этого используются встроенные функции globals() и locals() или простое условие с try-except.

# Вариант с проверкой через globals()
if 'my_var' in globals():
    print(my_var)
else:
    print('Переменная не определена')

# Вариант с try-except
try:
    print(non_existent)
except NameError:
    print('Имя не найдено')

Runtime error python (ошибка времени выполнения python)

Проблемы и нюансы:

  • globals() проверяет только глобальную область видимости. Для локальной нужно locals().
  • Использование try-except может скрыть опечатки, затрудняя отладку.

Как присвоить значение по умолчанию, если переменная не определена?

Если переменная может быть не определена, удобно задать ей значение по умолчанию в момент первого использования. Это делается с помощью условной конструкции или метода dict.setdefault.

# Условное присваивание
if 'count' not in locals():
    count = 0

# С использованием словаря вместо отдельных переменных
config = {}
config.setdefault('timeout', 30)
print(config['timeout'])  # 30

Python exit error (ошибка выхода из python)

Возможные затруднения:

  • При большом количестве переменных словарь удобнее, но требует изменения кода.
  • Условное присваивание работает только в глобальной области; в функциях требуется nonlocal или global.

Как использовать динамическое создание имени через словарь или globals()?

Иногда имена переменных формируются программно. Вместо создания отдельных имён лучше использовать словарь или, в крайнем случае, globals().

# Словарь – безопасный способ
variables = {}
for i in range(5):
    variables[f'num_{i}'] = i ** 2
print(variables['num_3'])  # 9

# Не рекомендуется: изменение globals()
globals()['dyn_var'] = 42
print(dyn_var)  # 42

System error python (системная ошибка python)

Риски:

  • Изменение globals() может привести к путанице и трудноуловимым ошибкам.
  • Словарь нагляднее и легче поддаётся отладке.

Как исправить NameError при работе с функциями и их аргументами?

Ошибка часто возникает внутри функций, когда переменная используется до присваивания или не передана как аргумент. Решение - явно передавать все необходимые значения через параметры.

def calculate(rate):
    # rate - параметр, определён в сигнатуре
    result = rate * 100
    return result

# Ошибка: переменная rate не передана в функцию
# calculate()  # TypeError

# Правильно
output = calculate(5.5)
print(output)  # 550.0

Типичная ошибка:

  • Забывают добавить параметр в определение функции.
  • Используют глобальные переменные внутри функции без ключевого слова global.

Как обработать NameError для необязательных импортов?

Если модуль может отсутствовать, используют блок try-except при импорте и назначают запасное значение.

try:
    import pandas as pd
except ImportError:
    pd = None

if pd is not None:
    df = pd.DataFrame()
else:
    print('Библиотека pandas не установлена')

Предостережение:

  • Проверка на None не всегда удобна; можно создать заглушку с тем же интерфейсом.

Дополнительные примеры с кодом и результатами

Пример 1: Использование locals() и globals() для безопасного доступа

Пример
def test():
    a = 10
    b = 20
    # Проверяем наличие переменной 'c' в локальной области
    if 'c' in locals():
        result = a + b + c
    else:
        result = a + b
    return result

print(test())  # 30
30

Пример 2: Динамическое создание атрибутов у объекта с помощью setattr

Пример
class Config:
    pass

config = Config()
name = 'host'
setattr(config, name, 'localhost')
print(config.host)  # localhost
localhost

Пример 3: Обработка NameError при импорте с альтернативным модулем

Пример
try:
    import json
    # Если json недоступен, используем простой парсер
    import simplejson as json
except ImportError:
    import my_custom_json as json

# Теперь json точно определён
print(json.dumps({'key': 'value'}))
{"key": "value"}

Пример 4: Использование exec для динамического исполнения кода с проверкой имён

Пример
code = "z = x + y"
# Перед exec нужно определить x и y, иначе NameError
x, y = 5, 7
locals_before = set(locals())
exec(code)
# Новые имена, добавленные exec, появятся в locals()
if 'z' in locals():
    print('z =', z)  # 12
else:
    print('z не определён')
z = 12

Пример 5: Применение nonlocal для вложенных функций

Пример
def outer():
    message = 'Привет'
    def inner():
        nonlocal message  # без nonlocal будет NameError при присваивании
        message = 'Мир'
    inner()
    print(message)  # Мир, а не Привет

outer()
Мир

Пример 6: Использование __name__ == '__main__' для избежания NameError в скриптах

Пример
# Файл mymodule.py
def helper():
    print('Помощник выполнен')

if __name__ == '__main__':
    helper()  # в этом блоке helper определён
(при запуске скрипта) Помощник выполнен

Пример 7: Использование dataclass с полями по умолчанию

Пример
from dataclasses import dataclass

@dataclass
class Point:
    x: int = 0
    y: int = 0

p = Point()
print(p.x, p.y)  # 0 0
0 0

Пример 8: Проверка наличия имени с помощью hasattr для классов

Пример
class MyClass:
    def __init__(self):
        self.value = 100

obj = MyClass()
if hasattr(obj, 'value'):
    print(obj.value)  # 100
else:
    print('Атрибут не найден')
100

Ошибка 'NameError: name is not defined' в Python - comments

En
Name is not defined python (python)