gpt4 book ai didi

python - 'NameError : global name is not defined' under pdb, 对于确实存在的字典

转载 作者:太空狗 更新时间:2023-10-30 00:31:35 27 4
gpt4 key购买 nike

我在 lambda 函数中遇到了范围问题。我可以成功地将 foo 输出到标准输出,但是在使用包含 lambdamax() 时出现错误 - 请参阅下面的简化代码...

总而言之,我试图在未知数量的一阶键中找到嵌套键 budget 的最大值。

(Pdb) foo = self.some_method()    # some_method() returns a dict, printed in the next step

(Pdb) pp foo

{'1': {'count': 1,
'extra_data': {'activity-count': 1,
'budget': 0,
[...MORE KEY-VALUE PAIRS HERE...]
'version': 1},
[...LOTS MORE KEY-VALUE PAIRS HERE...]
'elements_total': defaultdict(<type 'int'>, {'result': 1, 'another_key': 2}),
'extra_year_data': defaultdict(<function <lambda> at 0x10e05bd70>, {})},

'2': {'count': 1,
'extra_data': {'activity-count': 1,
'budget': 3,
[...MORE KEY-VALUE PAIRS HERE...]
'version': 1},
[...LOTS MORE KEY-VALUE PAIRS HERE...]
'elements_total': defaultdict(<type 'int'>, {'result': 1, 'another_key': 2}),
'extra_year_data': defaultdict(<function <lambda> at 0x10e05bd70>, {})}}

(Pdb) max(foo, key=lambda x: foo[x]['extra_data']['budget'])
*** NameError: global name 'foo' is not defined

总而言之,我正在尝试使用 max(foo, key=lambda x: foo[x]['extra_data']['budget']) 来找到 a 的最大值在未知数量的一阶键中嵌套键 budget

这种情况下的预期结果可能是 2 作为 foo['2']['extra_data']['budget'] = 3 的值与foo['1']['extra_data']['budget'] = 0

错误是否与某些(不相关的)键中包含 defaultdict 的事实有关?

最佳答案

您使用 pdb 设置了一个新的 local,但是在这个调试器 session 中使用嵌套作用域的表达式看不到它。嵌套范围内的任何表达式,例如用于key 参数的lambda,使用当前帧的本地名称,都需要做一个闭包就会有这个问题。

这是调试器和 Python 编译工作方式的限制;只有在需要生成它们的函数是在同一个 session 中编译的情况下,才能创建闭包。由于您正在调试的函数是在没有 foo 闭包的情况下编译的,因此 lambda 表达式本身不能使用它。

您可以将本地绑定(bind)到 lambda(使其成为本地而不是闭包):

max(foo, key=lambda x, foo=foo: foo[x]['extra_data']['budget'])

参见 What exactly is contained within a obj.__closure__?有关 Python 编译器如何创建闭包的详细信息。

关于python - 'NameError : global name is not defined' under pdb, 对于确实存在的字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35151732/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com