python中的法律枚举用法

时间:2017-02-11 14:05:45

标签: python python-3.x enums singleton

最近我开始使用python3并发现有内置的Enum类型,并且可以像在Java中一样使用它,比如用于单例创建。我可以像这样加载我的电报机器人的配置:

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中使用这样的枚举是否可以? 如果没有,我想听听为什么不。

1 个答案:

答案 0 :(得分:2)

这不是枚举的目的。这是使用枚举的副作用来完全做其他事情。

  

..而且我不必为创建实例而烦恼。

在这种情况下,实例创建是一行代码行:

my_config = Config()

包含这一行将允许消除一行,如下:

from enum import Enum
class Config(Enum):

变得简单:

class Config():

所以这个构造实际上需要更多代码来表达,而且似乎相当过分。如果我在代码审查中遇到这个问题,我会拒绝它。