使用类定义中的连接从字典理解中访问类变量时出错

时间:2018-06-11 17:26:52

标签: python python-2.7

所以我正在使用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中不起作用的答案。简单的列表理解和字典理解对我来说很好但是在我更复杂的代码中出现的问题似乎导致了这个问题。

有人对此有答案吗?

1 个答案:

答案 0 :(得分:0)

根据@ juanpa.arrivillaga,您链接的相同问题适用于此处。这个答案是一个社区维基,所以随时添加信息。

代码在没有理解的情况下工作正常,that link提到了其他建议,以便使用__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])