python - 引用定义中其他类属性的字典类属性

标签 python dictionary class-attributes

虽然有很多方法可以解决这个问题,但由于性格缺陷,在我了解失败的本质之前,我不能放手。

尝试:

class OurFavAnimals(object):
    FAVE = 'THATS ONE OF OUR FAVORITES'
    NOTFAVE = 'NAH WE DONT CARE FOR THAT ONE'
    UNKNOWN = 'WHAT?'
    FAVES = defaultdict(lambda: UNKNOWN, {x:FAVE for x in ['dog', 'cat']})
    FAVES['Crab'] = NOTFAVE 

失败:

      3     NOTFAVE = 'NAH WE DONT CARE FOR THAT ONE'
      4     UNKNOWN = 'WHAT?'
----> 5     FAVES = defaultdict(lambda: UNKNOWN, {x:FAVE for x in ['dog', 'cat']})
      6     FAVES['Crab'] = NOTFAVE

NameError: global name 'FAVE' is not defined
为什么?为什么它可以找到 UNKNOWN 但找不到 FAVE?是因为它是字典理解的吗?

最佳答案

是的,这是因为它是在字典理解中。请注意,它也不是“发现”UNKNOWN;它只是还没有寻找它,因为 UNKNOWN 仅在 lambda 中被引用。如果您用其他内容替换您的 dict 理解以允许类定义成功,那么稍后如果您尝试访问不存在的键(因为那时它将尝试调用该 lambda),您将收到错误。所以如果你把它改成

FAVES = defaultdict(lambda: UNKNOWN, {'a': 1})

你会得到:

>>> OurFavAnimals.FAVES['x']
Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    OurFavAnimals.FAVES['x']
  File "<pyshell#2>", line 5, in <lambda>
    FAVES = defaultdict(lambda: UNKNOWN, {'a': 1})
NameError: global name 'UNKNOWN' is not defined

在这两种情况下,原因是类作用域中定义的变量在嵌套作用域中不可用。换句话说,这与失败的原因相同:

class Foo(object):
    something = "Hello"
    def meth(self):
        print(something)

lambda 和字典推导式都会创建嵌套在类作用域中的函数作用域,因此它们无法直接访问类变量。另请参阅this related question .

关于python - 引用定义中其他类属性的字典类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32257783/

相关文章:

python - pytorch 在张量的某个维度上调用 unique_consecutive() 的最佳方法?

python - For 循环将 pandas 数据框与公共(public)列合并

Python字典内存使用

python - 在 Python 中 pickle 类实例的字典

Python设计——初始化、设置和获取类属性

python - 在类体内使用非局部或全局

python - YAML 和元组作为 dict 键

python - 如何将字符串 '1.000,0.001' 转换为复数 (1+0.001j)?

javascript - 扁平化 Javascript 字典,保留嵌套键

python - 在 python 中重定向函数定义