我正在使用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中检查这个?
答案 0 :(得分:1)
我不熟悉您正在使用的PyContract库,但是您正在测试的实际合同在Python中没有多大意义,因为函数参数是通过引用传递的。如果您有以下代码:
x = a
y = b
foo(x, y)
然后该函数将接收对调用范围中x
和y
命名的对象的引用。在函数调用中,您有两个单独的变量,通过对这些参数的引用进行初始化。
因此,对函数内部变量的更改不会影响x
和y
在调用范围内的绑定。