【发布时间】:2012-10-24 04:26:39
【问题描述】:
希望这将是我在本系列中的最后一个问题(我的项目快结束了,除非需求发生变化)。
我正在使用PyContract(不是PyContracts)为类方法编写一些约束。在我的一个函数中,我有一个不变量。但是,并非构成此后置条件的所有变量都是函数的输入参数;有些是函数本身范围内的局部变量(循环计数器等)。我如何/可以在合同的后置条件条款中捕获它们?
这是我一直在使用的 MWE 代码:
def foo(*args, **kwargs):
"""
pre:
# some preconditions
inv:
# something that's clearly false
1 == 2
post:
g < arg5
"""
arg1 = kwargs['arg1']
arg2 = kwargs['arg2']
arg3 = kwargs['arg3']
arg4 = kwargs['arg4']
arg5 = kwargs['arg5']
g = 0
while g < arg5:
vars = generate_data(arg1)
best = max(arg2(var)for var in vars)
if best >= arg3:
return best
# do stuff
g += 1
当 PyContract 告诉我它不知道名称 g 和 arg5 时,问题就出现了。我把合约里的arg5改成了kwargs['arg5'],但是PyContract还是不知道g是什么。我如何/可以解决这个问题?
我得到的错误是:
Traceback (most recent call last):
File "/Users/ashwin/github/local/Genetic-Framework/Genetic-Framework/Genetic/GA.py", line 245, in <module>
answer = runTSPGA(*settings, **settings)
File "<string>", line 3, in __assert_runTSPGA_chk
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/contract.py", line 1135, in call_public_function_all
return _call_one_all(func, va, ka)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/contract.py", line 1321, in _call_one_all
func.__assert_post(old, result, *va, **ka)
File "<string>", line 4, in __assert_runTSPGA_post
NameError: global name 'g' is not defined
在后置条件声明中添加g 也无济于事:
post[kwargs, g]:
此外,有趣的是,用于不变检查的代码似乎根本没有运行
【问题讨论】:
-
您能否将逐字错误消息添加到您的问题中?它有助于上下文。
-
kwagrs['agr#']不应该是kwargs['arg#']吗? -
@AdamEberlin:是的。这是一个愚蠢的错字
-
@AdamEberlin:我已经改变了问题,以便更忠实于实际发生的事情。我第一次看错了一些错误
-
@Michael,您的编辑是originally rejected,但被重新提交并eventually approved。很好的收获。
标签: python design-by-contract invariants