现在,我有以下类方法:
def check_capacity(self, at_index)
def update_capacity(self, at_index)
前者返回一个布尔值,而后一个更改实例变量。问题是两种方法做的事情非常相似。我觉得我是在违反DRY?
我想要一种方法:
def update_capacity(self, at_index)
我可以用作:
if update_capacity(at_index):
如果需要副作用会产生预期的副作用,否则返回False。
我的尝试是复制实例变量,检查是否希望更改副本,然后将实例变量设置为副本(如果正确)并返回True,否则返回False,否则返回False。但是,这不适用于可变数据结构(如列表)!
我应该用“深层复制”来做这件事吗?或者有更好的方法来做这件事吗?我想成为Pythonic。
修改
check_capacity
遍历实例变量并检查更改是否会违反条件。
update_capacity
遍历实例变量并进行更改,知道不会违反条件。
两者都有非常相似的代码。
答案 0 :(得分:3)
我有一种预感,即这两个功能一起设法跨越你的问题,而不是完全击中头部。如果我有这个权利,您希望让update_capacity
更改某些内容,或者如果不希望更改内容,则返回False
。
在我看来,您可以通过将check_capacity
中的检查机制添加到update_capacity
来实现此功能,在执行update_capacity
的主体之前执行条件检查:< / p>
def update_capacity(self, at_index):
if <condition from check_capacity>:
<body of update_capacity>
else:
return False
当然,如果条件为真,此代码将返回None
,因此如果您希望保持功能签名整洁,可以返回True
或其他内容,具体取决于您的其余部分是什么代码。
答案 1 :(得分:0)
如果check_capacity
适用于多个地方,请制作它
一个装饰器,确保它在约束/检查时抛出异常
不满足。
像
@check_capacity
def update_capacity(...)
# Does the job and does not return anything
如果其他地方没有使用check_capacity
,只需将逻辑放入其中
update_capacity
。
编辑: 还有这个
如果update_capacity(at_index):
充其量是模棱两可的。该功能是否可以查看是否可以更新?是否会实际更新/改变某些内容?
很明显,这两个功能必须分开。