最近我开始使用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中使用这样的枚举是否可以? 如果没有,我想听听为什么不。
答案 0 :(得分:2)
这不是枚举的目的。这是使用枚举的副作用来完全做其他事情。
..而且我不必为创建实例而烦恼。
在这种情况下,实例创建是一行代码行:
my_config = Config()
包含这一行将允许消除一行,如下:
from enum import Enum
class Config(Enum):
变得简单:
class Config():
所以这个构造实际上需要更多代码来表达,而且似乎相当过分。如果我在代码审查中遇到这个问题,我会拒绝它。