Python:枚举值与命名单元

标签 python python-3.x enums enumeration

最近参加了一个关于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

在我的书中,任何需要在整个项目中添加代码的方法都是低效的,所以 - 同时感谢您的建议! - 我将回到良好的namedtuple方法。

问题是 - 为什么 enum 属性不支持属性的隐式解引用?是3.5.2中的实现错误吗?

谢谢, 标记

最佳答案

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

关于Python:枚举值与命名单元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40277038/

相关文章:

python - 无法访问 HTMLParser 中的新变量

python - 当父级位于隐式命名空间中时,BeautifulSoup 会删除子级

python-3.x - 在 panda 数据框中检测星期六并修改行中的值

python - 使用枚举项作为列表索引

c - 使用变量按名称搜索枚举?

python - 根据有条件的另一个系列更新系列中的值

python - 在 Tensorflow 中将一组常量(一维数组)与一组矩阵(三维数组)相乘

python - Bokeh - 如何在两个不同的选项卡中拥有相同的小部件(或复制小部件)?

python-3.x - Tkinter:使用 after() 使函数定期运行

java - Hibernate 不断为我的枚举创建表