有没有办法在 Python 中检查函数的签名?

Posted

技术标签:

【中文标题】有没有办法在 Python 中检查函数的签名?【英文标题】:Is there a way to check a function's signature in Python? 【发布时间】:2011-04-01 21:09:13 【问题描述】:

我正在寻找一种方法来检查给定函数在 Python 中接受的参数数量。目的是实现一种更强大的方法来修补我的类以进行测试。所以,我想做这样的事情:

class MyClass (object):
    def my_function(self, arg1, arg2):
        result = ... # Something complicated
        return result

def patch(object, func_name, replacement_func):
    import new

    orig_func = getattr(object, func_name)
    replacement_func = new.instancemethod(replacement_func, 
                           object, object.__class__)

    # ...
    # Verify that orig_func and replacement_func have the 
    # same signature.  If not, raise an error.
    # ...

    setattr(object, func_name, replacement_func)

my_patched_object = MyClass()
patch(my_patched_object, "my_function", lambda self, arg1: "dummy result")
# The above line should raise an error!

谢谢。

【问题讨论】:

“为我的课程打补丁以进行测试”?你为什么不使用模拟对象? python-mock.sourceforge.net? 我不熟悉使用模拟。我“长大”了打桩和打补丁。我正在练习并弄清楚何时使用哪个,但与此同时,我还有项目要完成,还有要编写的测试:)。 【参考方案1】:

你可以使用:

import inspect
len(inspect.getargspec(foo_func)[0])

这不会承认可变长度参数,例如:

def foo(a, b, *args, **kwargs):
    pass

【讨论】:

【参考方案2】:

inspect.getargspec 在 Python 3 中已弃用。请考虑以下内容:

import inspect
len(inspect.signature(foo_func).parameters)

【讨论】:

【参考方案3】:

你应该使用inspect.getargspec

【讨论】:

【参考方案4】:

inspect 模块允许您检查函数的参数。这在 Stack Overflow 上被问过几次;尝试搜索其中一些答案。例如:

Getting method parameter names in python

【讨论】:

我明白了。在发布之前我做了一些搜索,但我想我应该使用更多的搜索词。抱歉打扰了。 没问题。不过,最好向您指出其他答案,而不是在这里重复所有内容。

以上是关于有没有办法在 Python 中检查函数的签名?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法从重载的 TS 方法中提取所有函数签名?

有没有办法确定 Lua 函数的签名?

有没有办法在 Python 函数的每一行上装饰/执行操作?

在函数的签名中,如果星号后面没有标识符名称,那么它在 Python 中的含义是啥? [复制]

如何在 firebase 函数中检查 Stripe webhook 签名

如何检查文件是不是在 C# 中签名? [关闭]