Ab Python 3.6, the keyword argument order is preserved passieren. Vor 3.6 ist es nicht möglich, da die OrderedDict
in eine dict
umgewandelt wird.
Das erste, was zu erkennen ist, dass der Wert, den Sie in **example
gehen nicht automatisch der Wert in **kwargs
werden. Betrachten Sie diesen Fall, wo kwargs
nur haben Teil example
:
def f(a, **kwargs):
pass
example = {'a': 1, 'b': 2}
f(**example)
Oder diesen Fall, wo es mehr Werte als die in Beispiel hat:
example = {'b': 2}
f(a=1, c=3, **example)
Oder auch ohne Überlappung überhaupt:
example = {'a': 1}
f(b=2, **example)
Also, was Sie fragen nicht wirklich Sinn machen.
Dennoch könnte es schön, wenn es eine Möglichkeit gab, um anzugeben, dass Sie eine geordnete **kwargs
wollen, egal wo die Schlüsselwörter aus explizitem Schlüsselwort args in der Reihenfolge, wie sie kamen erscheinen, gefolgt von allen Elementen von **example
in der Reihenfolge, in der sie in example
erscheinen (was beliebig sein könnte, wenn example
ein dict
wäre, aber könnte auch sinnvoll sein, wenn es ein OrderedDict
wäre).
Es ist schwieriger, alle Details zu definieren und die Leistung akzeptabel zu halten. Eine Diskussion über die Idee finden Sie unter PEP 468 und den verknüpften Threads. Es scheint dieses Mal zum Stillstand gekommen zu sein, aber wenn jemand es aufgreift und es verfasst (und eine Referenzimplementierung für Leute zum Spielen schreibt), die auf einer OrderedDict
basiert, die von der C API erreichbar ist, aber das wird hoffentlich in 3.5+ da sein), Ich vermute, dass es irgendwann in die Sprache kommen würde.
By the way, beachten Sie, dass, wenn diese waren möglich, es mit ziemlicher Sicherheit im Konstruktor verwendet werden würde, für OrderedDict
selbst. Aber wenn Sie versuchen, dass alles, was Sie tun ist das Einfrieren etwas beliebige Reihenfolge als Dauerauftrag:
>>> d = OrderedDict(a=1, b=2, c=3)
OrderedDict([('a', 1), ('c', 3), ('b', 2)])
Inzwischen welche Möglichkeiten haben Sie?
Nun, die offensichtliche Option ist nur example
als normale Argument übergeben, anstatt es zu dem Auspacken:
def f(example):
pass
example = OrderedDict([('a', 1), ('b', 2)])
f(example)
Oder natürlich können Sie *args
verwenden und die Einzelteile als Tupel übergeben, aber das ist im Allgemeinen hässlichen .
Es kann einige andere Problemumgehungen in den Threads geben, die von der PEP verknüpft sind, aber wirklich, keiner von ihnen wird besser als das sein. (Außer ... IIRC, Li Haoyi hat eine Lösung auf der Grundlage seiner MacroPy gefunden, um bestellungsbeständige Schlüsselwortargumente zu übergeben, aber ich erinnere mich nicht an die Details. MacroPy-Lösungen im Allgemeinen sind großartig, wenn Sie MacroPy verwenden und Code schreiben möchten das liest sich nicht wie Python, aber das ist nicht immer passend ...)
Danke für die detaillierten Antworten. Was ich getan habe, war, ein optionales erstes Argument (ein geordnetes Diktat) zuzulassen, das gegenüber den ** kwargs verwendet würde, falls es bereitgestellt wird. Große Info, obwohl – theodox
** Siehe auch: ** https://duckduckgo.com/?q=pep468 – dreftymac