2017-02-11 8 views
2

Недавно я начал использовать python3 и обнаружил, что существует встроенный тип Enum, и его можно использовать так, как он используется в Java, скажем, для создания однопользовательского режима. Я могу загрузить конфиг моей телеграммы бота, как это:Правовое использование перечислений в python

class Config(Enum): 

    DATA = 'data' 

    def __init__(self, dummy): 
     with open('./app/config/data.yml', 'r') as f: 
      self.__data = yaml.load(f) 

    def __getitem__(self, item): 
     """ 
     May be too expensive, but config should not be mutable 
     so it returns a defensive copy for mutable sequences. 
     :param item: requested item 
     :return: value of the item 
     """ 
     value = self.__data[item] 
     return deepcopy(self.__data[item]) if isinstance(value, (MutableMapping, MutableSequence)) else value 

    @property 
    def authorized_url(self): 
     return '{}/bot{}'.format(self['base_url'], self['token']) 

    @property 
    def updates_url(self): 
     return self.authorized_url + self['endpoints']['get_updates'] 

    @property 
    def send_message_url(self): 
     return self.authorized_url + self['endpoints']['send_message'] 

Я предполагаю, что это уместно, как конфигурации является своим родом одноточечного, и я не должен беспокоиться о создании экземпляра. Он создается автоматически во время импорта модуля и инкапсулируется внутри класса. Поэтому я получаю все только из коробки, плюс я могу определить удобные методы для агрегирования значений.

Так что мне любопытно, можно ли использовать перечисления, подобные этому в python? Если нет, я хотел бы услышать, почему нет.

+0

Не используйте префикс с двойным подчеркиванием; одно подчеркивание является конфиденциальным по соглашению. – Ryan

+0

Одиночное подчеркивание должно указывать защищенный атрибут, в то время как двойное подчеркивание означает «частный». – Atomikin

+1

Нет, двойное подчеркивание означает «Я пытаюсь применить Java к Python». Избегайте. Избегайте одиночных игр. – Ryan

ответ

2

Это не назначение перечислений. Это использует побочный эффект перечислений, чтобы сделать что-то еще полностью.

.. и мне не нужно беспокоиться о создании экземпляра.

Создание экземпляра в этом случае одна строка кода:

my_config = Config() 

И включение этой одной линии позволило бы ликвидацию одной линии, как это:

from enum import Enum 
class Config(Enum): 

будет просто:

class Config(): 

Таким образом, эта конструкция на самом деле требует большего количества кода для выражения и, кажется, довольно преувеличена. Если бы я просмотрел это в обзоре кода, я бы отклонил его.

+0

Благодарим вас за ответ. Но перечисление также гарантирует, что существует только ограниченное количество экземпляров класса, то есть оно одноэлементное. В том, что вы предлагаете, можно создать столько экземпляров, сколько хотелось бы. – Atomikin

+0

Существует поговорка на python, которая гласит: «Мы все взрослые здесь». Это означает, что в целом python не предоставляет механизмов, чтобы заставить программистов не быть глупым. –

+0

Согласен. Похоже, я его превзошел. Спасибо за объяснение! – Atomikin

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