Я ищу способ проверить количество аргументов, которые данная функция принимает в 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!

Спасибо.

15
mjumbewu 21 Авг 2010 в 00:57

4 ответа

Лучший ответ

Ты можешь использовать:

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

Это не будет подтверждать параметры переменной длины, такие как:

def foo(a, b, *args, **kwargs):
    pass
15
carl 20 Авг 2010 в 21:02

inspect позволяет изучать аргументы функции. Об этом несколько раз спрашивали о переполнении стека; попробуйте найти некоторые из этих ответов. Например:

Получение имен параметров метода в python

2
Community 23 Май 2017 в 12:09

inspect.getargspec устарел в Python 3. Рассмотрим что-то вроде:

import inspect
len(inspect.signature(foo_func).parameters)
2
Tahlor 12 Авг 2019 в 16:40

Вы должны использовать inspect.getargspec.

6
hwiechers 20 Авг 2010 в 21:00