You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python标准库/常用库是否存在封装args与kwargs的Args类?

核心问题答复

Python标准库没有原生提供你所描述的Args容器类,该类的实现逻辑极简,通常业务场景下开发者会自行实现,也有多种替代方案可以满足你的需求:

标准库层面的替代方案

  1. 针对你提到的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")
  1. 如果不需要绑定目标函数,仅需要存储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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 19:24:02