2013-12-06 2 views
1

Я хочу создать функцию обертку что-то вроде следующего:как использовать произвольную функцию в функции упаковщика в Python

def functionWrapper(function, **kwargs): 
    """ 
     This function requires as input a function and a dictionary of named arguments for that function. 
    """ 
    results=function(**kwargs) 
     print results 

def multiply(multiplicand1=0, multiplicand2=0): 
    return multiplicand1*multiplicand2 

def main(): 
    functionWrapper(
     multiply, 
     { 
      'multiplicand1': 3, 
      'multiplicand2': 4, 
     } 
    ) 

if __name__ == "__main__": 
    main() 

Я впадающей трудности с этой реализации:

TypeError: functionWrapper() takes exactly 1 argument (2 given) 

Как мне решить эту проблему? Является ли мое использование произвольной функции в функции обертки function(**kwargs) разумной? Спасибо за вашу помощь.

EDIT: исправлена ​​ошибка в описании словаря

+0

Посмотрите декораторы. – wheaties

ответ

3

Используйте ** при прохождении пунктов Dict в этой функции;

**{ 
    'multiplicand1': 3, 
    'multiplicand2': 4, 
    } 

Выход:

12 

Как отметил @svk в комментариях, doctstring functionWrapper «s говорит:

Эта функция требует в качестве входных данных функции и словарь с именем аргументов для этой функции.

Таким образом, в этом случае вам нужно изменить определение функции для:

def functionWrapper(function, kwargs): 

, а также исправить опечатку в Словаре противном случае вы получите 0 в качестве ответа:

'multiplicand1': 3, 
'multiplicand1': 4, #Change this to 'multiplicand2 

'

+1

Обратите внимание на изменение на 'multipicand2' для второго множителя – doctorlove

+0

Это не похоже на docstring для' functionWrapper', который, кажется, говорит, что 'functionWrapper' должен принимать два аргумента: один вызываемый и один словарь, не вызываемое и произвольное количество аргументов ключевого слова. – svk

1

Я чувствую, что дух этого вопроса также просит этого ответа, чтобы сделать его более общей оболочкой.

def functionWrapper(func, *args, **kwargs): 

    results = func(*args, **kw) 

    print results 

def multiply(multiplicand1=0, multiplicand2=0): 
    return multiplicand1*multiplicand2 

if __name__ == "__main__": 

    functionWrapper(multiply, multiplicand1=3, multiplicand2=4) 
    # 12 

    functionWrapper(multiply, 3, 4) 
    # 12 

    functionWrapper(multiply, 3) 
    # 0 

    functionWrapper(multiply) 
    # 0 

    functionWrapper(multiply, 5, multiplicand2=4) 
    # 20