1

现在,我有以下类方法:

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。但是,这不适用于可变数据结构(如列表)!

我应该只使用“深拷贝”吗?还是有更好的方法来做到这一点?我想尽可能像 Pythonic。

编辑

迭代实例变量并检查进行更改是否会check_capacity违反条件。

迭代实例变量并进行更改,update_capacity知道条件不会被违反。

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

4

2 回答 2

3

我有一种预感,这两个函数一起设法跨越了你的问题,而没有完全击中它。如果我有这个权利,你想update_capacity要么改变一些东西,要么False在不需要改变的时候返回。

在我看来,您将能够通过添加检查机制来实现此功能check_capacityinto update_capacity,在执行主体之前执行条件检查update_capacity

def update_capacity(self, at_index):
    if <condition from check_capacity>:
        <body of update_capacity>
    else:
        return False

当然,None如果条件为真,此代码将返回,因此如果您想保持函数签名整洁,您可以返回True或其他内容,具体取决于适合其余代码的内容。

于 2012-05-03T18:38:15.813 回答
0

如果check_capacity应用于多个地方,则使其成为装饰器,以确保在不满足约束/检查时抛出异常。

@check_capacity
def update_capacity(...)
    # Does the job and does not return anything

如果check_capacity没有在其他任何地方使用,只需将逻辑放入 update_capacity.

编辑:还有这个

如果更新容量(at_index):

充其量是模棱两可的。该功能是否会查看我是否可以更新?它会真正更新/改变一些东西吗?

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

于 2012-05-03T22:24:00.777 回答