AttributeError: модуль не имеет атрибута в Python

Раздел: Основы Python -> Обработка исключений

Причины и базовый способ обработки

Основной подход состоит в проверке реального пространства имён модуля и приведении импорта к корректному виду. Сбой AttributeError: module has no attribute X означает, что объект модуля существует, но у него нет имени X. Причины: опечатка, неверная версия библиотеки, отсутствие импорта подмодуля, конфликт с локальным файлом, частичная инициализация при циклическом импорте.

Диагностический пример с опечаткой:

import math

print(math.sqr(25))

Client error python (ошибка http-клиента в python)

AttributeError: module 'math' has no attribute 'sqr'

Script not found python (ошибка 'script not found')

Проверка доступных имён:

import math

names = [name for name in dir(math) if 'sqrt' in name]
print(names)
print(math.__file__)

Python exception (исключения в python)

['sqrt']
/usr/lib/python3.11/lib-dynload/math.cpython-311-x86_64-linux-gnu.so

Python errno (обработка ошибки errno в python)

Корректный вызов:

import math

print(math.sqrt(25))

Python no module named pip (ошибка 'no module named pip' в python)

5.0

Python externally managed environment (ошибка externally managed environment в python)

Для необязательного имени применим getattr с запасным значением:

import math

fallback = getattr(math, 'sqr', None)
print(fallback)
print(getattr(math, 'sqrt', lambda x: None)(25))

List out of range python (ошибка indexerror: list index out of range в python)

None
5.0

Python error code 1 (ошибка python с кодом 1)

Ошибка может выглядеть как ModuleNotFoundError, если сам модуль отсутствует. AttributeError говорит об отсутствии именно атрибута. Если локальный файл называется как библиотека, Python может импортировать его вместо установленного пакета. Проверка module.__file__ помогает увидеть источник. При циклическом импорте модуль уже в sys.modules, но ещё не содержит нужное имя.

Как отличить отсутствие модуля от отсутствия атрибута?

Разные исключения указывают на разные уровни сбоя. ImportError и ModuleNotFoundError относятся к импорту модуля, AttributeError относится к обращению к имени внутри уже импортированного модуля.

try:
    import json
    encoder = json.JSONEncoder
except ImportError:
    print('модуль json отсутствует')
except AttributeError:
    print('в модуле json нет JSONEncoder')
else:
    print('класс найден')

Line in module python ошибка (ошибка в строке модуля python)

класс найден

Python codec can t decode byte (ошибка декодирования байтов в python)

Как обработать отсутствующий атрибут без остановки программы?

Функция getattr возвращает значение атрибута или запасной объект. Функция hasattr проверяет наличие имени и перехватывает только AttributeError.

import json

indent = getattr(json, 'indent', 2)
print(indent)
print(hasattr(json, 'loads'))
print(hasattr(json, 'loadz'))

Attributeerror module has no attribute python (attributeerror: модуль не имеет атрибута в python)

2
True
False

ошибка типа данных python (ошибка типа данных в python)

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

Некоторые пакеты не загружают вложенные модули при импорте верхнего уровня. В таком случае требуется явный импорт подмодуля.

import xml

print(hasattr(xml, 'etree'))
import xml.etree.ElementTree
print(hasattr(xml, 'etree'))
print(xml.etree.ElementTree.Element('root').tag)

C python exceptions (исключения в c и python)

False
True
root

Module importerror python (ошибка импорта модуля importerror в python)

Как обнаружить конфликт имени локального файла с библиотекой?

Локальный файл с именем установленного модуля может перекрыть библиотеку. Атрибут __file__ показывает фактический источник импорта.

import random

print(random.__file__)
print(hasattr(random, 'randint'))
print(random.randint(1, 10))

Python get traceback (получение трассировки стека в python)

/home/user/project/random.py
False
AttributeError: module 'random' has no attribute 'randint'

No installed python found (python не найден в системе)

Корректное действие состоит в переименовании локального файла и удалении старого кэша __pycache__.

Как учесть различие версий библиотеки?

Разные версии пакетов могут содержать разные имена. Проверка метаданных и getattr помогает выбрать доступный вызов.

import importlib.metadata as md

version = md.version('requests')
print(version)
import requests
print(hasattr(requests, 'get'))
print(hasattr(requests, 'request'))

Python ignore error (игнорирование ошибок python)

2.31.0
True
True

Python traceback using (трассировка ошибок в python)

import json

def encode(data):
    encoder = getattr(json, 'JSONEncoder', None)
    if encoder is None:
        raise RuntimeError('нет JSONEncoder')
    return encoder().encode(data)

print(encode({'a': 1}))

Python pip not found (ошибка 'pip not found' в python)

{"a": 1}

Unable to locate package python (ошибка 'unable to locate package' в python)

Как реализовать динамические атрибуты модуля через __getattr__?

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

# dynamic_mod.py
def __getattr__(name):
    if name == 'answer':
        return 42
    raise AttributeError(f'module dynamic_mod has no attribute {name}')

# main.py
import dynamic_mod
print(dynamic_mod.answer)
print(dynamic_mod.unknown)

File not found python (ошибка filenotfounderror в python)

42
AttributeError: module dynamic_mod has no attribute unknown

Python modulenotfounderror no module named (ошибка modulenotfounderror)

Как перезагрузить модуль после правки исходника?

Функция importlib.reload обновляет код модуля в текущем процессе. Старые ссылки на объекты могут сохранять прежнее состояние.

import importlib
import mylib

print(mylib.value)
importlib.reload(mylib)
print(mylib.value)

ошибка компиляции python (ошибка компиляции (синтаксиса) в python)

1
2

Расширенные примеры диагностики и обхода

Опечатка в имени стандартного модуля

Пример
import statistics

data = [1, 2, 3, 4]
print(statistics.medain(data))
AttributeError: module 'statistics' has no attribute 'medain'. Did you mean: 'median'?
Пример
import statistics

data = [1, 2, 3, 4]
print(statistics.median(data))
2.5

Явный импорт вложенного модуля

Пример
import xml
print(hasattr(xml, 'etree'))
try:
    print(xml.etree.ElementTree.Element('root').tag)
except AttributeError as err:
    print(type(err).__name__, err)
False
AttributeError module 'xml' has no attribute 'etree'
Пример
import xml
import xml.etree.ElementTree
print(hasattr(xml, 'etree'))
print(xml.etree.ElementTree.Element('root').tag)
True
root

Локальный файл перекрывает библиотеку

Пример
# Файл random.py в каталоге запуска
# main.py
import random
print(random.__file__)
print(random.randint(1, 10))
/project/random.py
AttributeError: module 'random' has no attribute 'randint'
Пример
# Файл больше не называется random.py
import random
print(random.__file__)
print(random.randint(1, 10))
/usr/lib/python3.11/random.py
7

Циклический импорт и частичная инициализация

Пример
# a.py
import b

def value():
    return 10

print(b.result)
Пример
# b.py
import a
result = a.value()
AttributeError: partially initialized module 'a' has no attribute 'value' (most likely due to a circular import)
Пример
# a.py
import b

def value():
    return 10

print(b.use_a())
Пример
# b.py
def use_a():
    import a
    return a.value()
10

Запасное значение через getattr

Пример
import platform

processor = getattr(platform, 'processor', lambda: 'неизвестно')
print(processor())
print(getattr(platform, 'python_implementation', lambda: 'нет')())
x86_64
CPython

Динамический импорт и обращение к атрибуту

Пример
import importlib

module_name = 'json'
attr_name = 'dumps'
module = importlib.import_module(module_name)
func = getattr(module, attr_name, None)
print(func({'ok': True}))
{"ok": true}

Модульный __getattr__ и __dir__

Пример
# config.py
def __getattr__(name):
    if name == 'debug':
        return False
    if name.startswith('db_'):
        return name.upper()
    raise AttributeError(f'module config has no attribute {name}')

def __dir__():
    return ['debug', 'db_host']

# main.py
import config
print(config.debug)
print(config.db_host)
try:
    print(config.missing)
except AttributeError as err:
    print(type(err).__name__, err)
print(dir(config))
False
DB_HOST
AttributeError module config has no attribute missing
['db_host', 'debug']

Экспорт через __all__ и импорт звёздочкой

Пример
# tools.py
__all__ = ['run']

def run():
    return 'run'

def stop():
    return 'stop'

# main.py
from tools import *
print(run())
try:
    print(stop())
except NameError as err:
    print(type(err).__name__, err)
run
NameError name 'stop' is not defined

Обёртка совместимости разных версий

Пример
import json

def to_json(value):
    dumps = getattr(json, 'dumps', None)
    if dumps is None:
        raise AttributeError('модуль json не содержит dumps')
    return dumps(value, ensure_ascii=False)

print(to_json({'город': 'Москва'}))
{"город": "Москва"}

Проверка метаданных установленного пакета

Пример
import importlib.metadata as md

try:
    version = md.version('requests')
    print('version:', version)
except md.PackageNotFoundError:
    print('пакет requests не установлен')

import requests
print(hasattr(requests, 'get'))
print(hasattr(requests, 'post'))
version: 2.31.0
True
True

Перезагрузка модуля после изменения файла

Пример
import importlib
import settings

print(settings.MODE)
importlib.reload(settings)
print(settings.MODE)
dev
prod

Проверка sys.modules и фактического имени

Пример
import sys
import math

module = sys.modules['math']
print(module is math)
print(getattr(module, 'sqrt', 'нет'))
print(getattr(module, 'sqr', 'нет'))
True

нет

Исключение в пользовательском __getattr__

Пример
class Proxy:
    def __getattr__(self, name):
        raise AttributeError(f'Proxy не имеет атрибута {name}')

p = Proxy()
try:
    p.data
except AttributeError as err:
    print(type(err).__name__, err)
AttributeError Proxy не имеет атрибута data

Импорт отсутствующего имени через from

Пример
try:
    from math import sqr
except ImportError as err:
    print(type(err).__name__, err)
ImportError cannot import name 'sqr' from 'math' (/usr/lib/python3.11/lib-dynload/math.cpython-311-x86_64-linux-gnu.so)

Прямое обращение math.sqr даёт AttributeError, а from math import sqr даёт ImportError. Различие полезно при обработке.

Пример
import math
try:
    print(math.sqr(4))
except AttributeError as err:
    print(type(err).__name__, err)
AttributeError module 'math' has no attribute 'sqr'

AttributeError: модуль не имеет атрибута в Python - comments

En
Attributeerror module has no attribute python (python)