最近我参加了关于enumeration in Python的讨论。 Ethan Furman建议不需要重新发明轮子,并且当有标准的 enum 包时 - 无需玩耍。
所以,在最终切换到3.5后,我尝试了 - 结果是 enum.Enum 定义的字符串常量需要取消引用,至少在某些情况下的API。
这是对我不起作用的简化示例
In [83]: consts = collections.namedtuple('consts', 'PATH')('/usr/bin')
In [84]: consts.PATH
Out[84]: '/usr/bin'
In [85]: os.path.exists(consts.PATH)
Out[85]: True
In [86]: consts = enum.Enum('consts', [['PATH','/usr/bin']])
In [87]: os.path.exists(consts.PATH)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-87-c4641f1a4c50> in <module>()
----> 1 os.path.exists(consts.PATH)
/usr/local/Cellar/python3/3.5.2_1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/genericpath.py in exists(path)
17 """Test whether a path exists. Returns False for broken symbolic links"""
18 try:
---> 19 os.stat(path)
20 except OSError:
21 return False
TypeError: argument should be string, bytes or integer, not consts
当然,那是有效的
In [90]: os.path.exists(consts.PATH.value)
Out[90]: True
在我的书中,任何需要在整个项目中添加代码的方法都会导致效率低下,所以 - 同时感谢建议! - 我要回到好的&#39; namedtuple 方法。
问题是 - 为什么 enum 属性不支持隐式取消引用属性?它是3.5.2中的实现错误吗?
谢谢, 标记
答案 0 :(得分:3)
enum.Enum
是一个基类。如果您在设置课程时也继承str
,那么它应该按预期工作:
In [34]: class consts(str, enum.Enum):
....: PATH = r"C:\Windows"
....:
In [35]: consts.PATH
Out[35]: <consts.PATH: 'C:\\Windows'>
In [36]: os.path.exists(consts.PATH)
Out[36]: True