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?


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.


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'


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.


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.


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.

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")

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.


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.


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>

-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() 
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.