Python标准库/常用库是否存在封装args与kwargs的Args类?
核心问题答复
Python标准库没有原生提供你所描述的Args容器类,该类的实现逻辑极简,通常业务场景下开发者会自行实现,也有多种替代方案可以满足你的需求:
标准库层面的替代方案
- 针对你提到的
functools.partial参数顺序不符合要求的问题,可通过简单的lambda封装实现右偏绑定效果,即后续调用时优先传入前置参数:
from functools import partial # 原始partial是左绑定:调用时新参数加在已有参数后面 # 封装后实现右绑定:调用时新参数放在已有参数前面 def rpartial(func, *args, **kwargs): return lambda *new_args, **new_kwargs: func(*new_args, *args, **kwargs, **new_kwargs) # 使用示例 foo = rpartial(basic_foo, "foo1_val", "foo2_val") foo(x) # 等价于 basic_foo(x, "foo1_val", "foo2_val")
- 如果不需要绑定目标函数,仅需要存储args和kwargs,标准库场景下直接使用
(tuple, dict)二元组即可满足需求,无需额外定义类。
第三方库的现成实现
- 常用工具库
funcy提供了原生的rpartial右偏函数,功能和上面示例的封装完全一致,直接导入即可使用。 - 如果你需要强类型的Args容器,使用pydantic、attrs等数据类库可快速生成符合要求的类,无需手动编写初始化逻辑。
附加问题答复
你期望的Args[目标函数]形式的类型标注完全可行,借助Python的ParamSpec泛型特性即可实现,示例实现如下:
from typing import Generic, ParamSpec P = ParamSpec("P") class Args(Generic[P]): def __init__(self, *args: P.args, **kwargs: P.kwargs) -> None: self.args = args self.kwargs = kwargs # 标注示例 def higher_level_func( baz1, baz2, foo_args: Args[basic_foo], bar_args: Args[basic_bar] ): x = basic_foo(x, *foo_args.args, **foo_args.kwargs) x = basic_bar(x, *bar_args.args, **bar_args.kwargs)
MyPy 0.981+、PyCharm 2023.1+版本都可以正确识别该标注,参数不匹配时会触发类型错误提示。
内容的提问来源于stack exchange,提问作者Albert
相关产品推荐
相关产品推荐

