【问题标题】:Calling a class member variable from within the same class gives a NameError in Python从同一个类中调用类成员变量会在 Python 中产生 NameError
【发布时间】:2019-08-14 11:51:54
【问题描述】:

我试图从其类中调用一个类成员变量,但我得到一个NameError: name '...' is not defined

通过以下最小工作示例创建了类似的情况:

from pprint import pprint


class MyClass:

    _my_class_variable = {'key_0': 0,
                          'key_1': 1}
    _my_keys = _my_class_variable.keys()

    pprint(_my_class_variable)  # WORKS!
    pprint([value for value in _my_class_variable.values()])  # WORKS!
    pprint([_my_class_variable[key] for key in _my_keys])  # DOES NOT WORK!
    pprint([_my_class_variable[key] for key in _my_class_variable.keys()])  # DOES NOT WORK!

返回NameError: name '_my_class_variable' is not defined

前两个pprint 命令如何工作,而后两个pprint 命令不能工作?

【问题讨论】:

    标签: python static


    【解决方案1】:

    列表解析中的所有内容都在单独的范围内运行(基本上作为函数),除了用于循环的可迭代对象。因此,在不起作用的行上,_my_class_variable 没有定义。

    解决此问题的一种方法是确保将 _my_class_variable 传递给立即执行的 lambda 函数,以便它在列表理解的范围内可用:

    pprint((lambda _my_class_variable : [_my_class_variable[key] for key in _my_class_variable.keys()])(_my_class_variable))  # DOES WORK!
    # or
    pprint((lambda _my_class_variable=_my_class_variable : [_my_class_variable[key] for key in _my_class_variable.keys()])())  # DOES WORK!
    

    为什么会这样?列表推导在 Python 3 中有自己的独立作用域,并被包装在一个临时函数对象中并立即调用。如果您要为_my_class_variable 创建显式范围,例如在函数中,解析_my_class_variable 时将考虑其范围。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-03
      • 2016-07-24
      • 1970-01-01
      • 2010-11-26
      • 2023-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多