Python Keine, wenn der Scheck fehlschlägt
-
26-10-2019 - |
Frage
def myFunc( str ):
print "str=", str
if str == None:
print "str is None"
else:
print "str is not None, value is:", str
Diese Funktion wird in meiner App mehrmals aufgerufen, wobei Str keine ist. Obwohl STR jedoch keine ist, schlägt der Test aus und druckt: er druckt:
str=None
str is not None, value is None
Wie kann das passieren?
Lösung
Die Saite 'None'
und die Bytestring b'None'
Wird beide keine ausdrucken, aber nicht eigentlich keine sein. Außerdem können Sie benutzerdefinierte Klassen haben, die ihre außer Kraft setzen __str__
Methoden zur Rückkehr 'None'
, obwohl sie eigentlich keine nicht sind.
Einige ästhetische Anmerkungen: Python garantiert, dass es immer nur eine Instanz geben wird None
, Sie sollten also verwenden is
Anstatt von ==
. Außerdem sollten Sie Ihre Variable nicht benennen str
, wie das der Name eines eingebauten.
Probieren Sie diese Definition aus:
def myFunc(s):
if s is None:
print('str is None')
else:
print('str is not None, it is %r of type %s' % (s, type(s).__name__))
Andere Tipps
Überprüfen Sie den Wert von str
wieder. Wenn Ihr Test fehlschlägt, dann str
ist nicht das Besondere None
Objekt. Vermutlich ist STR in der Tat die Saite 'None'
.
>>> str = None
>>> str == None
True
>>> str = 'None'
>>> str == None
False
>>> print str
None
Nach Ihren Kommentaren zu beurteilen, str
ist eigentlich u'None'
Welches ist eine Art Zeichenfolge unicode
. Sie können dies so testen:
>>> s = unicode('None')
>>> s
u'None'
>>> print s
None
>>> s == 'None'
True
Jetzt, während Sie das tun konnten, vermute ich, dass Ihr Problem woanders liegt. Der aufrufende Code muss dieses Objekt beispielsweise mit einer Zeichenfolge konvertieren, beispielsweise mit unicode(None)
. Es wäre höchstwahrscheinlich besser, dass der aufrufende Code nur in die Zeichenfolge konvertiert wird, wenn das Objekt nicht ist None
.
Kann es sein, dass str
ist an das String -Objekt gebunden "None"
zufällig?
Ich würde empfehlen, die Verwendung zu verwenden if str is None
Anstatt von ==
. Ganz zu schweigen davon, dass Sie wirklich nicht verwenden sollten str
als variabler Name.
Sie könnten auch die verwenden __repr__
Methode, um den Wert anzuzeigen:
>>> x = None
>>> print 'the value of x is', x.__repr__()
the value of x is None
>>> x = "None"
>>> print 'the value of x is', x.__repr__()
the value of x is 'None'