Was ist ein 'NoneType'-Objekt?

87

Ich erhalte diese Fehlermeldung, wenn ich mein Python-Skript ausführe:

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

Ich bin mir ziemlich sicher, dass 'str' string bedeutet, aber ich weiß nicht, was ein 'NoneType'-Objekt ist. Mein Skript geht in der zweiten Zeile aus, ich weiß, dass das erste funktioniert, weil die Befehle aus dieser Zeile in meiner ASA sind, wie ich es erwarten würde. Zuerst dachte ich, es könnte daran liegen, dass ich Variablen und Benutzereingaben in send_command verwende.

Alles in 'CAPS' sind Variablen, alles in 'Kleinbuchstaben' wird über die Optionen 'parser.add_option' eingegeben.

Ich benutze pexpect und optparse

send_command(child, SNMPGROUPCMD + group + V3PRIVCMD)
send_command(child, SNMPSRVUSRCMD + snmpuser + group + V3AUTHCMD + snmphmac + snmpauth + PRIVCMD + snmpencrypt + snmppriv)
unsichere IT
quelle
2
Wir müssen mehr Code und die Eingabe sehen - NoneTyoe bedeutet, dass eine der Variablen nicht gesetzt wurde
mmmmmm
3
NoneTypeist der Typ des Singleton-Werts None. Einer Ihrer Werte ist keine Zeichenfolge.
Martijn Pieters
Quick & Dirty: str()Setzen Sie jeden Begriff in str (SNMPSRVUSRCMD) + str (snmpuser) + ...
PeterMmm
2
@PeterMmm Das ist eine schreckliche Idee - das Problem wird sich später (vielleicht noch schlimmer) manifestieren. Es wäre besser herauszufinden, warum eine der Variablen zunächst Keine ist.
Arshajii

Antworten:

82

NoneTypeist der Typ für das NoneObjekt, bei dem es sich um ein Objekt handelt, das keinen Wert angibt . Noneist der Rückgabewert von Funktionen, die "nichts zurückgeben". Es ist auch ein allgemeiner Standardrückgabewert für Funktionen, die nach etwas suchen und es möglicherweise finden oder nicht finden. Beispielsweise wird es zurückgegeben, re.searchwenn der reguläre Ausdruck nicht übereinstimmt oder dict.getwenn der Schlüssel keinen Eintrag im Diktat hat. Sie können keine NoneZeichenfolgen oder andere Objekte hinzufügen .

Eine Ihrer Variablen ist Nonekeine Zeichenfolge. Vielleicht haben Sie returnin einer Ihrer Funktionen vergessen , oder der Benutzer hat keine Befehlszeilenoption angegeben und optparseSie Nonefür den Wert dieser Option angegeben. Wenn Sie versuchen, Noneeiner Zeichenfolge etwas hinzuzufügen , wird folgende Ausnahme angezeigt:

send_command(child, SNMPGROUPCMD + group + V3PRIVCMD)

Einer von groupoder SNMPGROUPCMDoder V3PRIVCMDhat Noneals Wert.

Burhan Khalid
quelle
Vielen Dank!! Sie waren richtig, eine meiner Benutzereingabeoptionen wurde aus irgendeinem Grund nicht verwendet. Ich habe dies als "Name" gegen eine Option hinzugefügt und Boom, es hat funktioniert. Jetzt muss ich nur noch herausfinden, warum dies nicht richtig als Option verwendet wird. Alle anderen Optionen funktionieren einwandfrei.
Unsicher-IT
1
"Nicht gesetzt" ist etwas vage ... Wenn eine Variable nicht definiert ist und Sie versuchen, eine Operation damit auszuführen, sollten Sie eine erhalten NameError. Es könnte auch gesetzt werden, aber gleich None("auf nichts setzen" = "nicht gesetzt"?), Dann könnten Sie einige bekommen TypeError.
Nick T
Grundsätzlich (für die C / Java-Leute hier) keine = null
Zoe
23

NoneTypeist einfach der Typ des NoneSingletons:

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

Aus dem letzteren Link oben:

None

Der einzige Wert des Typs NoneType. Nonewird häufig verwendet, um das Fehlen eines Werts darzustellen, beispielsweise wenn Standardargumente nicht an eine Funktion übergeben werden. Aufträge an Nonesind illegal und erhöhen a SyntaxError.

In Ihrem Fall sieht es so aus, als ob eines der Elemente, die Sie verketten möchten None, der Fehler ist.

arshajii
quelle
21

Aus Gründen der defensiven Programmierung sollten Objekte vor der Verwendung auf Null geprüft werden.

if obj is None:

oder

if obj is not None:
Gürol Canbek
quelle
2
"is" sollte nur verwendet werden, wenn Sie es brauchen. Die beste defensive Programmierung sind Tests, viele Tests.
Jürgen A. Erhard
2
Defensive Programmierung ist eines der schlimmsten Dinge. Wenn Sie einen solchen Fehler finden, bedeutet dies, dass Sie einen Fehler bei der Programmierung gemacht haben. Dinge wie "vor der Verwendung auf Null prüfen" verbergen nur einige schwerwiegende Fehler. Sie sollten die Ausnahme auslösen lassen. Und lassen Sie Programmierer keine benutzerdefinierten Ausnahmen auslösen, es ist wirklich umständlich. Lassen Sie den natürlichen Fehler geworfen werden. In der Tat ist die defensive Programmierung ein Symptom dafür, dass Sie eine andere Sprache verwenden sollten.
Bzim
Ich frage die Datenbank über sqlAlchemy ab. Es gibt kein Ergebnis. Das zurückgegebene Objekt ist None. Was kein Ergebnis bedeutet. Es liegt kein Fehler vor. Sie überprüfen, ob ein Ergebnis keines ist. Wenn nicht, verwenden Sie das Ergebnisobjekt. Nichts Böses daran. Das Böseste an der Programmierung ist Dogmatismus.
unit100
17

Es bedeutet, dass Sie versuchen, eine Zeichenfolge mit etwas zu verketten, das ist None.

Keine ist die "Null" von Python und NoneTypeist sein Typ.

Dieser Code löst die gleiche Art von Fehler aus:

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

Anstatt Ihnen in der Fehlermeldung mitzuteilen, dass Sie zwei Objekte nicht verketten können, indem Sie ihre Werte anzeigen (eine Zeichenfolge und Nonein diesem Beispiel), zeigt Ihnen der Python-Interpreter dies an, indem er die Typen der Objekte anzeigt, die Sie verketten wollten. Der Typ jeder Zeichenfolge ist, strwährend der Typ der einzelnen NoneInstanz aufgerufen wird NoneType.

Normalerweise müssen Sie sich nicht darum kümmern NoneType, aber in diesem Beispiel ist es notwendig, das zu wissen type(None) == NoneType.

Feuermurmel
quelle
Ich habe ein sehr ähnliches Problem und versuche festzustellen, ob das Objekt NoneType ist. Ihre Bestätigung funktioniert bei mir nicht: >>> 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 NoneTypeist nirgendwo definiert (das ist mir bekannt). Wenn Sie überprüfen möchten, ob ein Wert vorliegtNone , verwenden Sie einfach key is None(siehe stackoverflow.com/questions/23086383/… ). Andernfalls könnten Sie type(key) == type(None)den gleichen Effekt erzielen.
Feuermurmel
1

Ihr Fehler tritt folgendermaßen auf: >>>
>>> None + "hello world"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'

Das None- Objekt von Python entspricht in anderen Sprachen in etwa null , null usw.

Dave
quelle
0

Einer der Variablen wurde kein Wert zugewiesen, daher handelt es sich um einen NoneType. Sie müssen untersuchen, warum dies so ist, es ist wahrscheinlich ein einfacher logischer Fehler von Ihrer Seite.

SeanOTRS
quelle