模拟将函数参数分配给* args和** kwargs

时间:2019-04-18 14:44:46

标签: python

是否有一种简单的方法可以“模拟”参数对函数参数的分配?

说我有一个功能

UINavigationBar

我用以下方式称呼它:

def fn(a, b, c='default', *args, **kwargs):
    print(f'a={a}, b={b}, c={c}')
    print(f'args={args}')
    print(f'kwargs={kwargs}')

我想提取>>> args = (1, 2, 3, 4) >>> kwargs = {'extra_kw': 5} >>> fn(*args, **kwargs) a=1, b=2, c=3 args=(4,) kwargs={'extra_kw': 5} args在函数kwargs中的内容,而无需调用fn

基本上,我正在尝试编写一个函数,该函数将一个函数以及一个参数列表和字典作为输入,并返回额外的fnargs

kwargs

该示例的预期结果将是:

def extract_extra_args_and_kwargs(f, *args, **kwargs):
    ...

我曾尝试使用>>> extract_extra_args_and_kwargs(fn, args, kwargs) ((4,), {'extra_kw': 5}) ,但考虑到Python本身必须在某个地方解决此分配问题,所以我希望可以直接访问相应的函数。

2 个答案:

答案 0 :(得分:7)

这是a

inspect.getcallargs

您在问题中定义的>>> import inspect >>> def fn(a, b, c='default', *args, **kwargs): ... pass ... >>> inspect.getcallargs(fn, 1,2,3,4, extra_kw=5) {'a': 1, 'b': 2, 'c': 3, 'args': (4,), 'kwargs': {'extra_kw': 5}} 将是一个简单的包装器。

extract_extra_args_kwargs

答案 1 :(得分:5)

请注意,自documentation起,从Python 3.5开始,inspect.getcallargs已过时。

使用inspect.signature.bind代替:

from inspect import signature

def extract_extra_args_and_kwargs(f, *args, **kwargs):
    sig = signature(f)
    bound = sig.bind(*args, **kwargs)
    return bound.arguments['args'], bound.arguments['kwargs']

def fn(a, b, c='default', *args, **kwargs):
    print(f'a={a}, b={b}, c={c}')
    print(f'args={args}')
    print(f'kwargs={kwargs}')
args = (1, 2, 3, 4)
kwargs = {'extra_kw': 5}
print(extract_extra_args_and_kwargs(fn, *args, **kwargs))

这将输出:

((4,), {'extra_kw': 5})