繁体   English   中英

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

[英]enforcing python function parameters types from docstring

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

我的问题是: docstring中记录时 是否有一种方法(或模块) 强制执行这些类型(在运行时)。 这不是强类型 (编译时检查),但(更有可能)可能被称为公司类型 (运行时检查)。 也许提出一个“ValueError”,甚至更好......提出一个“SemanticError”

理想情况下,根据xkcd ,已经存在类似于“ import antigravity 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:参数的类型。
  • 引发,引发,除异常:引发特定异常(以及何时)。
  • var,ivar,cvar:变量的描述。
  • returns,return:返回值的描述。
  • rtype:返回类型。

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

类似的stackoverflow问题本身使用docstring

据我所知,由于一些重要原因,不存在任何类型的东西:

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

  • 其次,不保证文档字符串可以保留。 例如,如果您使用-OO运行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,因此,语言本身仍有可能发生变化。 这就是为什么我不建议在其中编写生产代码的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM