python - 在类定义中加入从字典理解访问类变量时出错
问题描述
所以我正在使用 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 中不起作用的答案。简单的列表理解和字典理解只适用对我来说很好,但我更复杂的代码中的某些东西似乎导致了这个问题。
有人对此有答案吗?
解决方案
根据@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])
~
推荐阅读
- c++ - std::atomic::fetch_add 是 x86-64 上的序列化操作吗?
- sql - 有没有办法在解析 XML 数据时删除显式属性名称?
- javascript - 在 Map v3 API 中无法计算距离(两个坐标之间,不考虑骑行、驾驶等旅行模式)
- r - 选择要在 r shinyapps 中显示的滑块
- delphi - 将 cURL 标头转换为 Delphi TIdHTTP
- python - 带有 python 服务器和 sqlite 的网页
- javascript - 嵌套的 for 循环无法正确迭代
- mysql - mysql 从另一列中选择列值
- c# - Telegram Bot 使 InlineKeyboardMarkup 按钮无法点击
- ms-access - 在数组中查找某些信息