如何设置功能的签名?

时间:2016-07-22 01:56:55

标签: python

我尝试使用inspect模块更改函数的签名:

import inspect

def some_func(a, b):
    return

sig = inspect.signature(some_func)
new_params = list(sig.parameters.values()) + [inspect.Parameter('c', inspect._ParameterKind.POSITIONAL_OR_KEYWORD)]
new_sig = sig.replace(parameters=new_params)
some_func.__signature__ = new_sig

当我检查功能的签名时,它会显示新的签名:

>>> inspect.signature(some_func)
>>> <Signature (a, b, c)>

但是当我尝试根据新签名调用该函数时,我得到一个TypeError:

>>> some_func(1, 2, 3)
>>> TypeError: some_func() takes 2 positional arguments but 3 were given

如何设置签名,以便解释器根据新签名而不是原始签名检查参数?

2 个答案:

答案 0 :(得分:0)

重新分配函数签名不是Python支持的。

大多数函数使用其参数执行。如果你以某种方式设法改变了一个函数的签名,那么函数体就没有合适的参数可供使用。这不是一件有意义的事情。

如果您无论如何都非常坚持这样做,那么您必须做一些像使用该功能的__code__。这是一个低级实现细节,以这种方式搞乱它可能会使Python崩溃或更糟。

答案 1 :(得分:0)

我认为这是一个类别错误。您可以通过检查现有功能来创建Signature对象,但不能按照您尝试的方式为现有功能分配新签名。

也就是说,hasattr(some_func, '__signature__')会返回False。您在脚本中分配了它,但您可以为函数分配任意属性。

要实际创建一个修改现有功能的功能,您必须将其包裹起来。