例は、私がに `* args`を指定すると、キーワードの引数は位置になりますか?
def myfunc(a=1, *args):
print(a)
# *args have some other functionality, for example passed to a class instance, or whatever
関数を定義すると言う問題がある:myfunc
を呼び出すときに、私はキーワード引数a
を渡し、その後、最初の*args
の予想位置引数を渡すことはできません。期待*args
だけの数が含まれている場合たとえば、私は複数の割り当てを受けたために述べて、エラーを発生させるでしょう
myfunc(3, a=4)
これを行うことはできません。私は明らかにmyfunc(a=4, b=5, 3)
をすることはできません。私は、*args
で、だから今それはそうa
が実際の位置となり、キーワード引数を
myfunc(4, 3)
を行うことができますか?
ここでの例は関数ですが、クラスにも適用されます。 __init__(a=3, *args)
のサブクラスが、いくつかのキーワード引数a
と他の99個の必須引数をsuperに渡すことを望んでいるとします。私は、サブクラスで99の引数定義を繰り返すのではなく、*args
を実行してsuperに渡します。しかしキーワード引数a
は現在位置付けられています。
このクラスとサブクラスの例は、私のコーディングで私の本当の問題です。私は、オプションのキーワード引数a
を持つサブクラスを必要とし、そのsuperには99個の必須引数が必要です。私はこの問題の周りに良い、きれいな方法が表示されません。
私はこれに最初に衝突することはできませんが、私は答えを見つけることができませんでした。
私はそれを行う方法はあなたの 'a'を取り除き、' * kwargs'を使うことだと思います。それでも 'a'のデフォルト値が必要な場合は、関数/クラス内でそれを実装する必要があります。 精度として、Python '* args'は「他の引数が来る」と言っているようです。あなたの例では、エラーを発生させる例では、Pythonは最初の引数を知っている名前付き引数( 'a')にマップします。したがって、' a'の値を明示的に設定したい場合、Pythonは既に値それのための。 –
コメントありがとうございます。あなたは** kwargsを意味しましたか?うん、私はこのようなことが起こる理由を理解しています。私はちょうど '* args'でキーワードの引数が位置付けられることに驚いています。実際のコーディングで実際に実行しているのは、クラスとサブクラスの例に似ていますが、その周りに良い方法はありません。 – Alex
@Alex。私はここで何か不足しているかもしれませんが、 '* args'の後に*キーワード引数*で関数を定義するだけではどうですか? – ekhumoro