Python向函数signatu添加伪参数

2024-04-29 08:10:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个功能:

def dummy_func(a, b: float, c: int = 1) -> float:
    #some code

我想写一个泛型函子(dummy_prepender),它将接受该函数并构造一个新的函子。与原始函子唯一不同的是,在签名之前附加了一个未使用的参数:

^{pr2}$

所以对于任何一组参数和伪参数

dummy_method(dummy_arg, arguments...)的行为与dummy_func(arguments...)完全相同。在

我原以为@staticmethod可以做到这一点,但是在某些地方,调度的发生方式不同,应用staticmethod没有效果。在

一些行为测试:

help(dummy_method)应显示正确的签名

dummy_method(dummy='', a=1)应该失败

dummy_method(dummy='', a=1, b=2, c=3, z=4)应该失败

更新

以下是staticmethod未按预期工作的示例:

例1

^{3}$

例2:

factory_type2 = type('Typ1', (), {
    '__new__': staticmethod(dummy_func),
})

#Call behavior is broken
factory_type2(a=1, b=2)
# TypeError: dummy_func() got multiple values for argument 'a'

factory_type2(7, 13)
# locals()={'c': 13, 'b': 7, 'a': <class '__main__.Typ1'>}
# See how the class got passed as `a` instead of `dummy`

staticmethod(func)的结果不是函数,而是描述符对象。有时行为是不一样的。在


Tags: 函数功能参数factoryfloatargumentsmethodclass
1条回答
网友
1楼 · 发布于 2024-04-29 08:10:47

我的第一次尝试是这样的:

def dummy_method(*args, **kwargs) -> float:
    return dummy_func(*args[1:], **kwargs)

即将发布的Python3.8实现了PEP 570,它允许以下语法:

^{pr2}$

这里是Python 3.8的另一个版本,它保留了以下签名:

def dummy_method(dummy, /, a, b: float, c: int = 1) -> float:
    return dummy_func(a, b, c)

相关问题 更多 >