我有一个功能:
def dummy_func(a, b: float, c: int = 1) -> float:
#some code
我想写一个泛型函子(dummy_prepender
),它将接受该函数并构造一个新的函子。与原始函子唯一不同的是,在签名之前附加了一个未使用的参数:
所以对于任何一组参数和伪参数
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)
的结果不是函数,而是描述符对象。有时行为是不一样的。在
我的第一次尝试是这样的:
即将发布的Python3.8实现了PEP 570,它允许以下语法:
^{pr2}$这里是Python 3.8的另一个版本,它保留了以下签名:
相关问题 更多 >
编程相关推荐