Pourquoi est-ce que j'obtiens AttributeError: l'objet 'NoneType' n'a pas d'attribut 'quelque chose'?

292

Je reçois toujours une erreur qui dit

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

Le code que j'ai est trop long pour être affiché ici. Quels scénarios généraux pourraient provoquer cela AttributeError, qu'est-ce qui est NoneTypecensé signifier et comment puis-je réduire ce qui se passe?

Jacob Griffin
la source
8
Retirez le plus petit morceau de code qui illustre le problème. Postez ça. Ajoutez des printfonctions (ou des instructions selon la version) pour révéler les valeurs réelles des variables dans le code qui rencontre ce problème.
S.Lott
1
'NoneType' signifie type = Aucun. Vous essayez probablement d'accéder à une variable non déclarée. Vous devriez publier un résumé pour que nous puissions vous aider.
Loïc
2
@ LoïcGRENON: "variable non déclarée"? En Python? Cela n'a pas beaucoup de sens. Comment déclarer une variable?
S.Lott
2
@ LoïcGRENON - Pas en Python ce n'est pas. Vous obtenez une exception "référencée avant affectation". Les variables ne sont pas définies par défaut sur None.
gddc
1
@ LoïcGRENON: Avez-vous du code qui illustre cette idée dont vous parlez?
S.Lott

Réponses:

287

NoneType signifie qu'au lieu d'une instance de quelque classe ou objet que vous pensez travailler avec, vous avez réellement None. Cela signifie généralement qu'une affectation ou une fonction appelée ci-dessus a échoué ou renvoyé un résultat inattendu.

gddc
la source
111

Vous avez une variable qui est égale à None et vous essayez d'accéder à un attribut de celle-ci appelé «quelque chose».

foo = None
foo.something = 1

ou

foo = None
print foo.something

Les deux donneront une AttributeError: 'NoneType'

koblas
la source
9
Cela est probablement inutile jusqu'à ce que vous indiquiez comment les gens pourraient finir par retirer Nonequelque chose. Il foo = Noneest peu probable qu'un problème explicite soit le problème; ça va se passer foo = something()et vous ne réalisez pas que cela something()pourrait revenir en Nonecas d'échec ou que le jeu de résultats était vide ou autre.
tripleee
54

D'autres ont expliqué ce qu'est NoneTypeet une façon courante de se retrouver avec elle (c.-à-d., L'échec de retourner une valeur d'une fonction).

Une autre raison courante pour Nonelaquelle vous ne vous attendez pas à cela est l'attribution d'une opération sur place sur un objet mutable. Par exemple:

mylist = mylist.sort()

La sort()méthode d'une liste trie la liste en place, c'est-à-dire qu'elle mylistest modifiée. Mais la valeur de retour réelle de la méthode est Noneet non la liste triée. Donc , vous venez d' affecter Noneà mylist. Si vous essayez ensuite de le faire, disons, mylist.append(1)Python vous donnera cette erreur.

gentil
la source
C'est une excellente explication - un peu comme obtenir une exception de référence nulle en c #. La variable n'a pas de valeur affectée et est Aucune. Thx.
Ken
17

Le NoneTypeest le type de la valeur None. Dans ce cas, la variable lifetimea une valeur de None.

Un moyen courant pour que cela se produise est d'appeler une fonction manquant a return.

Il existe cependant un nombre infini d'autres façons de définir une variable sur Aucune.

S.Lott
la source
1
Je ne pense pas avoir lifetimeeu une valeur de None(pré-édition). Il essayait d'accéder à l' attribut à vie de quelque chose d'autre None.
gddc
13

Considérez le code ci-dessous.

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

y = return_something(2)
y.real()

Cela va vous donner l'erreur

AttributeError: l'objet 'NoneType' n'a pas d'attribut 'réel'

Les points sont donc comme ci-dessous.

  1. Dans le code, une fonction ou une méthode de classe ne renvoie rien ou ne renvoie rien
  2. Ensuite, vous essayez d'accéder à un attribut de cet objet renvoyé (qui est Aucun), provoquant le message d'erreur.
PHINCY L PIOUS
la source
4

Cela signifie l'objet auquel vous essayez d'accéder None. Noneest une Nullvariable en python. Ce type d'erreur se produit de votre code est quelque chose comme ça.

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
la source
1

gddc a raison, mais en ajoutant un exemple très fréquent:

Vous pouvez appeler cette fonction sous une forme récursive. Dans ce cas, vous pourriez vous retrouver avec un pointeur nul ou NoneType. Dans ce cas, vous pouvez obtenir cette erreur. Donc, avant d'accéder à un attribut de ce paramètre, vérifiez s'il ne l'est pas NoneType.

barribow
la source
Ouais, ok, mais comment fais-tu ce contrôle?
not2qubit
if foo == None:
barribow
if foo is not None:
Gringo Suave
1

Lors de la construction d'un estimateur (sklearn), si vous oubliez de retourner self dans la fonction d'ajustement, vous obtenez la même erreur.

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'objet 'NoneType' n'a pas d'attribut 'transform'?

L'ajout return selfà la fonction fit corrige l'erreur.

Chiel
la source
0

Vous pouvez obtenir cette erreur si vous avez commenté HTML dans une application Flask. Ici, la valeur de qual.date_expiry est None:

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

Supprimez la ligne ou corrigez-la:

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

si nous attribuons quelque chose comme ci-dessous, cela générera une erreur comme "AttributeError: l'objet 'NoneType' n'a pas d'attribut 'show'"

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