2016-10-27 3 views
0

Недавно я принимал участие в обсуждении 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?

Спасибо, Марк

ответ

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 
+0

Спасибо, что сработало. Кажется, я слишком привык к неявному кастингу на Python. – volcano

Смежные вопросы