【发布时间】:2012-10-23 07:16:07
【问题描述】:
这是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 需要在执行foo 之前复制param1,以便在执行完foo 之后检查其值与param1 的值。
假设上面的分析是真的,它只是用来解释为什么id(__old__.param1)和id(param1)不同。但是,它仍然没有回答我如何确保id(param1) 不会作为foo 的副作用而改变。我怎么能在 PyContract 中检查这个?
【问题讨论】:
-
这并不能解释 PyContract 的行为,但是您希望通过该后置条件实现什么? Python 通过引用传递函数参数,因此函数将无法更改它们在外部引用的内容。如果函数改变了函数内部的那些名称,它也不会改变外部的绑定。
-
@JamesHenstridge:碰!我根本没有考虑过python的行为。我更专注于实际的合同。如果您将评论作为答案发表,我会接受 - 它完美地回答了我的问题
标签: python variables design-by-contract memory-address