An der einen oder anderen Stelle könnten Sie auf Funktionen mit vielen Argumenten stoßen. Manchmal ist es sinnvoll, einige der Argumente zu Superargumenten zu kombinieren. Ich habe das oft mit Diktaten gemacht, aber jetzt suche ich nach besseren Möglichkeiten, es zu tun.
Ich würde gerne drehen ...
def do_something(ax, ay, az, bu, bv, c):
# Do something
... in ...
def do_something(a, b, c):
# Do something
... wo a
und b
enthalten ihre Untervariationen.
Eine Möglichkeit, dies zu tun, besteht darin, Folgendes zu tun:
A = namedtuple('A', 'x, y, z')
a = A(ax, ay, az)
B = namedtuple('B', 'u, v')
b = B(bu, bv)
Dies scheint jedoch einfacher zu sein:
a = SimpleNamespace(x=ax, y=ay, z=az)
b = SimpleNamespace(u=bu, v=bv)
Was ist der Nachteil? Die Tatsache, dass a
und b
nicht gut getippt? Sie sind keine A- und B-Objekte?
(Übrigens, mach dir keine Sorgen um die Variablennamen. Ich verwende sie normalerweise nicht als kurze Variablennamen.)
python
variables
dictionary
André Christoffer Andersen
quelle
quelle
Antworten:
SimpleNamespace
ist im Grunde nur eine schöne Fassade auf einem Wörterbuch. Sie können Eigenschaften anstelle von Indexschlüsseln verwenden. Das ist schön, da es super flexibel und einfach zu manipulieren ist.Der Nachteil dieser Flexibilität ist, dass sie keine Struktur bietet. Es gibt nichts, was jemanden davon abhält anzurufen
SimpleNamespace(x=ax, y=ay)
(unddel a.z
irgendwann später). Wenn diese Instanz an Ihre Funktion übergeben wird, tritt die Ausnahme auf, wenn Sie versuchen, auf das Feld zuzugreifen.Im Gegensatz dazu
namedtuple
können Sie einen strukturierten Typ erstellen. Der Typ hat einen Namen und weiß, welche Felder er haben soll. Ohne jedes dieser Felder können Sie keine Instanz erstellen, und sie können später nicht mehr entfernt werden. Darüber hinaus ist die Instanz unveränderlich, sodass Sie wissen, dass der Wert ina.x
immer gleich ist.Es liegt an Ihnen, zu entscheiden, ob Sie die Flexibilität benötigen,
SimpleNamespace
die Ihnen geboten wird, oder ob Sie die Struktur und Garantien von bevorzugennamedtuple
.quelle
Ich mag die Antwort über strukturiert und nicht strukturiert sehr, deshalb gebe ich unten nur ein konkretes Beispiel.
SimpleNamespace
akzeptiert Schlüssel, die mit beginnen_
. Wenn Sie nach einer schnellen und einfachen Möglichkeit suchen, beispielsweise JSON, das Sie nicht steuern, in Objekte mit Feldnamen umzuwandeln, ist dies sehr praktisch:Beachten Sie oben, dass Sie sehen können, dass
namedtuple
wir ein ganzes zusätzliches Objekt erhalten, dasSimpleNamespace
niemals wird. JedesSimpleNamespace
ist wirklich eine "einzigartige Schneeflocke", während esnamedtuple
existiert, ohne jemals mit konkreten Werten instanziiert zu werden. Wo immer Sie Abstraktionen benötigen, die sich auf konkrete Werte verallgemeinern, sollten Sie diese wahrscheinlich bevorzugen.quelle
Zusammenfassung von
SimpleNamespace
Es ermöglicht das Initialisieren von Attributen beim Erstellen des Objekts:
Es bietet eine lesbare
Es überschreibt den Standardvergleich. Anstatt mit zu
id()
vergleichen, werden stattdessen Attributwerte verglichen.quelle