Ну это специфично для сабжевого питоновского enum. А тут возмущаются, что его там не было, хотя во многих других языках (C, например) он есть. Ну вот я и задаю вопрос, какие преимущества у c-шного enum перед тем, как обходятся без enum в Python, учитывая отличия языка Python от C (динамическая типизация, интерпретация вместо компиляции)?
Читать документ лень. Там просто стандартный модуль одобрили или есть что-то, что требует поддержки от интерпретатора? Или есть реализация модулем для старых версий + специальные оптимизации для рантайма?
Ну, привет! Я бы понял ещё, если бы вы сказали это про словари, мол, пишите [«name»] и не меняйте значения. Но индексы вместо имён - просто взять и впустить в код magic numbers. Дальше будет совет писать спагетти-код?
Или вы предложите на каждый индекс определить константу? Которых в python нет. И которые можно прикрутить сбоку каким-нибудь подобным методом и... Эй, минутку! :)))
In [1]: from collections import namedtuple
In [2]: namedtuple?
Type: function
String Form:<function namedtuple at 0x7f70f9d44ed8>
File: /usr/lib/python2.7/collections.py
Definition: namedtuple(typename, field_names, verbose=False, rename=False)
Docstring:
Returns a new subclass of tuple with named fields.
>>> Point = namedtuple('Point', ['x', 'y'])
>>> Point.__doc__ # docstring for the new class
'Point(x, y)'
>>> p = Point(11, y=22) # instantiate with positional args or keywords
>>> p[0] + p[1] # indexable like a plain tuple
33
>>> x, y = p # unpack like a regular tuple
>>> x, y
(11, 22)
>>> p.x + p.y # fields also accessable by name
33
>>> d = p._asdict() # convert to a dictionary
>>> d['x']
11
>>> Point(**d) # convert from a dictionary
Point(x=11, y=22)
>>> p._replace(x=100) # _replace() is like str.replace() but targets named fields
Point(x=100, y=22)
это уже ушло от темы но вообще-то для этого есть 2 варианта
from collections import namedtuple
и еще вариант, который я использую постоянно - просто создается некий класс, его экземпляр и уже в него записываются поля-аттрибуты с нужными именами.
например
class rec:
pass
a = rec()
a.pole1 = 100
a.pole2 = 200
и т.д.
у меня сейчас класс не пустой - есть несколько методов для упрощения создания, присваивания и т.д. в частности, вышенаписанное можно написать как a = rec(pole1=100, pole2=200).
Этот метод хорош для динамической типизации (ибо не надо заранее определять что будет содержать «структура», а также объекты являются mutable в отличие от тупля) но плох тем, что каждый такой объект занимает больше места, чем тупль (т.к. словарь за собой тащит), поэтому если надо хранить большой массив элементов то лучше использовать вариант namedtuple - там на каждый экземпляр памяти надо столько же сколько и на простой тупль.
Но вообще везде где мне бы пришлось запоминать номера позиций в тупле вместо имени поля, использую этот метод. Например, если вдруг функция возвращает более одного параметра - проще использовать «rec».