これはあなたが探しているものであるかどうかは知りませんが、それはinspect.getargspec()
を使用する方法の例です:
import inspect
def _call_fn(fn, *args, **kwargs):
argspec = inspect.getargspec(fn)
_args = []
_kw = {}
_argspec_args = argspec.args[:]
if args:
# pass positional parameters given to us through
_args += list(args)
# skip the parameters we've matched
_argspec_args = _argspec_args[len(args):]
for argname in _argspec_args:
if argname in kwargs:
_args.append(kwargs.pop(argname))
else:
raise TypeError("%s expected parameter %s" % (fn.__name__, argname))
if argspec.keywords is not None and kwargs:
_kw.update(kwargs)
# print _args, _kw
return fn(*_args, **_kw)
def f(a, b, c, d):
print a, b, c, d
あなたはTypeError
_call_fn(f, 1, 2, d=2, c=3, b=4, q=42)
を発生させることなく、余分な引数を提供できるように、それは、必要な引数に与えられた引数と一致します10
の位置argsが優先されるので、上記は最初の2つの引数からの3
からc=3
、2
からd=2
まで1 2 3 2
(1 2
)を印刷します。 b=4
およびq=42
は破棄されます)。
あなたは 'args' *または*' kwargs'を持っていません。あなたは*明示的に名前付きの*パラメータを持っています。 'b 'が提供されているかどうかを知りたければ、' bがNoneであれば 'を使用します。 – jonrsharpe
申し訳ありませんが私の質問を洗練させてください。その部分がはっきりしていないことに気付きました。 –
パラメータがどのように渡されるかはどうして重要ですか?機能の中に入ると、あなたが受け取ったものを簡単に知ることができます。もっと文脈を与えることができますか? – jonrsharpe