4

epydoc 和 Sphinx 文档生成器都允许编码器注释任何/所有函数参数的类型。

我的问题是:有没有一种方法(或模块)可以在文档字符串中记录时强制执行这些类型(在运行时)。这不是强类型(编译时检查),但(更有可能)可能被称为固定类型(运行时检查)。也许引发“ValueError”,或者甚至更好……引发“SemanticError”

理想情况下,已经存在类似于xkcdimport antigravity的“ ”模块的东西(如模块) ,并且这个“firm_type_check”模块已经存在于方便下载的地方。

仅供参考:epydoc 和 sphinz 的文档字符串如下:

epydoc: 函数和方法参数:

  • @param p: ... # 函数或方法的参数 p 的描述。
  • @type p: ... # 参数 p 的预期类型。
  • @return: ... # 函数或方法的返回值。
  • @rtype: ... # 函数或方法的返回值的类型。
  • @keyword p: ... # 关键字参数 p 的描述。
  • @raise e: ... # 对函数或方法引发异常 e 的情况的描述。

Sphinx:在 Python 对象描述指令中,具有这些字段的 reST 字段列表可以很好地识别和格式化:

  • param、parameter、arg、argument、key、keyword:参数的描述。
  • type:参数的类型。
  • raises, raise, except, exception:引发特定异常(以及何时)。
  • var、ivar、cvar:变量的描述。
  • return,return:返回值的描述。
  • rtype:返回类型。

我能找到的最接近的是 Guido 在mail.python.org中的提及,由 Jukka Lehtosalo 在Mypy Examples中创建。 CMIIW:mypy 不能作为 py3 模块导入。

本身使用文档字符串的类似 stackoverflow 问题:

4

1 回答 1

1

据我所知,由于以下几个重要原因,这种情况并不存在:

  • 首先,文档字符串是文档,就像注释一样。就像评论一样,人们会期望它们不会影响您的程序的运行方式。让你的程序的行为依赖于它的文档是一个主要的反模式,也是一个可怕的想法。

  • 其次,不保证会保留文档字符串。例如,如果您使用 运行python,则会删除所有文档字符串。-OO然后怎样呢?

  • 最后,Python 3 引入了可选的函数注释,这将更好地服务于这个目的:http: //legacy.python.org/dev/peps/pep-3107/。Python 目前对它们什么都不做(它们是文档),但是如果我要编写这样的模块,我会使用它们,而不是文档字符串。

我的诚实观点是:如果你要经历(相当大的)麻烦为 Python 编写一个(必然是半生不熟的)静态类型系统,那么通过学习另一种编程,你会得到更好的使用以不那么疯狂的方式支持静态类型的语言:

  • Clojure ( http://clojure.org/ ) 非常动态和强大(由于其作为 Lisp 的性质)并通过core.typed( https://github.com/clojure/core.typed ) 支持可选的静态类型。它面向并发和网络(它具有 STM 和持久数据结构 <3 ),拥有一个很棒的社区,并且是我见过的设计最优雅的语言之一。也就是说,它在 JVM 上运行,这既是好事也是坏事。

  • Golang ( http://golang.org/ ) 感觉有点像 Python (或者至少,它吸引了很多来自 Python 的难民),是静态类型的并编译为本地代码。

  • Rust ( http://www.rust-lang.org/ ) 比这低,但它拥有我见过的最好的类型系统之一(类型推断、模式匹配、特征、泛型、零大小类型...) 并在编译时强制执行内存和资源安全。它由 Mozilla 开发,作为编写下一个浏览器 (Servo) 的语言,因此性能和安全性是其主要目标。您可以将其视为对 C++ 的现代诠释。它编译为本机代码,但还没有达到 1.0,因此,语言本身仍然会发生变化。这就是为什么我不建议在其中编写生产代码的原因。

于 2014-12-10T13:23:36.740 回答