Почему я получаю AttributeError: у объекта 'NoneType' нет атрибута 'что-то'?


293

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

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

Код, который у меня есть, слишком длинный, чтобы публиковать здесь. Какие общие сценарии могут вызвать это AttributeError, что NoneTypeдолжно означать и как я могу сузить, что происходит?


8
Вытащите наименьший кусок кода, который демонстрирует проблему. Опубликовать это. Добавьте printфункции (или операторы в зависимости от версии), чтобы выявить фактические значения, которые переменные фактически имеют в коде, который имеет эту проблему.
S.Lott

1
NoneType означает тип = Нет. Вы, вероятно, пытаетесь получить доступ к необъявленной переменной. Вы должны опубликовать суть, чтобы мы могли помочь вам.
Лоик Г.

2
@ LoïcGRENON: "необъявленная переменная"? В питоне? Это не имеет особого смысла. Как объявить переменную?
S.Lott

2
@ LoïcGRENON - Не в Python это не так. Вы получаете исключение «ссылка перед назначением». Переменные не по умолчанию None.
GDCD

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

Ответы:


287

NoneType означает, что вместо экземпляра какого-либо Класса или Объекта, с которым вы думаете, вы работаете, вы фактически получите None. Обычно это означает, что вызов или присвоение функции, приведенное выше, завершились неудачно или вернули неожиданный результат.


112

У вас есть переменная, равная None, и вы пытаетесь получить доступ к ее атрибуту, который называется «что-то».

foo = None
foo.something = 1

или

foo = None
print foo.something

Оба приведут к AttributeError: 'NoneType'


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

54

Другие объяснили, что это NoneTypeтакое, и как это обычно делается (то есть, не удается вернуть значение из функции).

Другой распространенной причиной, по Noneкоторой вы не ожидаете, является назначение операции на месте изменяемого объекта. Например:

mylist = mylist.sort()

sort()Метод списка сортирует список на месте, то есть mylistвидоизменяется. Но фактическое возвращаемое значение метода - Noneне отсортированный список. Таким образом , вы только что назначен Noneна mylist. Если вы в следующий раз попытаетесь сделать это, скажем, mylist.append(1)Python выдаст вам эту ошибку.


Это отличное объяснение - вроде как получить исключение нулевой ссылки в c #. Переменная не имеет назначенного значения и имеет значение None .. Thx.
Кен

17

NoneTypeЯвляется типом значения None. В этом случае переменная lifetimeимеет значение None.

Обычный способ добиться этого - вызвать функцию, в которой отсутствует a return.

Однако существует бесконечное множество других способов установить для переменной значение None.


1
Я не думаю, что lifetimeимеет значение None(предварительное редактирование). Он пытался получить доступ к атрибуту жизни чего-то еще, что было None.
GDCD

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:
Баррибоу

if foo is not None:
Гринго Суаве

1

При построении оценщика (sklearn), если вы забыли вернуть self в функции 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' нет атрибута 'transform'?

Добавление return selfв функцию подгонки исправляет ошибку.


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 »не имеет атрибута« show »»

df1=df.withColumn('newAge',df['Age']).show() 
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.