引数が間違っている関数を呼び出すか、キーワード引数が定義にない関数を呼び出すと、TypeErrorが返されます。私は、コールバックをサポートするために、コールバックを受け取り、可変引数で呼び出すコードを欲しいと思います。コールバックcb
の場合は、cb.__code__.cb_argcount
とcb.__code__.co_varnames
を使用しますが、私はむしろそれをapply
のようなものに抽象化しますが、それは "適合"する引数を適用するだけです。例えばTypeErrorを呼び出さずに、引数の数が違うPython関数を呼び出す方法はありますか?
:
def foo(x,y,z):
pass
cleanvoke(foo, 1) # should call foo(1, None, None)
cleanvoke(foo, y=2) # should call foo(None, 2, None)
cleanvoke(foo, 1,2,3,4,5) # should call foo(1, 2, 3)
# etc.
は、すでにPythonで、このようなものはありますか、それは私が一から書くべきものでしょうか?
getargspecは(__magic__ものに目を通す必要はありません、 例えば)。 私はあなたが提案したように( "a"の代わりに "k"を付けずに)argsという名前のフィルタリングを行いたいと思っています)、長さで通常の引数 - 呼び出しに十分な引数がない場合はNoneを書き、議論 たぶん私はデコレータにしてもいいでしょう:) –
2番目の考えでは、私は非常に明確にしていないことが正しいです(自分の頭でも)。コールバックには、デフォルト、* args、** kwargsの異なる組み合わせがあります。 –
ありがとう、typoを修正しました。それについてもっと考えると、私は名前付き引数に焦点を当てることは良いアイデアだと信じています - ポジションと名前を混在させることは常に難しいです。私のコードの重要な機能強化の1つは、引数aがデフォルト値を持っていて、dにない場合、自分のコードが(.getによって)実行されるのではなく、強制的にNoneにすることです。 –