是"函数在结束之前应该满足的要求。" Python中后置条件的正确定义?

时间:2017-04-20 19:12:21

标签: python python-3.x factorial design-by-contract post-conditions

"思考Python:如何像计算机科学家一样思考" ,作者将后置条件定义为:

  

在函数结束之前应该满足的要求。

他还说:

  

相反,函数末尾的条件是后置条件。   后置条件包括函数的预期效果(如   绘制线段)和任何副作用(如移动龟或   做出其他改变)。

假设我们有一个名为 factorial 的函数,它具有一个名为 n 的必需参数,并不是预期的后置条件它必须(即它需要)返回一个正整数,表示从 1 n 的数字乘积? factorial 结束后,是否满足此要求?

这个定义是对的吗?

后置条件定义为"函数结束后应该满足的要求。"对吗?

注意:我是编程的初学者,特别是Python,尤其是。

3 个答案:

答案 0 :(得分:1)

后置条件是"在函数结束时必须为true的要求",即:在函数结束的确切时刻,并且不再发生任何事情,函数的后置条件必须为true

本书中的定义实际上与此有些一致:如果函数在结束之前满足后置条件,则并且函数不会做任何会导致条件为假的事件当然,后置条件在函数结束时也是如此。

你的定义与此一致,在函数结束后,它的后置条件必须为真。

我认为这里的主要问题是“#34;满足"”这个词的定义。如果我们采取"满足条件"意味着"使这个条件成为现实" (这似乎是你的书中使用的定义)然后一个后置条件必须在函数运行时和返回之前的某个时刻变为真,以便在函数执行结束时它可能是真的。如果你采取"满足"意味着"条件是真实的" (这似乎是你如何使用这个词),那么你的定义是有道理的 - 在函数结束后,它的后置条件必须为真。

语义!

答案 1 :(得分:1)

对于它的价值,在Python中,在该特定执行分支的函数中发生的任何事情都必须在函数结束之前发生:

In [6]: import dis

In [7]: def fun():
   ...:     return 42
   ...:

In [8]: dis.dis(fun)
  2           0 LOAD_CONST               1 (42)
              2 RETURN_VALUE

在简单的情况下,只有42,加载常量。

但是更复杂的事情呢,比如内部有try的{​​{1}}?

return

原来:

In [9]: def fun_with_exceptions():
   ...:     try:
   ...:         return 42
   ...:     finally:
   ...:         print('Returning')
   ...:

在函数实际返回之前,finally 中的所有内容仍然执行 - 所以后置条件的定义为

  

在函数结束之前应该满足的要求。

仍然完全有效。

答案 2 :(得分:0)

定义“在结束之前应该满足的要求。”是正确的。

考虑函数create_logger(file_name)它采用字符串参数和file_name,返回给定file_name的文件流,可用于写入日志消息。

在这种情况下,post条件是返回的对象是可写文件流(函数的主要目标) 此外,它还可以确保清除任何具有相同名称(管家/清理活动)的先前文件 并且有足够的空间/权限写入新创建的文件(健全性检查) 可以为主要目标和完整性检查创建后置条件。这将在函数执行期间和返回之前的某个时刻变为真。

但是,在函数返回后,这些条件不必保持为True。因此“在结束后应该满足的要求”。是不正确的。
例如,在函数返回后的某个稍后点,磁盘可能会填满,并且返回的文件流对象可能不再可写。