2016-05-24 2 views
1

Рассмотрим это:Как передать функцию с параметрами с функцией в python?

def function1(): 
    def nestedfunc(param1, **kw): 
     logging.info("nested function %s" % kw) #error 
    function2(nestedfunc("is called"), string="not default") 


def function2(func, string="default"): 
    try: 
     #doing some setting 
     func() 
    finally: 
     #reset back to setting 

Я получаю:

func() 
TypeError: 'NoneType' object is not callable 

Я предполагаю, что FUNC() не передавая параметры и это вызывает ошибку.

Чтобы уточнить, результатом желания является возможность вызова func() с любым количеством добавленных параметров.

Кто-нибудь знает, как правильно это сделать? Любые советы были бы благодарны!

+0

желание, чтобы быть в состоянии назвать FUNC() с любым числом параметров добавлены. – tipsywacky

ответ

4

Ваш function2 recieves func=None, потому что это (по умолчанию) возвращает значение nestedfunc(), которое вызывается с параметром "is called". Вы можете использовать functools.partial к «замораживанию» аргументы некоторой функции в:

результат
from functools import partial 

def function1(): 
    def nestedfunc(param1, **kw): 
     logging.info("nested function %s" % kw) #error 
    function2(partial(nestedfunc, "is called"), string="not default") 
+2

Очень приятно, 'functool.partial' - это правильный путь. –

+0

просто попробовал. Отлично! Благодарю. – tipsywacky

1

nestedfunc("is called") - значение, возвращаемое вызовом функции: None. Вы должны пройти nestedfunc до function2без, назвав его первым.

Если вы хотите передать параметр nestedfunc, сначала передайте его на адрес function2.

def function1(): 
    def nestedfunc(param1, **kw): 
     logging.info("nested function %s" % kw) #error 
    function2(nestedfunc, "is called", string="not default") 


def function2(func, funcparam, string="default"): 
    try: 
     #doing some setting 
     func(funcparam) 
    finally: 
     #reset back to setting 
+0

это то, что я сделал, но моя цель - добавить func() с любым количеством параметров. не уверен, что это возможно. – tipsywacky

+0

Другой ответ делает то, что вы хотите. –

Смежные вопросы