配置dict构造模式,使用帮助器类?

时间:2013-07-09 11:56:25

标签: python class dictionary

有人向我建议,作为一种惯例,可以在“选项”类的帮助下支持在Python中构建配置dict,如下所示:

...
config = {Options.A: 10, Options.B: 20} # produces config = {"A": 10, "B": 20}
result = myObj.someMethod(value, config)
...

我认为这里的想法是为客户端用户提供一个选项菜单,而不是依赖于用户从头开始构建配置dict - 我想一个好处就是消除配置字段拼写错误,也许它有助于向前兼容。

我能想到支持这一点的唯一方法是实现一个看起来像这样的Options类:

class Options:
    A = "A"
    B = "B"

然而,这在很多方面都很糟糕。这很脆弱,因为如果用户代码破坏任何选项类字段(例如Options.A="garbage"),那么它就会被破坏。无论如何,实现像A = "A"这样的领域只是感觉很愚蠢。此外,如果我们实现一个Options类,我们不应该直接使用Options对象而不是使用Options类来生成dict吗?

那么,是否有更优雅有效的方法来实现所需的config = {Options.A: 10, Options.B: 20}模式或类似的模式?这种模式是否熟悉?

编辑:如果不清楚,配置字典只需要包含一小部分可用选项。

2 个答案:

答案 0 :(得分:1)

我不确定我是否理解这个结构的目的。如果您希望确保用户仅使用配置dict的有效密钥,我会使用property装饰器保护属性(请参阅http://docs.python.org/2/library/functions.html#property):

class Options:
    def __init__(self):
        self._A = 'A'
        self._B = 'B'
        # etc.

    @property
    def A(self):
        return self._A

    @property
    def B(self):
        return self._B

    # etc.

并不能完全阻止用户搞砸你的课程,但至少不容易这样做。

答案 1 :(得分:1)

我不确定理解预期的目的和预期的好处......但是如果你正在寻找帮助来构建和验证你的字典,那么这样的事情可能是一个很好的起点:

def config(**kwargs):
    for key, value in kwargs.items():
        if key not in AllowedKeys:
            raise KeyError("{} is not allowed in config".format(key))

        if not value_is_correct_for_key(key, value):
            raise ValueError("{} is not allowed for {} in config".format(value, key))

        # ... more tests here depending on your use case

    # Everything is OK,  just return the dictionary
    return kwargs



# Usage:
print(config(A="1", B="2"))