考虑一下:
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 :(得分:4)
您的function2
收到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")
答案 1 :(得分: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