从文档字符串强制实施 Python 函数参数类型



epydoc 和 Sphinx 文档生成器都允许编码人员注释任何/所有函数参数的类型应该是什么。

我的问题是:当文档字符串中记录,有没有一种方法(或模块(可以强制执行这些类型(在运行时(。 这不是类型(编译时检查(,但(更有可能(可能称为固定类型(运行时检查(。 也许会引发"值错误",甚至更好...引发"语义错误">

理想情况下,根据xkcd,已经有一些类似于" import antigravity"模块的东西(例如模块(,并且这个"firm_type_check"模块已经存在于方便下载的地方。

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

埃皮多克:函数和方法参数:

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

狮身人面像:在 Python 对象描述指令中,具有这些字段的 reST 字段列表被很好地识别和格式化:

    参数、参数、参数、
  • 参数、键、关键字:参数的说明。
  • 类型:参数的类型。
  • 提出,提高,例外,例外:(以及何时(引发特定异常。
  • var, ivar, cvar:变量的描述。
  • 返回,返回:返回值的说明。
  • rtype:返回类型。

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

本身不使用文档字符串的类似堆栈溢出问题:

  • 检查参数类型的 pythonic 方法
  • 在 python 中检查类型的规范方法是什么?

据我所知,由于以下几个重要原因,不存在

任何此类内容:
    首先,文档
  • 字符串是文档,就像注释一样。就像评论一样,人们会期望它们对程序的工作方式没有影响。使程序的行为依赖于其文档是一个主要的反模式,也是一个可怕的想法。

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

  • 最后,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/(感觉有点像Pythonic(或者至少,它吸引了很多来自Python的难民(,是静态类型的,并编译为本机代码。

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