Как указано в документации, перечисление представляет собой набор символических имен (элементов), связанных с уникальными значениями констант. PEP8 говорит, что константы обычно называются UPPER_CASE
, следует ли использовать эту нотацию в Python 3.4 enums? Если да, то почему в примерах в документах используется lower_case
?Должно ли 3,4 перечисления использовать UPPER_CASE_WITH_UNDERSCORES?
ответ
Update
BDFL (Доброжелательная Dictator For Life) говорил, и Enum documentation
изменилось, чтобы отразить все имена элементов верхнего регистра.
Примеры в [предыдущих] документы являются строчными в первую очередь потому, что один из модулей, которые ранее существовавших Enum была основана на используемой нижнем регистре (или, по крайней мере, его автор сделал;).
Мой использование перечисления, как правило, было что-то вдоль линий:
class SomeEnum(Enum):
... = 1
... = 2
... = 3
globals().update(SomeEnum.__members__)
, которые эффективно ставит всех членов в пространстве имен модуля.
Так что я бы сказал, какой стиль вам более удобен, но выбирайте стиль и будьте последовательны.
Ммм Мне не нравится использовать перечисления, но это только мое мнение. Я думаю, что буду использовать 'lower_case'. Спасибо за ответ! – cdonts
Я думаю, что они не UPPER_CASE, потому что, это просто странно, когда оно есть. Поскольку вы можете получить доступ только к перечислениям через класс (например, my_enum.VALUE
), это выглядит странно, если члены капитализируются. В C члены перечисления идут в пространство имен модуля, так что это не выглядит странно (для меня), когда члены капитализируются в использовании:
typedef enum {OFF, ON} lightswitch;
lightswitch bathroomLight = ON;
Но в Python доступ к ним через класс перечисления которую вы создаете, и выглядит странно, чтобы перейти от имен ClassStyle к ALL_CAPS.
class Lightswitch(Enum):
OFF = 0
ON = 1
# isn't that weird?
my_light = Lightswitch.OFF
Нижняя линия, я думаю, что это просто эстетично. Однако я ошибался, и понимаю, что это только мое мнение.
Ну, это не более странно, чем, скажем, 're.IGNORECASE'. (На самом деле это не странно, но это субъективно.) – Ryan
@minitech Вы правы; это действительно субъективно. Может быть, разница в том, что 're.IGNORECASE' является константой уровня модуля, а член элемента перечисления больше похож на атрибуты класса. –
Определенно это субъективно, мне нравится нотация 'lowercase.UPPER_CAS'E. Но я думаю, что я буду использовать 'lower_case', как в документах. Благодаря! +1 – cdonts
Когда я сомневаюсь в стиле, я обычно отношусь к стилю, используемому в стандартном библиотечном коде и примерах из официальной документации. Это мешает мне тратить время на произвольные решения.
В этом случае я рекомендую использовать нижний регистр, например, имена переменных.
Да, я думаю, что документация должна быть правильной. Спасибо за Ваш ответ! +1 – cdonts
Конечно. Как говорили другие, важна последовательность. не забудьте принять ответ;) – scry
Хорошо, я согласен с этим, но ответа нет, все ответы хорошие, и это зависит от программиста. Благодарю. – cdonts
В языках, поддерживающих перечисления в качестве граждан первого класса, перечисления! = Константы. Да, члены перечисления могут иметь постоянные значения, но это не то же самое, что переменная является константой. – Kev
+1, я так не думал. Благодарю. – cdonts
FWIW, есть много нарушений PEP8 в стандартном lib ... И все это означает, что это * руководство * в любом случае. Одна из самых важных его частей - знать, когда нужно сгибать/нарушать правила. ИМХО, это немного угловой случай, и я не стал бы винить вас в том, что вы идете в любом случае. Просто будьте последовательны. – mgilson