0

这是我之前的问题的后续

我正在使用PyContract(不是PyContracts)为类方法编写一些约束。作为后置条件,我想确保某个对象的内存地址没有改变,即id(myObj)在调用函数之前和之后应该是相同的。我怎样才能用 PyContract 做到这一点?

这就是我现在正在做的事情:

def foo(param1, param2)
    """
        # some other constraints
        post[param1, param2]:
            __old__.param1 is param1
            __old__.param2 is param2
    """

但是,该后置条件失败。我只能想象这是因为__old__.param1它没有存储在与 is 相同的内存位置param1。这是有道理的,因为 PyContract 需要制作param1before执行的副本,以便根据after执行foo的值检查其值。param1foo

假设上面的分析是真的,它只是用来解释为什么id(__old__.param1)不同id(param1)。但是,它仍然没有回答我如何确保id(param1)不会因为foo. 我怎么能在 PyContract 中检查这个?

4

1 回答 1

1

我不熟悉您正在使用的 PyContract 库,但是您正在测试的实际合同在 Python 中没有多大意义,因为函数参数是通过引用传递的。如果您有如下代码:

x = a
y = b
foo(x, y)

x然后该函数将接收对由y调用范围命名的对象的引用。在函数调用中,您有两个单独的变量,它们使用对这些参数的引用进行了初始化。

所以对函数内部这些变量的更改不会影响调用范围内x的绑定。y

于 2012-10-23T08:42:59.353 回答