1

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

...
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 类字段(例如Options.A="garbage"),那么它就会损坏。无论如何,实现这些领域就像A = "A"只是感觉很傻。此外,如果我们正在实现一个 Options 类,我们不应该直接使用 Options 对象而不是使用 Options 类来生成一个dict?

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

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

4

2 回答 2

1

我不确定我是否理解这个构造的目的。如果您希望确保用户仅对 config 使用有效键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.

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

于 2013-07-09T12:08:11.727 回答
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"))
于 2013-07-09T12:40:58.497 回答