Чому я отримую AttributeError: об’єкт "NoneType" не має атрибута "щось"?


292

Я продовжую отримувати помилку, яка говорить

AttributeError: 'NoneType' object has no attribute 'something'

Код у мене занадто довгий, щоб розміщувати тут. Які загальні сценарії можуть спричинити це AttributeError, що NoneTypeмає означати і як можна звузити те, що відбувається?


8
Витягніть найменший шматочок коду, який демонструє проблему. Опублікуйте це. Додайте printфункції (або заяви залежно від версії), щоб виявити фактичні значення, які насправді мають змінні в коді, який має цю проблему.
С.Лотт

1
Середній тип "NoneType" = Немає. Ви, ймовірно, намагаєтесь отримати доступ до незадекларованої змінної. Ви повинні опублікувати суть, щоб ми могли вам допомогти.
Loïc G.

2
@ LoïcGRENON: "незадекларована змінна"? У Python? Це не має особливого сенсу. Як можна оголосити змінну?
S.Lott

2
@ LoïcGRENON - Не в Python це не так. Ви отримуєте виняток "посилання перед призначенням". Змінні не за замовчуванням None.
gddc

1
@ LoïcGRENON: У вас є якийсь код, який демонструє цю ідею, про яку ви говорите?
S.Lott

Відповіді:


287

NoneType означає, що замість екземпляра будь-якого класу чи об’єкта, на який ви думаєте, з ким працюєте, ви насправді отримали None. Зазвичай це означає, що виклик призначення або функції вище невдалий або повернув несподіваний результат.


111

У вас є змінна, що дорівнює None, і ви намагаєтеся отримати доступ до її атрибуту, який називається "щось".

foo = None
foo.something = 1

або

foo = None
print foo.something

Обидва дадуть результат AttributeError: 'NoneType'


9
Це, мабуть, не корисно, поки ви не вкажете, як люди можуть у кінцевому підсумку Noneвийти з чогось. Явна foo = Noneнавряд чи буде проблемою; це буде, foo = something()і ви не розумієте, що something()може повернутися, Noneколи це не вдасться, або набір результатів порожній чи будь-який інший.
трійка

54

Інші пояснили, що NoneTypeтаке, і звичайний спосіб закінчення з ним (тобто, неповернення значення з функції).

Ще одна поширена причина, по Noneякій ви не очікуєте, це призначення операції на місці над об'єктом, що змінюється. Наприклад:

mylist = mylist.sort()

sort()Метод списку сортує список на місці, тобто mylistвидозмінюється. Але фактичне повернене значення методу є, Noneа не список відсортований. Таким чином , ви тільки що призначений Noneна mylist. Якщо ви наступного разу спробуєте зробити, скажімо, mylist.append(1)Python дасть вам цю помилку.


Це чудове пояснення - начебто отримання нульового посилання на виключення в c #. Змінна не має присвоєного значення і не має значення .. Thx.
Кен

17

Значення NoneTypeтипу - це значення None. У цьому випадку змінна lifetimeмає значення None.

Поширений спосіб цього статися - викликати функцію, відсутню a return.

Однак існує нескінченна кількість інших способів встановити змінну в None.


1
Я не думаю, що він lifetimeмав значення None(попереднє редагування). Він намагався отримати довічний атрибут чогось іншого, що було None.
gddc

13

Розглянемо код нижче.

def return_something(someint):
 if  someint > 5:
    return someint

y = return_something(2)
y.real()

Це призведе до помилки

AttributeError: У об’єкта 'NoneType' немає атрибута 'real'

Тож бали як нижче.

  1. У коді функція або метод класу нічого не повертає або не повертає None
  2. Потім ви намагаєтеся отримати доступ до атрибуту цього повернутого об'єкта (який не має значення), викликаючи повідомлення про помилку.

4

Це означає, що об’єкт, до якого ви намагаєтесь отримати доступ None. Noneє Nullзмінною в python. Цей тип помилок трапляється де для вашого коду, це щось подібне.

x1 = None
print(x1.something)

#or

x1 = None
x1.someother = "Hellow world"

#or
x1 = None
x1.some_func()

# you can avoid some of these error by adding this kind of check
if(x1 is not None):
    ... Do something here
else:
    print("X1 variable is Null or None")

1

gddc вірно, але додаючи дуже частий приклад:

Ви можете назвати цю функцію в рекурсивній формі. У такому випадку ви можете виявитись під нульовим вказівником або NoneType. У такому випадку ви можете отримати цю помилку. Тому перш ніж отримати доступ до атрибуту цього параметра, перевірте, чи він не є NoneType.


Так, добре, але як це зробити?
not2qubit

if foo == None:
barribow

if foo is not None:
Gringo Suave

1

Створюючи оцінювач (sklearn), якщо ви забудете повернути себе у функції fit, ви отримаєте ту ж помилку.

class ImputeLags(BaseEstimator, TransformerMixin):
    def __init__(self, columns):
        self.columns = columns

    def fit(self, x, y=None):
        """ do something """

    def transfrom(self, x):
        return x

AttributeError: У об’єкта 'NoneType' немає атрибута 'трансформувати'?

Додавання return selfфункції fit виправляє помилку.


0

Ви можете отримати цю помилку, прокоментувавши HTML у програмі Flask. Тут значення для qual.date_expiry немає:

   <!-- <td>{{ qual.date_expiry.date() }}</td> -->

Видаліть рядок або виправте:

<td>{% if qual.date_attained != None %} {{ qual.date_attained.date() }} {% endif %} </td>

-1

якщо ми призначимо щось на кшталт наведеного нижче, воно призведе до помилки як "AttributeError:" NoneType "об'єкт не має атрибута" показати ""

df1=df.withColumn('newAge',df['Age']).show() 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.