Qu'est-ce qu'un objet 'NoneType'?

87

J'obtiens cette erreur lorsque j'exécute mon script python:

TypeError: cannot concatenate 'str' and 'NoneType' objects

Je suis presque sûr que le «str» signifie une chaîne, mais je ne sais pas ce qu'est un objet «NoneType». Mon script craque sur la deuxième ligne, je sais que la première fonctionne parce que les commandes de cette ligne sont dans mon asa comme je m'y attendais. Au début, j'ai pensé que c'était peut-être parce que j'utilise des variables et des entrées utilisateur dans send_command.

Tout dans 'CAPS' sont des variables, tout dans 'minuscules' est entré à partir des options 'parser.add_option'.

J'utilise pexpect et optparse

send_command(child, SNMPGROUPCMD + group + V3PRIVCMD)
send_command(child, SNMPSRVUSRCMD + snmpuser + group + V3AUTHCMD + snmphmac + snmpauth + PRIVCMD + snmpencrypt + snmppriv)
non sécurisé-IT
la source
2
Nous devons voir plus de code et l'entrée - NoneTyoe signifie que l'une des variables n'a pas été définie
mmmmmm
3
NoneTypeest le type de la valeur singleton None. L'une de vos valeurs n'est pas une chaîne.
Martijn Pieters
Quick & Dirty: mettez chaque terme à concaténer dans str()str (SNMPSRVUSRCMD) + str (snmpuser) + ...
PeterMmm
2
@PeterMmm C'est une idée terrible - le problème se manifestera (peut-être pire) plus tard. Il serait préférable de comprendre pourquoi l' une des variables est Aucune pour commencer.
arshajii

Réponses:

82

NoneTypeest le type de l' Noneobjet, qui est un objet qui n'indique aucune valeur . Noneest la valeur de retour des fonctions qui "ne renvoient rien". C'est également une valeur de retour par défaut courante pour les fonctions qui recherchent quelque chose et peuvent ou non le trouver; par exemple, il est renvoyé re.searchlorsque l'expression régulière ne correspond pas ou dict.getlorsque la clé n'a pas d'entrée dans le dict. Vous ne pouvez pas ajouter Noneà des chaînes ou à d'autres objets.

L'une de vos variables n'est Nonepas une chaîne. Peut-être que vous avez oublié returndans l'une de vos fonctions, ou peut-être que l'utilisateur n'a pas fourni d'option de ligne de commande et optparsevous a donné Nonela valeur de cette option. Lorsque vous essayez d'ajouter Noneà une chaîne, vous obtenez cette exception:

send_command(child, SNMPGROUPCMD + group + V3PRIVCMD)

L'un de groupou SNMPGROUPCMDou V3PRIVCMDa Nonepour valeur.

Burhan Khalid
la source
Merci!! Vous avez raison, l'une de mes options de saisie utilisateur ne prenait pas pour une raison quelconque. J'ai ajouté cela comme un "nom" par rapport à une option et boom, cela a fonctionné. Maintenant, je dois juste savoir pourquoi cela ne prend pas correctement en option, toutes les autres options fonctionnent bien.
insecure-IT
1
"Not set" est un peu vague ... si une variable n'est pas définie et que vous essayez d'effectuer une opération avec elle, vous devriez obtenir un NameError. Il pourrait également être défini, mais égal à None("set to Nothing" = "not set"?), Alors vous pourriez en obtenir TypeError.
Nick T
Fondamentalement (pour les gens de C / Java ici) none = null
Zoe
23

NoneTypeest simplement le type du Nonesingleton:

>>> type(None)
<type 'NoneType'>

À partir du dernier lien ci-dessus:

None

La seule valeur du type NoneType. Noneest fréquemment utilisé pour représenter l'absence de valeur, comme lorsque les arguments par défaut ne sont pas passés à une fonction. Les affectations à Nonesont illégales et génèrent un SyntaxError.

Dans votre cas, il semble que l'un des éléments que vous essayez de concaténer soit None, d'où votre erreur.

arshajii
la source
21

Pour des raisons de programmation défensive, les objets doivent être vérifiés contre la nullité avant utilisation.

if obj is None:

ou

if obj is not None:
Gürol Canbek
la source
2
"is" ne doit être utilisé que si vous en avez besoin. La meilleure programmation défensive est des tests, beaucoup de tests.
Jürgen A. Erhard
2
La programmation défensive est l'une des choses les plus perverses. Si vous trouvez une erreur comme celle-là, cela signifie que vous avez fait une erreur de programmation. Des trucs comme "vérifier la valeur NULL avant utilisation" ne cachent qu'une erreur grave. Vous devriez laisser l'exception être levée. Et n'obligez pas les programmeurs à lancer une exception personnalisée, c'est vraiment compliqué. Que l'erreur naturelle soit lancée. En fait, la programmation défensive est un symptôme que vous devriez utiliser un autre langage.
bzim
J'interroge la base de données via sqlAlchemy. Il n'y a pas de résultat. L'objet renvoyé est Aucun. Ce qui signifie aucun résultat. Il n'y a pas d'erreur. Vous vérifiez si un résultat est aucun, sinon, vous utilisez l'objet de résultat. Rien de mal à ce sujet. La chose la plus perverse de la programmation est le dogmatisme.
unity100
17

Cela signifie que vous essayez de concaténer une chaîne avec quelque chose qui est None.

Aucun est le "nul" de Python et NoneTypeest son type.

Ce code soulèvera le même type d'erreur:

>>> bar = "something"
>>> foo = None
>>> print foo + bar
TypeError: cannot concatenate 'str' and 'NoneType' objects
André Laszlo
la source
2

Dans le message d'erreur, au lieu de vous dire que vous ne pouvez pas concaténer deux objets en affichant leurs valeurs (une chaîne et Nonedans cet exemple), l'interpréteur Python vous le dit en montrant les types des objets que vous avez essayé de concaténer. Le type de chaque chaîne est stralors que le type de l' Noneinstance unique est appelé NoneType.

Vous n'avez normalement pas besoin de vous préoccuper NoneType, mais dans cet exemple, il est nécessaire de le savoir type(None) == NoneType.

Feuermurmel
la source
J'ai un problème très similaire et en essayant de détecter si l'objet est NoneType, votre affirmation ne fonctionne pas pour moi: >>> type(key) <type 'NoneType'> >>> type(key) == NoneType Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'NoneType' is not defined
RuBiCK
2
@RuBiCK NoneTypen'est défini nulle part (à ma connaissance). Si vous voulez vérifier si une valeur est None, utilisez simplement key is None(voir stackoverflow.com/questions/23086383/… ). Sinon, vous pourriez utiliser type(key) == type(None)le même effet.
Feuermurmel
1

Votre erreur se produit en raison de quelque chose comme ceci:
>>> None + "hello world"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'
>>>

L' objet None de Python est à peu près équivalent à null , nil , etc. dans d'autres langages.

Dave
la source
0

Aucune valeur n'a été attribuée à l'une des variables, il s'agit donc d'un NoneType. Vous devrez vous demander pourquoi, c'est probablement une simple erreur de logique de votre part.

SeanOTRS
la source