Beispiel, sagen, dass ich eine Funktionmit `* args`, Schlüsselwortargumente werden positional?
def myfunc(a=1, *args):
print(a)
# *args have some other functionality, for example passed to a class instance, or whatever
Problem ist zu definieren: wenn myfunc
Aufruf, kann ich die erwarteten Positionsargumente für *args
nicht passieren zuerst, dann a
Keyword-Argument übergeben. Zum Beispiel, wenn die erwartete *args
nur eine Nummer enthalten, kann ich nicht
myfunc(3, a=4)
Dies würde einen Fehler aus, die besagt, mehrere Zuweisungen für ein empfangenes. Ich kann natürlich nicht myfunc(a=4, b=5, 3)
tun. Ich kann
myfunc(4, 3)
So, jetzt nur tun, wie es scheint, mit dem *args
, das Stichwort Argument a
wirklich Positions wird?
Das Beispiel hier ist eine Funktion, aber es gilt auch für Klassen. Angenommen, eine Unterklasse mit __init__(a=3, *args)
möchte ein Schlüsselwortargument a
und einige andere 99 erforderliche Argumente, die an super übergeben werden sollen. Ich möchte nicht die Definition von 99 Argumenten in der Unterklasse wiederholen, sondern *args
und übergebe das an super. Aber jetzt wird das Schlüsselwortargument a
positionell.
Diese Klasse und Unterklasse Beispiel ist mein echtes Problem in meiner Codierung. Ich möchte eine Unterklasse mit einem optionalen, Schlüsselwortargument a
, und dann 99 erforderlichen Argumente für seine Super. Ich sehe keinen guten, sauberen Weg um dieses Problem herum.
Ich kann nicht der Erste sein, der darauf stößt, aber ich konnte keine Antwort finden.
Ich denke, der Weg, es zu tun ist, dein 'a' loszuwerden und stattdessen' * kwargs' zu verwenden. Wenn Sie dann noch einen Standardwert für "a" haben möchten, müssten Sie dies in Ihrer Funktion/Klasse implementieren. Als eine Genauigkeit, erzählt Python '* args' irgendwie" irgendwelche anderen Argumente, die kommen würden ". In Ihrem Beispiel, das einen Fehler verursacht, ordnet Python das erste Argument dem benannten Argument zu, das es kennt ("a"). Wenn Sie also explizit einen Wert für "a" setzen wollen, wird Python verwirrt, da es bereits einen Wert hat dafür. –
Danke für den Kommentar. Du meintest 'Kwargs'? Ja, ich verstehe den Grund, warum das passiert, ich bin nur überrascht, dass mit "* args" die Schlüsselwortargumente positionell werden. Was ich wirklich in meiner eigentlichen Kodierung treffe, ist eher das Beispiel der Klasse und der Unterklasse, und ich sehe keinen guten Weg dafür. – Alex
@Alex. Ich könnte hier etwas vermissen - aber warum nicht einfach die Funktion mit dem Schlüsselwort argument * nach * den '* args' definieren? – ekhumoro