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?

War es hilfreich?

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'
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top