【问题标题】:Python: enumerated values vs. nameduplesPython:枚举值与nameduples
【发布时间】:2016-10-27 05:50:27
【问题描述】:

最近我参加了一个关于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 的实现 bug?

谢谢, 标记

【问题讨论】:

    标签: python python-3.x enums enumeration


    【解决方案1】:

    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 进行隐式转换了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    • 2023-04-01
    • 2015-08-08
    • 2012-09-16
    • 1970-01-01
    • 2022-07-07
    • 1970-01-01
    相关资源
    最近更新 更多