Initialisieren Sie eine Zeichenfolgenvariable in Python: "" oder "Keine".

75

Angenommen, ich habe eine Klasse mit einem Zeichenfolgeninstanzattribut . Soll ich dieses Attribut mit dem Wert "" oder " Keine " initialisieren ? Ist entweder okay?

def __init__(self, mystr="")
   self.mystr = mystr

oder

def __init__(self, mystr=None)
   self.mystr = mystr

Bearbeiten : Ich dachte, wenn ich "" als Anfangswert verwende, " deklariere " ich eine Variable als Zeichenfolgentyp . Und dann kann ich ihm später keinen anderen Typ zuweisen. Habe ich recht?

Bearbeiten : Ich denke, es ist wichtig zu beachten, dass mein Vorschlag falsch war. Und es ist kein Problem, einer Variablen einen anderen Typ zuzuweisen. Ich mochte einen Kommentar von S.Lott : " Da in Python nichts" deklariert "ist, denken Sie nicht richtig darüber nach. "

legesh
quelle
6
Da in Python nichts "deklariert" ist, denken Sie nicht richtig darüber nach.
S.Lott

Antworten:

82

Wenn kein Wert in Ihrem Programm eine Bedeutung hat (z. B. ein optionaler Wert), sollten Sie None verwenden. Das ist sowieso sein Zweck.

Wenn der Wert vom Aufrufer von __init__ bereitgestellt werden muss, würde ich empfehlen, ihn nicht zu initialisieren.

Wenn "" als Standardwert sinnvoll ist, verwenden Sie ihn.

In Python wird der Typ aus der Verwendung abgeleitet. Daher können Sie den Typ ändern, indem Sie einfach einen Wert eines anderen Typs zuweisen.

>>> x = None
>>> print type(x)
<type 'NoneType'>
>>> x = "text"
>>> print type(x)
<type 'str'>
>>> x = 42
>>> print type(x)
<type 'int'>
wierob
quelle
4
+1: Was bedeutet Keine oder ""? Die Wahl des Designs hängt ganz davon ab, welcher Wert aussagekräftiger ist.
S.Lott
Im obigen Beispiel hat sich der "Typ" von x nicht geändert. Stattdessen haben Sie 3 verschiedene Objekte unterschiedlichen Typs: >>> x = Keine >>> ID (x) 1461526688 >>> x = "Text" >>> ID (x) 2520221413080 >>> x = 42 >>> ID (x) 1461692432 Stattdessen wurde die Beschriftung x um die drei Objekte verschoben.
DocOc
14

Keiner wird verwendet, um "nicht gesetzt" anzuzeigen, während jeder andere Wert verwendet wird, um einen "Standard" -Wert anzuzeigen.

Wenn Ihre Klasse mit leeren Zeichenfolgen zurechtkommt und Sie sie als Standardwert mögen, verwenden Sie "". Wenn Ihre Klasse überprüfen muss, ob die Variable überhaupt festgelegt wurde, verwenden Sie Keine.

Beachten Sie, dass es keine Rolle spielt, ob Ihre Variable anfangs eine Zeichenfolge ist. Sie können es jederzeit in einen anderen Typ / Wert ändern.

Paul
quelle
12

Eine andere Möglichkeit, eine leere Zeichenfolge zu initialisieren, besteht darin, die integrierte str()Funktion ohne Argumente zu verwenden.

str (object = '')

Gibt eine Zeichenfolge zurück, die eine gut druckbare Darstellung eines Objekts enthält.

...

Wenn kein Argument angegeben wird, wird die leere Zeichenfolge '' zurückgegeben.

Im ursprünglichen Beispiel würde das so aussehen:

def __init__(self, mystr=str())
   self.mystr = mystr

Persönlich glaube ich, dass dies Ihre Absichten besser vermittelt.

Beachten Sie übrigens, dass str()selbst ein Standardparameterwert von festgelegt wird ''.

Steven Liekens
quelle
1
Für unveränderliche Typen ist das Ergebnis dasselbe wie '', 0, False, (). Für veränderbare Typen ist es sogar so schlimm wie [], {}, set () usw., da diese Initialisierungsfunktion für den Standard nur einmal aufgerufen wird und das Ergebnis wiederholt für _ init_ verwendet wird .
hynekcer
5

Es hängt davon ab, ob. Wenn Sie zwischen überhaupt keinem übergebenen Parameter und einer leeren übergebenen Zeichenfolge unterscheiden möchten, können Sie None verwenden.

Ikke
quelle
5

Beides mag in Ordnung sein, aber ich glaube nicht, dass es eine eindeutige Antwort gibt.

  • Wenn Sie angeben möchten, dass der Wert nicht festgelegt wurde, ist der Vergleich mit Nonebesser als der Vergleich mit "", da dies ""möglicherweise ein gültiger Wert ist.
  • Wenn Sie nur einen Standardwert möchten, ""ist dies wahrscheinlich besser, da es sich tatsächlich um eine Zeichenfolge handelt und Sie darauf Zeichenfolgenmethoden aufrufen können. Wenn Sie mitgehen Nonewürden, würden diese zu Ausnahmen führen.
  • Wenn Sie zukünftigen Betreuern mitteilen möchten, dass hier eine Zeichenfolge erforderlich ist, ""können Sie dabei helfen.

Komplette Randnotiz:

Wenn Sie eine Schleife haben, sagen Sie:

def myfunc (self, mystr = ""):
    for other in self.strs:
        mystr = self.otherfunc (mystr, other)

dann würde ein potenzieller zukünftiger Optimierer wissen, dass dies strimmer eine Zeichenfolge ist. Wenn Sie verwendet haben None, handelt es sich möglicherweise erst bei der ersten Iteration um eine Zeichenfolge, für die das Abrollen der Schleife erforderlich wäre, um dieselben Effekte zu erzielen. Obwohl dies keine Hypothese ist (es kommt in meinem PHP-Compiler häufig vor), sollten Sie Ihren Code auf keinen Fall schreiben, um dies zu berücksichtigen. Ich dachte nur, es könnte interessant sein :)

Paul Biggar
quelle
Gute Kommentare, aber Sie sollten die Verwendung strals Variablenname vermeiden , da dies die integrierte str()Funktion beschattet .
Daniel Roseman
3

Beides ist in Ordnung, Nonewird jedoch häufiger als Konvention verwendet. Gibt Nonean, dass für den optionalen Parameter kein Wert übergeben wurde.

Es wird Zeiten geben, in denen "" der richtige Standardwert ist - meiner Erfahrung nach treten diese Zeiten seltener auf.

Vinay Sajip
quelle
1

Da sowohl None als auch "" falsch sind, können Sie beides tun. Siehe 6.1. Wahrheitswertprüfung .

Bearbeiten

So beantworten Sie die Frage in Ihrer Bearbeitung: Nein, Sie können einen anderen Typ zuweisen.

>>> a = ""
>>> type(a)
<type 'str'>
>>> a = 1
>>> type(a)
<type 'int'>

quelle
3
Wenn er nach der Wahrheit sucht, wird er vermissen, dass ""dies ein gültiger Wert sein könnte. Besser, er prüft Nonestattdessen auf Ness.
Paul Biggar
Da wir nicht wissen, worauf das OP prüft, können weder Sie noch ich beurteilen, was für ihn besser ist. Übrigens, haben Sie meine klar gekennzeichnete Bearbeitung in Betracht gezogen, die die OP-Bearbeitung beantwortet, als Sie meine Antwort abgelehnt haben?
1

Für Listen oder Diktate ist die Antwort klarer. Laut http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#default-parameter-values verwenden Sie None als Standardparameter.

Aber auch für Zeichenfolgen wird zur Laufzeit ein (leeres) Zeichenfolgenobjekt für den Schlüsselwortparameter instanziiert.

Der sauberste Weg ist wahrscheinlich:

def myfunc(self, my_string=None):
    self.my_string = my_string or "" # or a if-else-branch, ...
Chris
quelle
4
Warum? Das ist die Aufgabe des Standardparameters. Warum also zweimal? Und warum nicht explizit angeben, welcher Wert der Standardwert ist? Und zusätzlich „“ erklärt ganz offensichtlich , dass die Funktion erwartet einen String, die NoneIhnen nicht sagen.
u0b34a0f6ae
1

In Python ist jeder Weg in Ordnung. Ich persönlich würde "" vorziehen. Aber auch hier ist jeder Weg in Ordnung

>>>x = None
>>>print(x)
None
>>>type(x)
<class 'NoneType'>
>>>x = "hello there"
>>>print(x)
hello there
>>>type(x)
<class 'str'>
>>> 
>>>x = ""
>>>print(x)

>>>type(x)
<class 'str'>
>>>x = "hello there"
>>>type(x)
<class 'str'>
>>>print(x)
hello there
Der Creeper
quelle
1

Die Python-Philosophie soll lesbar sein.
Aus diesem Grund empfiehlt es sich, Ihre Attribute __init__()auch dann zu definieren , wenn dies optional ist.
Im gleichen Sinne müssen Sie sich fragen, was für jeden, der Ihren Code liest, klarer ist. Tatsächlich gibt der Typ selbst viele Informationen über die zukünftige Verwendung Ihrer Variablen. Damit:

kind = None

Ist syntaktisch korrekt, aber der Leser weiß nicht viel. Ist es eine Zeichenfolge, ein Code als Ganzzahl, eine Liste usw.?

kind_str = None
kind = ""

Beide sagen etwas mehr, der erste hat den Typ im Namen und der zweite in der Deklaration. Ich würde für die zweite gehen, ordentlicher.

comte
quelle
0
empty_string = ""

if not empty_string:

    print "Empty string is not set"

=> Leere Zeichenfolge ist nicht gesetzt

if empty_string is not None:
    print "Empty string is not None"

=> Leere Zeichenfolge ist nicht None

Rabhi Salim
quelle