2013-07-17 16 views
10

In einigen anderen Sprachen, die ich kenne, sollte das intuitive Ergebnis einer Umwandlung von null in eine Zeichenfolge eine leere Zeichenfolge sein. Warum Python soll "None" eine Art spezielle Zeichenfolge sein? Und dies zusätzliche Arbeit führen kann, wenn ein Rückgabewert einer FunktionWarum Python, das als str (None) entworfen wurde, gibt 'None' statt einer leeren Zeichenfolge zurück?

Prüfung
result = foo() # foo will return None if failure 
if result is not None and len(str(result)) > 0: 
    # ... deal with result 
    pass 

wenn str (None) leere Zeichenfolge zurückgibt, könnte der Code kürzer sein:

if len(str(result)) > 0: 
    # ... deal with result 
    pass 

Sieht aus wie Python versucht wird um ausführlich zu sein, Log-Dateien verständlicher zu machen?

+5

Dies beantwortet nicht wirklich Ihre Frage, aber es umgeht Ihr Problem. 'bool (None) == False', aber _also_' bool ('') == False'. In Wirklichkeit müssen Sie also nur 'if result: # pass' überprüfen, da '' '' und 'None' beide False auswerten. Ich werde versuchen, einige Gründe für die Wahl von 'str (None) == 'None' zu finden, aber ich denke nicht, dass es Auswirkungen auf Ihren Code haben sollte, wenn Sie nur überprüfen, ob eine richtige Zeichenfolge zurückgegeben wurde. – pswaminathan

+0

Es ist nur zusätzliche Arbeit, weil die von Ihnen definierte Bedingung peinlich ist: "Behandle nur das Ergebnis, wenn es nicht None ist oder seine Zeichenfolgendarstellung nicht leer ist".Verwenden Sie eine konventionellere Art der Überprüfung (wie von @ Pswaminathan vorgeschlagen) und das Problem verschwindet. – vanza

+0

Wenn 'foo' im Fehlerfall' None' zurückgibt, müssen Sie nach 'None' suchen. In Ihrem Beispiel wird alles, dessen Zeichenfolgendarstellung leer ist, anscheinend genauso behandelt wie "Keine", aber es gibt keinen besonderen Grund, warum dies das Standardverhalten sein sollte. Die Frage ist, warum verwenden Sie "Länge von str (x)" als Diagnose für irgendetwas? – BrenBarn

Antwort

11

Überprüfen, ob eine Zeichenfolge Zeichen enthält, indem Sie len(str(result)) überprüfen, ist definitiv nicht pythonisch (siehe http://www.python.org/dev/peps/pep-0008/).

result = foo() # foo will return None if failure 
if result: 
    # deal with result. 
    pass 

None und '' coerce zum boolean False.


Wenn Sie wirklich fragen, warum str(None)'None' zurückkehrt, dann glaube ich, es ist, weil es für three-valued logic notwendig ist. True, False und None können zusammen verwendet werden, um festzustellen, ob ein logischer Ausdruck True, False ist oder nicht entschieden werden kann. Die Identitätsfunktion ist am einfachsten für die Darstellung.

True -> 'True' 
False -> 'False' 
None -> 'None' 

Die folgende wäre wirklich seltsam, wenn str(None)'' war:

>>> or_statement = lambda a, b: "%s or %s = %s" % (a, b, a or b) 
>>> or_statement(True, False) 
'True or False = True' 
>>> or_statement(True, None) 
'True or None = True' 
>>> or_statement(None, None) 
'None or None = None' 

Nun, wenn Sie wirklich für eine verbindliche Antwort wollen, Guido fragen.


Wenn Sie wirklich str(None) haben wollen geben Sie bitte '' diese andere Frage lesen: Python: most idiomatic way to convert None to empty string?

+2

Wenn Sie eine vollständige Implementierung einer dreiwertigen Logik benötigen, die True, False und None verwendet, lesen Sie das [Python Tribolool-Modul] (http://www.grantjenks.com/docs/tribool/) – GrantJ

+0

Expanding on @GrantJ ' s Anweisung, 'or_statement()' wie geschrieben ist kein gutes Tristate-Beispiel, da es je nach Argumentreihenfolge ein anderes Ergebnis hat: 'or_statement (None, False)' sollte unentscheidbar sein, dh 'None', gibt aber' False' zurück weil 'or' ein einfacher Verknüpfungsoperator ist, der nach der booleschen Bedingung' None' auf 'False' fällt. – Metaxis

4

Grundsätzlich weil eine leere Zeichenfolge nicht eine Darstellung None ist. None ist ein spezieller Wert, der sich von einer leeren Zeichenfolge oder etwas anderem unterscheidet. Wie in the docs beschrieben, wird str bis

soll

einen String zurück, eine schön druckbare Darstellung eines Objekts enthält.

Grundsätzlich soll str etwas druckbares und menschenlesbares zurückgeben. Eine leere Zeichenfolge wäre keine lesbare Darstellung von None.

+1

Durch diese Logik sollten 'str (None)' und 'str ('None')' auch nicht gleich sein. –

+0

@Mark Wie sagt das aus, dass "str" ​​etwas mit Gleichheit zu tun haben sollte? Es ist nur ein Wert, den Sie ausdrucken können. Verwenden Sie 'repr', wenn Sie den Typ/Wert als Zeichenfolge unterscheiden müssen. – DanielB

+0

@DanielB, habe ich diese Stimmung bereits in einem Kommentar zu der Frage selbst ausgedrückt. –

Verwandte Themen