425 votes

Pourquoi est-ce que j'obtiens AttributeError : 'NoneType' object has no attribute 'something' ?

Je continue à obtenir une erreur qui dit

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

Le code que j'ai est trop long pour être affiché ici. Quels sont les scénarios généraux qui pourraient provoquer ce AttributeError Qu'est-ce que c'est ? NoneType et comment je peux réduire ce qui se passe ?

11 votes

Sortez le plus petit bout de code qui démontre le problème. Affichez ça. Ajoutez print (ou déclarations selon la version) pour révéler les valeurs réelles des variables dans le code qui pose problème.

1 votes

NoneType' signifie type = None. Vous essayez probablement d'accéder à une variable non déclarée. Vous devriez poster un gist pour que nous puissions vous aider.

2 votes

@LoïcGRENON : "variable non déclarée" ? En Python ? Cela n'a pas beaucoup de sens. Comment déclarer une variable ?

420voto

g.d.d.c Points 20164

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

136voto

koblas Points 3659

Vous avez une variable égale à None et vous essayez d'accéder à un attribut de cette variable appelé "quelque chose".

foo = None
foo.something = 1

ou

foo = None
print(foo.something)

Les deux donneront un AttributeError: 'NoneType'

21 votes

Cela n'est probablement pas utile tant que vous n'indiquez pas comment les gens pourraient finir par obtenir un None à partir de quelque chose. Un explicite foo = None a peu de chances d'être le problème ; ce sera foo = something() et tu ne réalises pas something() pourrait revenir None quand il ne réussit pas ou que le jeu de résultats est vide ou autre.

0 votes

C'est tout à fait correct. Par exemple, lorsque vous utilisez Django pour développer une application de commerce électronique, vous avez travaillé sur la fonctionnalité du panier et tout semble fonctionner lorsque vous testez la fonctionnalité du panier avec un produit. Puis, dans le backend, vous supprimez le produit enregistré dans le panier. Si vous essayez d'accéder à nouveau à la page du panier, vous rencontrez l'erreur ci-dessus. Une correction appropriée doit être effectuée pour éviter cela.

66voto

kindall Points 60645

D'autres ont expliqué ce que NoneType et une façon courante de l'obtenir (c'est-à-dire l'impossibilité de retourner une valeur à partir d'une fonction).

Une autre raison courante pour laquelle vous avez None là où on ne l'attend pas, c'est l'affectation d'une opération in-place sur un objet mutable. Par exemple :

mylist = mylist.sort()

Le site sort() d'une liste trie la liste in-place, c'est-à-dire, mylist est modifié. Mais la valeur de retour réelle de la méthode est None et non la liste triée. Vous venez donc d'affecter None à mylist . Si vous essayez ensuite de faire, de dire, mylist.append(1) Python vous donnera cette erreur.

1 votes

C'est une excellente explication. C'est un peu comme obtenir une exception de référence nulle en C#. La variable n'a pas de valeur assignée et est nulle Merci.

17voto

S.Lott Points 207588

Le site NoneType est le type de la valeur None . Dans ce cas, la variable lifetime a une valeur de None .

Une manière courante d'obtenir ce résultat est d'appeler une fonction manquant un return .

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

1 votes

Je ne pense pas que lifetime avait une valeur de None (pre-edit). Il essayait d'accéder à la vie attribut de quelque chose d'autre qui était None .

15voto

PHINCY L PIOUS Points 305

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' ne possède pas d'attribut 'real'.

Les points sont donc les suivants.

  1. Dans le code, une fonction ou une méthode de classe ne renvoie rien ou renvoie la valeur None.
  2. Ensuite, vous essayez d'accéder à un attribut de l'objet renvoyé (qui est None), ce qui provoque le message d'erreur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X