检查方法的潜在副作用,而不用Python改变任何东西

时间:2012-05-03 17:27:04

标签: python oop

现在,我有以下类方法:

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遍历实例变量并进行更改,知道不会违反条件。

两者都有非常相似的代码。

2 个答案:

答案 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):

充其量是模棱两可的。该功能是否可以查看是否可以更新?是否会实际更新/改变某些内容?

很明显,这两个功能必须分开。