从docstring强制执行python函数参数类型

时间:2014-12-10 12:41:16

标签: python python-sphinx typechecking docstring epydoc

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

我的问题是:记录 时,是否存在强制执行这些类型(在运行时)的方式(或模块)文档字符串。这不是强类型(编译时检查),但(更有可能)可能被称为公司类型(运行时检查)。也许提出一个" ValueError",或者甚至更好......提出一个" SemanticError"

理想情况下,已经存在类似于" import antigravity"的某些内容(如模块)模块按照xkcd,这个" 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:参数类型。
  • 引发,引发,除异常:引发特定异常(以及何时)。
  • var,ivar,cvar:变量的描述。
  • 返回,返回:返回值的描述。
  • rtype:返回类型。

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

类似的stackoverflow问题使用 docstring 本身:

1 个答案:

答案 0 :(得分:1)

据我所知,由于一些重要原因,没有任何类型存在:

  • 首先,docstrings是文档,就像评论一样。就像评论一样,人们会期望它们对你的程序的工作方式没有任何影响。使程序的行为取决于它的文档是一个主要的反模式,并且是一个可怕的想法。

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

  • 最后,Python 3引入了可选的函数注释,可以更好地实现这一目的:http://legacy.python.org/dev/peps/pep-3107/。 Python目前对它们没有任何作用(它们是文档),但如果我要编写这样的模块,我会使用它们,而不是文档字符串。

我的诚实意见是这样的:如果你要经历(相当大的)麻烦,为Python编写一个(必然是半生不熟的)静态类型系统,那么它将会一直带给你更好的使用方式学习另一种支持静态类型的编程语言:

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

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

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