Вы увидели ошибку Python AttributeError при написании своей программы и не знаете, как ее исправить? Этот урок даст ответ на этот вопрос.
Если вы только начинаете работать с Python, вы наверняка сталкивались с множеством различных ошибок Python. Ошибка Python AttributeError является очень распространенным типом ошибки.
Python AttributeError — это тип исключения, которое возникает, когда ваша программа Python пытается получить доступ к атрибуту, которого нет в переменной/объекте. Описание ошибки атрибута сообщает вам конкретную строку кода, тип переменной и атрибут, вызывающие ошибку. Иногда сообщение об ошибке также предлагает потенциальное исправление.
Если вы новичок в языке программирования Python, сейчас вы, возможно, не знаете, что делать с этой ошибкой.
После прочтения этого руководства вы будете знать, как исправить AttributeError в вашем коде Python.
Давайте узнаем больше об AttributeError в Python!
Что такое Python AttributeError?
Ошибка Python AttributeError возникает, когда вы пытаетесь использовать атрибут для переменной типа, который не поддерживает этот атрибут. Например, вы пытаетесь вызвать метод для строки, а этот метод не поддерживается типом данных строки. Метод представляет функциональность, предоставляемую заданным типом данных Python или объектом (например, строкой, целым числом, логическим значением).
И существует ли универсальный подход к устранению неполадок и исправлению Python AttributeError?
Чтобы исправить ошибку Python AttributeError в вашей программе, вам нужно определить переменную, вызывающую ошибку. Трассировка ошибки поможет вам определить основную причину этого типа ошибки, поскольку она включает строку кода, где происходит ошибка. Трассировка также сообщит вам имя недопустимого атрибута, используемого в вашей программе.
Проще говоря, ошибка Python AttributeError возникает, когда:
- Вы вызываете атрибут переменной (используя точечную нотацию).
- Этот атрибут не существует для данной переменной/объекта.
Давайте рассмотрим два примера, которые покажут вам, почему возникает ошибка AttributeError, и какие действия можно предпринять для ее устранения.
Как исправить AttributeError в Python: у объекта ‘int’ нет атрибута
Давайте рассмотрим пример ошибки атрибута при работе с целым числом в Python.
Мы создадим целочисленную переменную, а затем попытаемся прибавить к ней другое целое число, используя атрибут, не поддерживаемый типом данных int.
number = 5
total = number.add(4)
print("The total is", total)
Попробуйте выполнить этот код, вы увидите следующее исключение AttributeError:
Traceback (most recent call last):
File "/opt/codefathertech/tutorials/attribute_error.py", line 2, in <module>
total = number.add(4)
AttributeError: 'int' object has no attribute 'add'
Ошибка атрибута говорит о том, что объект «int» (другими словами, целое число) не имеет атрибута «add». Это означает, что метод .add()
(метод — это тип функции) не предоставляется целым числом в Python.
Трассировка говорит вам, что:
- Ошибка произошла в строке 2 кода (он даже показывает вам содержимое этой строки).
- Это вызвано атрибутом «add», вызываемым для переменной «int» (объекта).
Используя эти две информации, вы сразу увидите, что переменная, на которой следует сосредоточиться, — это number, а код, вызывающий ошибку, — number.add(4)
.
Итак, как мы можем исправить эту ошибку?
Просто удалите .add(4)
и используйте знак плюс для вычисления суммы двух чисел. Мы будем использовать оператор плюс +, который поддерживается переменной типа integer.
Вот правильный код:
number = 5
total = number + 4
print("The total is", total)
[output]
The total is 9
Вы видите, что на этот раз ошибки атрибута нет и результат правильный.
Как исправить AttributeError в Python: у объекта ‘str’ нет атрибута
Давайте рассмотрим еще один пример исключения AttributeError, возникающего со строкой Python.
Представьте, что вы хотите преобразовать каждый отдельный символ в сообщении (строковый тип данных) в верхний регистр. Вы знаете, что есть способ сделать это в Python, но вы не помните, как именно.
Поэтому вы пытаетесь использовать точечную нотацию, за которой следует to_upper()
.
message = "Let's cause an attribute error in Python"
print(message.to_upper())
Вот какая ошибка у вас возникает.
Traceback (most recent call last):
File "/opt/codefathertech/tutorials/tempCodeRunnerFile.py", line 2, in <module>
print(message.to_upper())
AttributeError: 'str' object has no attribute 'to_upper'. Did you mean: 'isupper'?
Интерпретатор Python выдает AttributeError, потому что объект «str
» (другими словами, строка) не имеет атрибута «to_upper
». Python также предполагает, что, возможно, мы хотели вместо этого использовать «isupper
».
Ошибка также сообщает вам, что строка кода, вызывающая эту ошибку, — это строка 2, и показывает вам код, вызывающий ошибку: «print(message.to_upper())
».
Чтобы исправить эту ошибку, необходимо заменить метод «to_upper()
» правильным методом, который предоставляет строка Python для преобразования строки в верхний регистр.
Как найти правильный метод?
Один из способов — ввести точку (.) после имени переменной и найти правильный метод в списке методов, предложенных вашей IDE (например, Visual Studio Code или PyCharm).
Другой вариант — посмотреть официальную документацию Python по строковым методам. Если вы не знаете, что искать, возможно, вы ищете «to uppercase
» на этой странице. Это перенесет вас в раздел «str.upper()» этой страницы.
Давайте обновим наш код и будем использовать метод upper()
вместо to_upper()
.
message = "Let's cause an attribute error in Python"
print(message.upper())
[output]
LET'S CAUSE AN ATTRIBUTE ERROR IN PYTHON
Теперь вывод правильный, а исходное сообщение преобразовано в верхний регистр.
Как проверить, какие атрибуты существуют в объекте Python?
Мы увидели, что вы можете использовать свою IDE или официальную документацию Python, чтобы определить правильные атрибуты, которые следует использовать в ваших программах Python при работе с переменной (или любым объектом Python).
Существует быстрый способ определить все атрибуты, предоставляемые переменной в вашей программе Python. Вы можете использовать встроенную функцию Python dir()
. Вызовите эту функцию и передайте ей переменную. В результате вы получите список атрибутов, доступных для этой переменной.
Чтобы увидеть, как это работает, откройте оболочку Python, создайте строку и вызовите функцию dir()
, передав ей строковую переменную.
>>> message = "test message"
>>> dir(message)
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'removeprefix', 'removesuffix', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
В выходных данных функции dir()
вы также можете увидеть метод upper()
, который мы использовали ранее в этом руководстве для исправления AttributeError.
Заключение урока по ошибкам атрибутов
В этом уроке по Python мы увидели, что делать, если выполнение программы завершается ошибкой AttributeError.
Теперь вы знаете:
- почему возникает эта ошибка/исключение: вы вызываете атрибут, который не поддерживается переменной/объектом, для которого вы его вызываете.
- где найти более подробную информацию об AttributeError: трассировка Python сообщает строку кода, вызывающую ошибку, тип переменной и вызванный атрибут.
- как исправить AttributeError: используйте IDE, встроенную функцию dir() или официальную документацию Python, чтобы определить правильный атрибут (метод), который следует использовать.
Молодец! Теперь вы можете исправить ошибку, которую видите в своей программе, и продолжить разработку!