簡體   English   中英

模擬* args和** kwargs的函數參數賦值

[英]Simulate the assignment of function arguments to *args and **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}

我想提取函數fn中的argskwargs ,而不調用fn

基本上,我正在嘗試編寫一個函數,它將一個函數和一個參數的列表和字典作為輸入,並返回額外的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本身必須在某處解決此賦值,我希望我可以直接訪問相應的函數。

這是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']

請注意,自Python 3.5以來,每個文檔 inspect.getcallargs推薦使用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})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM