Python doit:子任务产生相同的最新可调用项

问题描述 投票:0回答:2

我对以下代码有疑问。

请原谅我,我是python新手。

以下代码在我的dodo.py中:

def closed_over(par):
    print("\n??? " + par)
    if par == "bar":
        return False
    else:
        return True

def task_bug():
    for par in ("foo", "bar"):
        print("par: " + par)
        # closure!
        exist_fn = lambda: closed_over(par)
        print(exist_fn)

        yield {
            "name": par,
            "actions": [["echo", "action:", par]],
            "verbosity": 2,
            "uptodate": [exist_fn]
        }

[当我运行doit bug:foo时,我希望不执行它(closed_over返回True),但是:

par: foo
<function task_bug.<locals>.<lambda> at 0x7f8926f9a560>
par: bar
<function task_bug.<locals>.<lambda> at 0x7f8926f9a5f0>

??? bar      <- par should be foo
.  bug:foo
action: foo  <- echo was called

如您所见,yield之外的两个闭包是不同的函数对象,但由于某些原因,uptodate总是调用相同的对象。

doit
2个回答
1
投票

您的问题与python闭包作用域有关(它的作用域变量不是值)...与doit无关。关于堆栈溢出,这里可能有很多问题:)

Python lambda closure scoping

您可以在yield之外看到两个闭包,它们是不同的函数对象,但是由于某些原因,uptodate总是调用相同的对象。

不,它没有调用相同的闭包。问题是与参数相同的变量。]​​>


0
投票

事实证明,我认为python具有动态范围,而实际上却进行了词法作用域。

© www.soinside.com 2019 - 2024. All rights reserved.