首页 > 解决方案 > 在类定义中加入从字典理解访问类变量时出错

问题描述

所以我正在使用 Python 2.7 编写一个程序

from itertools import product
class Foo:
    ordinal_combos = ["".join(map(str, list(x))) for x in product(xrange(8), xrange(8), xrange(8))] # ['000', '001', ...]
    perms_digits = {"0": "---", "1": "--x", "2": "-w-", "3": "-wx", "4": "r--", "5": "r-x", "6": "rw-", "7": "rwx"}
    perms_dict = {x: "".join([perms_digits[y] for y in x]) for x in ordinal_combos}

我得到这个错误:

Traceback (most recent call last):
 File "/usr/local/lib/python2.7/dist-packages/nose/loader.py", line 418, in loadTestsFromName
  addr.filename, addr.module)
 File "/usr/local/lib/python2.7/dist-packages/nose/importer.py", line 47, in importFromPath
  return self.importFromDir(dir_path, fqname)
 File "/usr/local/lib/python2.7/dist-packages/nose/importer.py", line 94, in importFromDir
  mod = load_module(part_fqname, fh, filename, desc)
 File "/home/automaton/test.py", line 14, in <module>
  class DsefsRecursivePermissionsChangeTest(DsefsTestBase):
 File "/home/automaton/test.py", line 26, in DsefsRecursivePermissionsChangeTest
  perms_dict = {x: "".join([perms_digits[y] for y in x]) for x in ordinal_combos} # {'000': "---------"}, ...
 File "/home/automaton/test.py", line 26, in <dictcomp>
  perms_dict = {x: "".join([perms_digits[y] for y in x]) for x in ordinal_combos} # {'000': "---------"}, ...
NameError: global name 'perms_digits' is not defined

我已经查看了这个问题的答案:Accessing class variables from a list comprehension in the class definition,这是为什么它在 Python 3 中不起作用但在 Python 2 中不起作用的答案。简单的列表理解和字典理解只适用对我来说很好,但我更复杂的代码中的某些东西似乎导致了这个问题。

有人对此有答案吗?

标签: pythonpython-2.7

解决方案


根据@juanpa.arrivillaga,您链接到的相同问题也适用于此处。此答案是一个社区 wiki,因此请随时添加信息。

该代码在没有理解的情况下可以正常工作,并且该链接中提到了其他建议,以获取其他解决方法,例如使用__init__方法。

from itertools import product
class Foo:
    ordinal_combos = ["".join(map(str, list(x))) for x in product(xrange(8), xrange(8), xrange(8))] # ['000', '001', ...]
    perms_digits = {"0": "---", "1": "--x", "2": "-w-", "3": "-wx", "4": "r--", "5": "r-x", "6": "rw-", "7": "rwx"}
    perms_dict = {}
    for x in ordinal_combos:
        for y in x:
            perms_dict[x] = "".join(perms_digits[y])

~


推荐阅读