Warum erhalte ich AttributeError: Das Objekt 'NoneType' hat kein Attribut 'etwas'?

292

Ich bekomme immer wieder einen Fehler, der besagt

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

Der Code, den ich habe, ist zu lang, um hier zu posten. Welche allgemeinen Szenarien würden dies verursachen AttributeError, was NoneTypesoll bedeuten und wie kann ich eingrenzen, was los ist?

Jacob Griffin
quelle
8
Ziehen Sie den kleinsten Code heraus, der das Problem demonstriert. Poste das. Fügen Sie printFunktionen (oder Anweisungen je nach Version) hinzu, um die tatsächlichen Werte anzuzeigen, die Variablen tatsächlich in dem Code haben, bei dem dieses Problem auftritt.
S.Lott
1
'NoneType' bedeutet Typ = Keine. Sie versuchen wahrscheinlich, auf eine nicht deklarierte Variable zuzugreifen. Sie sollten eine Zusammenfassung veröffentlichen, damit wir Ihnen helfen können.
Loïc G.
2
@ LoïcGRENON: "nicht deklarierte Variable"? In Python? Das macht nicht viel Sinn. Wie würde man eine Variable deklarieren?
S.Lott
2
@ LoïcGRENON - Nicht in Python ist es nicht. Sie erhalten eine Ausnahme "Vor Zuweisung referenziert". Variablen sind nicht standardmäßig None.
GDDC
1
@ LoïcGRENON: Haben Sie einen Code, der diese Idee demonstriert, von der Sie sprechen?
S.Lott

Antworten:

287

NoneType bedeutet, dass Sie anstelle einer Instanz einer Klasse oder eines Objekts, mit der Sie arbeiten, tatsächlich arbeiten None. Dies bedeutet normalerweise, dass eine Zuweisung oder ein Funktionsaufruf oben fehlgeschlagen ist oder ein unerwartetes Ergebnis zurückgegeben hat.

gddc
quelle
111

Sie haben eine Variable, die gleich None ist, und Sie versuchen, auf ein Attribut mit dem Namen "etwas" zuzugreifen.

foo = None
foo.something = 1

oder

foo = None
print foo.something

Beide ergeben eine AttributeError: 'NoneType'

Koblas
quelle
9
Dies ist wahrscheinlich nicht hilfreich, bis Sie darauf hinweisen, wie Menschen möglicherweise Noneetwas herausholen. Ein expliziter foo = Noneist wahrscheinlich nicht das Problem; es wird sein foo = something()und Sie wissen nicht, dass something()es zurückkehren könnte, Nonewenn es nicht erfolgreich ist oder die Ergebnismenge leer war oder was auch immer.
Tripleee
54

Andere haben erklärt, was NoneTypeist und wie man am Ende damit endet (dh wenn ein Wert von einer Funktion nicht zurückgegeben wird).

Ein weiterer häufiger Grund, den Sie Nonenicht erwarten, ist die Zuweisung einer In-Place-Operation für ein veränderliches Objekt. Zum Beispiel:

mylist = mylist.sort()

Die sort()Methode einer Liste sortiert die Liste an Ort und Stelle, dh sie mylistwird geändert. Der tatsächliche Rückgabewert der Methode ist jedoch Noneund nicht die Liste sortiert. So haben Sie gerade zugewiesen Nonezu mylist. Wenn Sie dies beispielsweise das nächste Mal versuchen, gibt mylist.append(1)Python diesen Fehler aus.

irgendwie
quelle
Dies ist eine großartige Erklärung - ähnlich wie das Abrufen einer Nullreferenzausnahme in c #. Die Variable hat keinen zugewiesenen Wert und ist None .. Thx.
Ken
17

Das NoneTypeist der Typ des Wertes None. In diesem Fall hat die Variable den lifetimeWert None.

Ein üblicher Weg, dies zu erreichen, besteht darin, eine Funktion aufzurufen, bei der a fehlt return.

Es gibt jedoch unendlich viele andere Möglichkeiten, eine Variable auf Keine zu setzen.

S.Lott
quelle
1
Ich glaube nicht, lifetimehatte einen Wert von None(Pre-Edit). Er versucht , die Lebensdauer für den Zugriff auf Attribut von etwas anderes , das war None.
GDDC
13

Betrachten Sie den folgenden Code.

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

y = return_something(2)
y.real()

Dies wird Ihnen den Fehler geben

AttributeError: Das Objekt 'NoneType' hat kein Attribut 'real'.

Die Punkte sind also wie folgt.

  1. Im Code gibt eine Funktion oder Klassenmethode nichts zurück oder gibt keine zurück
  2. Anschließend versuchen Sie, auf ein Attribut dieses zurückgegebenen Objekts (das None ist) zuzugreifen, was die Fehlermeldung verursacht.
PHINCY L PIOUS
quelle
4

Dies bedeutet das Objekt, auf das Sie zugreifen möchten None. Noneist eine NullVariable in Python. Diese Art von Fehler tritt auf, wenn Ihr Code so etwas ist.

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")
M. Hamza Rajput
quelle
1

gddc ist richtig, fügt aber ein sehr häufiges Beispiel hinzu:

Sie können diese Funktion in rekursiver Form aufrufen. In diesem Fall könnten Sie am Nullzeiger oder landen NoneType. In diesem Fall können Sie diesen Fehler erhalten. Überprüfen Sie daher vor dem Zugriff auf ein Attribut dieses Parameters, ob dies nicht der Fall ist NoneType.

Barribow
quelle
Ja, ok, aber wie machst du das?
not2qubit
if foo == Keine:
Barribow
if foo is not None:
Gringo Suave
1

Wenn Sie beim Erstellen eines Schätzers (sklearn) vergessen, sich selbst in der Anpassungsfunktion zurückzugeben, wird der gleiche Fehler angezeigt.

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: Das Objekt 'NoneType' hat kein Attribut 'transform'?

Das Hinzufügen return selfzur Anpassungsfunktion behebt den Fehler.

Chiel
quelle
0

Sie können diesen Fehler erhalten, wenn Sie HTML in einer Flask-Anwendung auskommentiert haben. Hier ist der Wert für qual.date_expiry None:

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

Löschen Sie die Zeile oder reparieren Sie sie:

<td>{% if qual.date_attained != None %} {{ qual.date_attained.date() }} {% endif %} </td>
Jeremy Thompson
quelle
-1

Wenn wir etwas wie das Folgende zuweisen, wird der Fehler als "AttributeError: 'NoneType' Objekt hat kein Attribut 'show'" ausgegeben.

df1=df.withColumn('newAge',df['Age']).show() 
BigData-Guru
quelle