有人向我建议,作为一种惯例,可以在“选项”类的帮助下支持在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}
模式或类似的模式?这种模式是否熟悉?
编辑:如果不清楚,配置字典只需要包含一小部分可用选项。
答案 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"))