确保变量的内存位置未更改

时间:2012-10-23 07:16:07

标签: python variables design-by-contract memory-address

这是my previous question

的后续行动

我正在使用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未存储在与param1相同的内存位置。这是有道理的,因为PyContract需要在执行param1之前复制foo,以便在执行param1之后检查其值与foo的值。

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

1 个答案:

答案 0 :(得分:1)

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

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

然后该函数将接收对调用范围中xy命名的对象的引用。在函数调用中,您有两个单独的变量,通过对这些参数的引用进行初始化。

因此,对函数内部变量的更改不会影响xy在调用范围内的绑定。