首页 > 解决方案 > 模拟将函数参数分配给 *args 和 **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}
>>> fn(*args, **kwargs)
a=1, b=2, c=3
args=(4,)
kwargs={'extra_kw': 5}

我想提取函数中的内容args和内容,而无需调用.kwargsfnfn

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

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

该示例的预期结果是:

>>> extract_extra_args_and_kwargs(fn, args, kwargs)
((4,), {'extra_kw': 5})

我试过玩弄inspect.signature,但鉴于 Python 本身必须在某个地方解决这个任务,我希望我可以直接访问相应的函数。

标签: python

解决方案


这是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在问题中定义的内容将是一个简单的包装器。

def extract_extra_args_kwargs(fn, args, kwargs):
    x = inspect.getcallargs(fn, *args, **kwargs)
    return x['args'], x['kwargs']

推荐阅读