我试图遵循Google的样式指南,从一开始就追求一致性。
我正在创建一个模块,在这个模块中我有一个类。我想为不同的标准用例提供一些合理的默认值。但是,我希望用户能够灵活地覆盖任何默认值。我目前所做的是提供一个模块范围的“常量”字典,其中包含默认值(用于不同的用例),并在我的类中,将构造函数中的参数优先于默认值。
最后,我想确保我们以有效的参数值结束。
这就是我所做的:
我正在创建一个模块,在这个模块中我有一个类。我想为不同的标准用例提供一些合理的默认值。但是,我希望用户能够灵活地覆盖任何默认值。我目前所做的是提供一个模块范围的“常量”字典,其中包含默认值(用于不同的用例),并在我的类中,将构造函数中的参数优先于默认值。
最后,我想确保我们以有效的参数值结束。
这就是我所做的:
MY_DEFAULTS = {"use_case_1": {"x": 1, "y": 2},
"use_case_2": {"x": 4, "y": 3}}
class MyClass:
def __init__(self, use_case = None, x = None, y = None):
self.x = x
self.y = y
if use_case:
if not self.x:
self.x = MY_DEFAULTS[use_case]["x"]
if not self.y:
self.y = MY_DEFAULTS[use_case]["y"]
assert self.x, "no valid values for 'x' provided"
assert self.y, "no valid values for 'y' provided"
def __str__(self):
return "(%s, %s)" % (self.x, self.y)
print(MyClass()) # AssertionError: no valid values for 'x' provided
print(MyClass("use_case_1")) # (1, 2)
print(MyClass("use_case_2", y = 10) # (4, 10)
问题
- 虽然从技术上讲它可以工作,但我想知道这是否是最符合Python风格的方式?
- 随着我的类有越来越多的默认值,代码变得非常重复,我该怎么简化它?
assert
对我来说似乎也不是最好的选择,因为它更像是一个调试语句而不是验证检查。我尝试使用@property
装饰器,如果存在无效参数,则会引发异常,但在当前模式下,我希望允许x
和y
在构造函数的短暂时刻内不是truthy
,以正确实现优先级(也就是说,我只想在构造函数的最后检查truthiness
)。有什么提示吗?