Недавно я принимал участие в обсуждении enumeration in Python. Ethan Furman предположил, что нет необходимости повторно изобретать колесо, а когда есть стандартный перечислить пакет - не нужно играть вокруг.Python: перечислимые значения против именованных
Итак, наконец, после перехода на 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
В моей книге, любой подход, который требует добавления кода всего проекта виноват в неэффективности, поэтому - благодарен за предложение! - Я возвращаюсь к хорошему ol 'namedtuple.
Вопрос в том, почему не enum Атрибут поддерживает неявное разыменование атрибутов? Это ошибка реализации в 3.5.2?
Спасибо, Марк
Спасибо, что сработало. Кажется, я слишком привык к неявному кастингу на Python. – volcano