簡體   English   中英

在 Python 中的 `for` 循環中定義函數時出現問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM