Dlaczego dostaję AttributeError: Obiekt „NoneType” nie ma atrybutu „coś”?


292

Ciągle pojawia się komunikat o błędzie

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

Kod, który mam, jest za długi, aby opublikować tutaj. Jakie spowodowałyby to ogólne scenariusze AttributeError, co to NoneTypeznaczy i jak mogę zawęzić to, co się dzieje?


8
Wyciągnij najmniejszy fragment kodu, który pokazuje problem. Opublikuj to. Dodaj printfunkcje (lub instrukcje w zależności od wersji), aby ujawnić rzeczywiste wartości zmiennych w kodzie, który ma ten problem.
S.Lott,

1
„NoneType” oznacza typ = Brak. Prawdopodobnie próbujesz uzyskać dostęp do niezadeklarowanej zmiennej. Powinieneś opublikować listę, abyśmy mogli Ci pomóc.
Loïc G.

2
@ LoïcGRENON: „niezadeklarowana zmienna”? W Pythonie? To nie ma większego sensu. Jak deklarować zmienną?
S.Lott,

2
@ LoïcGRENON - Nie w Pythonie, nie ma. Otrzymujesz wyjątek „przywołany przed przypisaniem”. Zmienne nie są domyślnie ustawione na None.
gddc

1
@ LoïcGRENON: Czy masz kod, który demonstruje ten pomysł, o którym mówisz?
S.Lott,

Odpowiedzi:


287

NoneType oznacza, że ​​zamiast wystąpienia jakiejkolwiek klasy lub obiektu, z którym myślisz, że pracujesz, faktycznie masz None. Zazwyczaj oznacza to, że przywołanie lub wywołanie funkcji powyżej nie powiodło się lub zwróciło nieoczekiwany wynik.


111

Masz zmienną, która jest równa None i próbujesz uzyskać dostęp do jej atrybutu zwanego „czymś”.

foo = None
foo.something = 1

lub

foo = None
print foo.something

Oba dadzą AttributeError: 'NoneType'


9
Jest to prawdopodobnie nieprzydatne, dopóki nie wskażesz, jak ludzie mogą w końcu Nonecoś z tego wyciągnąć. Jest foo = Nonemało prawdopodobne, aby wyraźny był problem; tak się stanie foo = something()i nie zdajesz sobie sprawy, something()że może powrócić, Nonegdy się nie powiedzie lub zestaw wyników będzie pusty lub cokolwiek.
tripleee

54

Inni wyjaśnili, co to NoneTypejest i powszechny sposób, aby z tym skończyć (tj. Nie zwrócić wartości z funkcji).

Innym częstym powodem, dla Nonektórego nie spodziewasz się, jest przypisanie operacji na miejscu na obiekcie zmiennym. Na przykład:

mylist = mylist.sort()

sort()Metoda listy sortuje listy na miejscu, to znaczy mylistjest modyfikowany. Ale rzeczywista wartość zwracana przez metodę Nonenie jest sortowana na liście. Więc po prostu przypisany Nonedo mylist. Jeśli spróbujesz to zrobić, powiedzmy, mylist.append(1)Python wyświetli ten błąd.


To świetne wyjaśnienie - coś w rodzaju uzyskania wyjątku odniesienia zerowego w języku c #. Zmienna nie ma przypisanej wartości i ma wartość None .. Thx.
Ken

17

Jest NoneTypeto typ wartości None. W tym przypadku zmienna lifetimema wartość None.

Częstym sposobem, aby tak się stało, jest wywołanie funkcji, w której brakuje a return.

Istnieje jednak nieskończona liczba innych sposobów ustawienia zmiennej na Brak.


1
Nie sądzę, żeby lifetimemiał wartość None(pre-edit). Próbował uzyskać dostęp do atrybutu „ lifetime ” czegoś innego None.
gddc

13

Rozważ poniższy kod.

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

y = return_something(2)
y.real()

To da ci błąd

AttributeError: Obiekt „NoneType” nie ma atrybutu „real”

Więc punkty są jak poniżej.

  1. W kodzie funkcja lub metoda klasy nic nie zwraca ani nie zwraca None
  2. Następnie próbujesz uzyskać dostęp do atrybutu tego zwróconego obiektu (który jest Brak), co powoduje wyświetlenie komunikatu o błędzie.

4

Oznacza obiekt, do którego próbujesz uzyskać dostęp None. Nonejest Nullzmienną w pythonie. Ten rodzaj błędu występuje w twoim kodzie jest mniej więcej taki.

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 ma rację, ale dodaje bardzo częsty przykład:

Możesz wywołać tę funkcję w formie rekurencyjnej. W takim przypadku możesz skończyć na zerowym wskaźniku lub NoneType. W takim przypadku możesz otrzymać ten błąd. Dlatego przed uzyskaniem dostępu do atrybutu tego parametru sprawdź, czy tak nie jest NoneType.


Tak, ok, ale jak to zrobić?
not2qubit

if foo == Brak:
barribow

if foo is not None:
Gringo Suave

1

Podczas budowania estymatora (sklearn), jeśli zapomnisz zwrócić siebie w funkcji dopasowania, pojawi się ten sam błąd.

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: Obiekt „NoneType” nie ma atrybutu „transform”?

Dodanie return selfdo funkcji dopasowania naprawia błąd.


0

Ten błąd można uzyskać, skomentując kod HTML w aplikacji Flask. Tutaj wartość parametru Qual.date_expiry wynosi None:

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

Usuń linię lub napraw ją:

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

-1

jeśli przypiszemy coś takiego jak poniżej, zwróci błąd jako „AttributeError: Obiekt„ NoneType ”nie ma atrybutu„ show ””

df1=df.withColumn('newAge',df['Age']).show() 
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.