Ich habe einen Nonetype
Wert x
, es ist im Allgemeinen eine Zahl, könnte es aber sein None
. Ich möchte es durch eine Zahl teilen, aber Python wirft:
TypeError: int() argument must be a string or a number, not 'NoneType'
Wie kann ich das lösen?
int(None)
löst eine Ausnahme aus, da None nicht in ein int konvertiert werden kann. Die Antwort auf Ihre Frage ist, dass dies nicht möglich ist. Sie können etwas wie 0 oder 2771 oder einen rosa Elefanten ersetzen, aber was auch immer Sie ersetzen, Sie können None immer noch nicht in ein int konvertieren.None
in einen rosa Elefanten ist auch nicht gut, es sei denn, Sie arbeiten mit einem Zahlensystem, das die Division einer Zahl durch einen rosa Elefanten formal definiert (und Sie haben den Code geschrieben, um sie zuAntworten:
In einem der Kommentare sagen Sie:
Wenn es Ihr Code, herauszufinden , wie Sie bekommen ,
None
wenn Sie eine Nummer und Stopp erwarten , dass nicht passiert.Wenn es sich um den Code eines anderen handelt, ermitteln Sie die Bedingungen, unter denen er angegeben ist,
None
und bestimmen Sie einen sinnvollen Wert, der dafür verwendet werden kann, mit dem üblichen bedingten Code:...oder auch...
Es gibt keinen Grund, hier automatisch zu verwenden
0
- Lösungen, die von der "falschen"None
Annahme abhängen, dass Sie dies wollen. DasDEFAULT_VALUE
(falls es überhaupt existiert) hängt vollständig vom Zweck Ihres Codes ab.quelle
Dies wird 0 verwenden, wenn Sie einen von Python berücksichtigten Wert angeben
False
, z. B. None, 0, [], "" usw. Da 0 istFalse
, sollten Sie nur 0 als alternativen Wert verwenden (andernfalls finden Sie Ihre 0s in diesen Wert verwandeln).Dies wird nur
None
durch 0 ersetzt . Da wirNone
speziell testen , können Sie einen anderen Wert als Ersatz verwenden.quelle
(value or 0)
- ohne das Casting vom Typ int - verwenden, wenn wir versichert haben, dass der Wert nur ein None oder ein intEine übliche "pythonische" Methode, um mit dieser Art von Situation umzugehen, ist EAFP für " Es ist einfacher, um Vergebung zu bitten als um Erlaubnis ". Was normalerweise bedeutet, Code zu schreiben, der davon ausgeht, dass alles in Ordnung ist, und ihn dann mit einem
try..except
Block zu umschließen, nur für den Fall, dass Dinge erledigt werden, wenn dies nicht der Fall ist.Hier ist der Codierungsstil, der auf Ihr Problem angewendet wird:
Oder vielleicht das noch einfachere und etwas schnellere:
Der umgekehrte und traditionellere Ansatz ist als LBYL bekannt und steht für " Look before you leap ", was @Soviut und einige der anderen vorgeschlagen haben. Weitere Informationen zu diesem Thema finden Sie in meiner Antwort und den zugehörigen Kommentaren zur Frage. Stellen Sie fest, ob ein Schlüssel in einem Wörterbuch an anderer Stelle auf dieser Site vorhanden ist.
Ein potenzielles Problem mit EAFP besteht darin, dass es die Tatsache verbergen kann, dass etwas mit einem anderen Teil Ihres Codes oder eines von Ihnen verwendeten Drittanbieter-Moduls nicht stimmt, insbesondere wenn die Ausnahmen häufig auftreten (und daher keine wirklich "Ausnahmefälle" sind überhaupt).
quelle
Das
TypeError
erscheint nur, wenn Sie versuchen zu bestehenint()
None
(was meines Wissens der einzigeNoneType
Wert ist). Ich würde sagen, dass Ihr eigentliches Ziel nicht darin bestehen sollte,NoneType
nachint
oder zu konvertierenstr
, sondern herauszufinden, woher / warum SieNone
anstelle einer Zahl wie erwartet kommen, und diese entweder zu korrigieren oderNone
richtig zu handhaben .quelle
int()
einer komplexen Zahl, wie z. B.int(1+2j)
, führt ebenfalls zu einerTypeError
Erhöhung, obwohl dies zugegebenermaßen wahrscheinlich sehr unwahrscheinlich ist. Unabhängig davon denke ich, dass Sie sagen, dass dies ohne Frage im Allgemeinen ein guter Rat wäre, dem Sie folgen sollten.In Python 3 können Sie auch das Schlüsselwort "oder" verwenden. Diesen Weg:
quelle
Ich habe int (x oder 0) erfolgreich für diesen Fehlertyp verwendet, solange None in der Logik gleich 0 sein sollte. Beachten Sie, dass dies auch in anderen Fällen auf 0 aufgelöst wird, in denen das Testen von x False zurückgibt. zB leere Liste, Satz, Wörterbuch oder Zeichenfolge mit der Länge Null. Entschuldigung, Kindall hat diese Antwort bereits gegeben.
quelle
Dies kann passieren, wenn Sie vergessen, einen Wert von einer Funktion zurückzugeben: Dann wird None zurückgegeben. Sehen Sie sich alle Stellen an, an denen Sie dieser Variablen zuweisen, und prüfen Sie, ob es sich bei einer davon um einen Funktionsaufruf handelt, bei dem der Funktion eine return-Anweisung fehlt.
quelle
return
statt sindreturn some_expression
.return None
AnweisungenSie sollten überprüfen, ob der Wert nicht None ist, bevor Sie versuchen, Berechnungen daran durchzuführen:
Hinweis:
my_value
wurde absichtlich auf Keine gesetzt, um zu beweisen, dass der Code funktioniert und die Prüfung durchgeführt wird.quelle
is [not] None
) verwendenmy_value
bedingungslos auf Keine; Warum? Sie fragen sich nicht, warum das OP glaubt, dass er etwas tun muss,int(my_value)
wennmy_value
(wenn nicht gar keine) "im Allgemeinen eine Zahl" ist.Ich hatte das gleiche Problem mit den Python-E-Mail-Funktionen. Unten ist der Code, den ich versucht habe, den Betreff einer E-Mail in eine Variable abzurufen. Dies funktioniert für die meisten E-Mails einwandfrei und die Variable wird ausgefüllt. Wenn Sie eine E-Mail von Yahoo oder ähnlichem erhalten und der Absender die Betreffzeile nicht ausgefüllt hat, erstellt Yahoo keine Betreffzeile in der E-Mail und Sie erhalten von der Funktion einen NoneType zurück. Martineau gab eine richtige Antwort sowie Soviut. Die Antwort von IMO Soviut ist vom Standpunkt der Programmierung aus prägnanter. nicht unbedingt von einem Python. Hier ist ein Code, der die Technik zeigt:
quelle
In einigen Situationen ist es hilfreich, eine Funktion zum Konvertieren von None in int zero zu haben:
quelle