如何在Python中检查函数的签名?

22 投票
6 回答
17482 浏览
提问于 2025-04-16 03:06

我想找一种方法来检查一个函数在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!

谢谢。

6 个回答

5

你应该使用 inspect.getargspec 这个功能。

21

inspect.getargspec 在 Python 3 中已经不推荐使用了。可以考虑使用其他方法,比如:

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

这样做会把 argskwargs 作为一个参数包含进来,每个参数都是单独的。

如果你不想包含 argskwargs,可以考虑:

len(inspect.getfullargspec(foo)[0])
16

你可以使用:

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

但是这样做不会识别可变长度的参数,比如:

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

撰写回答