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. "
Antworten:
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'>
quelle
""
? Die Wahl des Designs hängt ganz davon ab, welcher Wert aussagekräftiger ist.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.
quelle
Eine andere Möglichkeit, eine leere Zeichenfolge zu initialisieren, besteht darin, die integrierte
str()
Funktion ohne Argumente zu verwenden.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''
.quelle
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.
quelle
Beides mag in Ordnung sein, aber ich glaube nicht, dass es eine eindeutige Antwort gibt.
None
besser als der Vergleich mit""
, da dies""
möglicherweise ein gültiger Wert ist.""
ist dies wahrscheinlich besser, da es sich tatsächlich um eine Zeichenfolge handelt und Sie darauf Zeichenfolgenmethoden aufrufen können. Wenn Sie mitgehenNone
würden, würden diese zu Ausnahmen führen.""
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
str
immer eine Zeichenfolge ist. Wenn Sie verwendet habenNone
, 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 :)quelle
str
als Variablenname vermeiden , da dies die integriertestr()
Funktion beschattet .Beides ist in Ordnung,
None
wird jedoch häufiger als Konvention verwendet. GibtNone
an, 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.
quelle
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
""
dies ein gültiger Wert sein könnte. Besser, er prüftNone
stattdessen auf Ness.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, ...
quelle
None
Ihnen nicht sagen.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
quelle
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.
quelle
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
quelle