2017-02-11 116 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

謝謝你的回答。但是enum也確保只有有限個類的實例,即它是一個單例。在你的建議中,可以創建儘可能多的實例。 – Atomikin

+0

這裏有一句python格言:「我們都是大人」。也就是說,一般python不提供強制程序員不要傻的機制。 –

+0

我同意。好像我過度了。感謝您的解釋! – Atomikin