2010-08-20 4 views
8

Я ищу способ проверить количество аргументов, которые данная функция принимает в Python. Целью является создание более надежного метода исправления моих классов для тестов. Итак, я хочу сделать что-то вроде этого:Есть ли способ проверить подпись функции в 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! 

Спасибо.

+0

"заплат мои классы для испытаний"? Почему вы не используете макетные объекты? http://python-mock.sourceforge.net/? –

+1

Я новичок в использовании mocks. Я «рос», ступив и исправляя. Я получаю практику и выясняю, когда использовать это, но в то же время у меня все еще есть проекты, которые нужно закончить, и тесты для написания :). – mjumbewu

ответ

9

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

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

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

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

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

Getting method parameter names in python

+0

Я вижу. Я сделал немного поиска, прежде чем отправлять сообщения, но я предполагаю, что должен использовать больше поисковых запросов. Извините за беспокойство. – mjumbewu

+0

Нет проблем. Лучше указать на вас на другие ответы, хотя, чем просто повторить все здесь. –