DRYly表示设置对象的列表

时间:2014-04-09 20:54:08

标签: python django design-patterns

我正在勾勒出一个有一些不同布尔字段的Django模型:

video_enabled = models.BooleanField()
audio_enabled = models.BooleanField()
sensors_enabled = models.BooleanField()
backup_enabled = models.BooleanField()

我有许多不同的'模式',它们具有涉及这些布尔值的不同设置。我想在某种字典结构中存储这些模式的'默认值',这样我就可以根据我想要恢复它的模式轻松地将设置模型重置为默认状态。为了存储这些设置,我一直在做这样的事情:

SETTINGS = { 
    'mode_1': {
        'video': True,
        'audio': True,
        'sensor': True,
        'backup': True
    }
    'mode_2': {
         'video': False,
         'audio': False,
    .... etc. .....

随着模式数量的增加,这显然会变得非常重复。

是否有更好的DRYer设计模式可以在Python中代表这一点?我正在考虑枚举,但我有点不想被锁定到每个组件需要知道的有序序列,以便与django服务器通信。

1 个答案:

答案 0 :(得分:1)

如果您不想总是重复相同的键,请将它们放入列表中:

keys = ['audio', 'video', 'sensor', 'backup']

SETTINGS = {
    'mode_1': dict.fromkeys(keys, True),
    'mode_2': dict.fromkeys(keys, False),
}

如果默认设置可能有不同的值,那么您仍然可以使用zip来构建序列,从而避免重复这些键:

SETTINGS = {
    'mode_3': dict(zip(keys, [True, False, False, True])),
}

实际上你可以指定每种模式的值,然后在dict理解中构建字典:

import itertools as it
keys = ['audio', 'video', 'sensor', 'backup']

SETTINGS_LIST = (
    ('mode_1', it.repeat(True)), 
    ('mode_2', it.repeat(False)), 
    ('mode_3', [True, False, False, True]),
)

SETTINGS = {mode: dict(zip(keys, values)) for mode, values in SETTINGS_LIST}

这不会重复任何值或关键字面值,只会在一个地方调用dictzip