[英]Problem while defining a function in a `for` loop in Python
我有以下重現該問題的最小示例:
def f1(a, b):
print(1)
return a + b
def f2(a, b):
print(2)
return a * b
funcs = f1, f2
_funcs = []
for func in funcs:
def _func(x):
return func(*x)
_func.__name__ = func.__name__
_funcs.append(_func)
funcs = _funcs
for func in funcs:
print(func([2, 3]))
這會拋出一個TypeErro
:
類型錯誤:_func() 需要 1 個位置參數,但給出了 2 個
具有以下追溯:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-93-e24e67b5e525> in <module>()
22
23 for func in funcs:
---> 24 print(func([2, 3]))
<ipython-input-93-e24e67b5e525> in _func(x)
14
15 def _func(x):
---> 16 return func(*x)
17
18 _func.__name__ = func.__name__
TypeError: _func() takes 1 positional argument but 2 were given
我不知道為什么在我看來_func()
總是用一個參數調用。
我懷疑我想做的事情會用functools
來完成,但我仍然不明白為什么上面的代碼會這樣工作。 任何提示?
當您定義時,您正在關閉自由變量func
:
def _func(x):
return func(*x)
然而,在你的循環中,你重復使用這個名字,
for func in funcs:
print(func([2, 3]))
所以func
現在指的是你定義的單參數函數,甚至在_func
里面! 所以當然,當該函數調用func(*x)
它實際上是在遞歸調用自身。 使用不同的名稱:
for f in funcs:
print(f([2, 3]))
或者更好的是,不要依賴你不打算自由的自由變量:
def func_maker(func):
def _func(x):
return func(*x)
return _func
並使用它:
...
_funcs = []
for func in funcs:
_func = func_maker(func)
_func.__name__ = func.__name__
_funcs.append(_func)
funcs = _funcs
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.