Perché ottengo AttributeError: l'oggetto 'NoneType' non ha attributo 'qualcosa'?


292

Continuo a ricevere un errore che dice

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

Il codice che ho è troppo lungo per pubblicare qui. Quali scenari generali potrebbero causare questo AttributeError, cosa NoneTypedovrebbe significare e come posso restringere ciò che sta accadendo?


8
Estrarre il più piccolo bit di codice che dimostra il problema. Pubblica quello. Aggiungi printfunzioni (o istruzioni a seconda della versione) per rivelare i valori effettivi che le variabili hanno effettivamente nel codice che presenta questo problema.
S. Lott,

1
'NoneType' significa tipo = Nessuno. Probabilmente stai tentando di accedere a una variabile non dichiarata. Dovresti pubblicare un commento in modo che possiamo aiutarti.
Loïc G.

2
@ LoïcGRENON: "variabile non dichiarata"? In Python? Non ha molto senso. Come si dichiarerebbe una variabile?
S.Lott

2
@ LoïcGRENON - Non in Python non lo è. Si ottiene un'eccezione "referenziata prima dell'assegnazione". Le variabili non sono predefinite None.
gddc,

1
@ LoïcGRENON: hai del codice che dimostra l'idea di cui stai parlando?
S.Lott

Risposte:


287

NoneType significa che invece di un'istanza di qualunque Classe o Oggetto pensi di lavorare, hai effettivamente ottenuto None. Ciò significa in genere che un compito o una funzione richiamati sopra non sono riusciti o hanno restituito un risultato imprevisto.


111

Hai una variabile uguale a Nessuna e stai tentando di accedere ad un attributo di essa chiamato "qualcosa".

foo = None
foo.something = 1

o

foo = None
print foo.something

Entrambi produrranno un AttributeError: 'NoneType'


9
Questo è probabilmente inutile fino a quando non fai notare come le persone potrebbero finire per ottenere Nonequalcosa. È foo = Noneimprobabile che un esplicito sia il problema; sarà foo = something()e non ti rendi conto che something()potrebbe tornare Nonequando non ha successo o il set di risultati era vuoto o altro.
triplo

54

Altri hanno spiegato cos'è NoneTypee un modo comune di finirlo (ovvero, il mancato ritorno di un valore da una funzione).

Un altro motivo comune per Nonecui non ti aspetti che sia l'assegnazione di un'operazione sul posto su un oggetto mutabile. Per esempio:

mylist = mylist.sort()

Il sort()metodo di un elenco ordina l'elenco sul posto, ovvero mylistviene modificato. Ma il valore restituito effettivo del metodo è Nonee non l'elenco ordinato. Quindi hai appena assegnato Nonea mylist. Se la prossima volta provi a fare, diciamo, mylist.append(1)Python ti darà questo errore.


Questa è un'ottima spiegazione - un po 'come ottenere un'eccezione di riferimento null in c #. La variabile non ha alcun valore assegnato ed è None. Thx.
Ken,

17

Il NoneTypeè il tipo del valore None. In questo caso, la variabile lifetimeha un valore di None.

Un modo comune per far sì che ciò accada è chiamare una funzione mancante a return.

Esistono tuttavia un numero infinito di altri modi per impostare una variabile su Nessuno.


1
Non credo abbia lifetimeavuto un valore di None(pre-modifica). Stava cercando di accedere all'attributo a vita di qualcos'altro che era None.
gddc,

13

Considera il codice qui sotto.

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

y = return_something(2)
y.real()

Questo ti darà l'errore

AttributeError: l'oggetto "NoneType" non ha attributo "reale"

Quindi i punti sono i seguenti.

  1. Nel codice, una funzione o un metodo di classe non restituisce nulla o restituisce None
  2. Quindi si tenta di accedere a un attributo dell'oggetto restituito (che è Nessuno), causando il messaggio di errore.

4

Significa l'oggetto a cui stai tentando di accedere None. Noneè una Nullvariabile in Python. Questo tipo di errore si verifica nel tuo codice è qualcosa di simile.

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 ha ragione, ma aggiungendo un esempio molto frequente:

È possibile chiamare questa funzione in una forma ricorsiva. In tal caso, potresti finire con un puntatore nullo o NoneType. In tal caso, è possibile ottenere questo errore. Quindi prima di accedere ad un attributo di quel parametro controlla se non lo è NoneType.


Sì, ok, ma come si fa a controllare?
not2qubit,

if foo == Nessuno:
barribow

if foo is not None:
Gringo Suave,

1

Quando si crea uno stimatore (sklearn), se si dimentica di restituire sé nella funzione di adattamento, si ottiene lo stesso errore.

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: l'oggetto 'NoneType' non ha attributo 'trasforma'?

L'aggiunta return selfalla funzione di adattamento corregge l'errore.


0

È possibile ottenere questo errore dopo aver commentato HTML in un'applicazione Flask. Qui il valore per qual.date_expiry è None:

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

Elimina la riga o correggila:

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

-1

se assegniamo qualcosa di simile al seguente, genererà un errore come "AttributeError: l'oggetto 'NoneType' non ha attributo 'show'"

df1=df.withColumn('newAge',df['Age']).show() 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.