gpt4 book ai didi

类级代码中字典理解的 Python 范围问题

转载 作者:太空狗 更新时间:2023-10-30 00:07:14 25 4
gpt4 key购买 nike

最小示例

class foo:
loadings = dict(hi=1)
if 'hi' in loadings:
print(loadings['hi'])
# works
print({e : loadings[e] for e in loadings})
# NameError global name 'loadings' not defined

我也试过引用类命名空间,但这也不起作用

class foo:
loadings = dict(hi=1)
if 'hi' in loadings:
print(loadings['hi'])
#works
print({e : foo.loadings[e] for e in foo.loadings})
#NameError: name 'foo' is not defined

当然,这按预期工作

class foo:
loadings = dict(hi=1)
if 'hi' in loadings:
print(loadings['hi'])

print({e : foo.loadings[e] for e in foo.loadings})

我想了解为什么会发生此范围问题,如果我想做一些疯狂的事情,请了解否则最好的方法。我的感觉是第一个代码片段应该按原样工作,但当然没有。

目标

我正在为一些 csv/json 文件创建 DataManager 类/模块以及固定数据库查询,为我的程序和获取数据提供一站式服务。有一些静态数据和一些动态数据,所以在同一个类中似乎很好地使用了静态和非静态数据成员。虽然我知道这些可能是模块级变量,但我喜欢拥有静态类数据成员的概念(可能是因为 Java 的偏见)。非常感谢任何帮助

我的解决方案(目前)

我最终展开了列表理解以留在类范围内,在上面它会变成这样

class foo:
loadings = dict(hi=1)
temp = dict()
for e in loadings:
temp[e] = loadings[e] # keep in mind this is a minimal example, I probably wouldn't do (just) this
print(temp) # works
del temp

它不是很漂亮,但现在可以用了

最佳答案

根据 Name and Binding docs :

The scope of names defined in a class block is limited to the class block; it does not extend to the code blocks of methods – this includes comprehensions and generator expressions since they are implemented using a function scope. This means that the following will fail:

class A:
a = 42
b = list(a + i for i in range(10))

参见 this answer了解更多详情。


在 Python2 中,可以使用列表理解,因为它们是在不使用函数作用域的情况下实现的:

dict([(e,loadings[e]) for e in loadings])

但如果在 Python3 中运行,这段代码会出错。所以这里有一个可以在 Python2 和 Python3 中工作的替代解决方法:

class Foo:
def loadings():
load = dict(hi=1)
if 'hi' in load:
print(load['hi'])
print({e:load[e] for e in load})
return load
loadings = loadings()

print(Foo.loadings)

关于类级代码中字典理解的 Python 范围问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22789088/

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