【问题标题】:How to enforce method interface with Python?如何使用 Python 强制执行方法接口?
【发布时间】:2016-02-10 01:29:59
【问题描述】:

我想创建一个需要特定方法的类,具有特定类型的参数和返回值。 我可以从需要实现该方法的抽象类继承 - 但我没有能力强制特定的参数值和返回值 ala 像 Java 这样的静态语言(如果我愿意,我可以在运行时抛出错误)。用 Python 解决这个问题的最佳方法是什么?已经研究过类型提示,但我认为它不能解决这个问题。

【问题讨论】:

  • 如果你真的需要这个,你可以查看 MyPy:mypy-lang.org,但我认为 CPython 中不存在这个功能。类型提示是最接近的。
  • 是的,我不确定这是否可能。我认为 MyPy 是 Python 3 中的类型提示基于什么?或者也许他们只移植了其中的一部分
  • 你说得对,PEP-484 基于 MyPy。如果您希望在运行时强制执行参数输入,恐怕您使用了错误的语言。 Python 根本不这样做,只是在方法中添加了显式的isinstance 检查。
  • 如果您正在寻找方法的运行时签名验证,您可以查看github.com/RussBaz/enforce 模块。但是,它并不是为了从 Python 中生成 Java,而且它还远不是一个生产就绪的库。请小心!

标签: python types dynamic-typing static-typing


【解决方案1】:

这似乎从根本上不符合 Python 风格。 python中没有函数参数的类型,所以没有办法将参数类型限制为函数。

类型提示对于文档或代码检查很有用,但 python 不会使用该信息在运行时强制执行任何操作。

如果你真的想确保接口的有效性(甚至不仅仅是参数类型),那么做到这一点的方法就是使用功能单元测试。

单元测试和测试驱动开发在 python 社区中非常普遍,以至于在测试和查找错误时,类型提示并没有真正增加太多。虽然这是一个值得商榷的观点,但仍有许多人认为,类型提示的任何好处都会因使 Python 代码更难阅读而立即被破坏。使用类型提示可以将 python 编译成 C 或 Java 有一些很有希望的可能性,但它们还不存在。

【讨论】:

  • mypy 实用程序不编译它并在运行前检查问题吗?还是我理解错了
  • mypy 可以测试一个封闭的系统。它可以在内部检查您的代码中,您没有调用具有不正确数据类型的函数。如果您正在编写其他人将使用的 python 包,它显然无法对此进行测试,因此它仍然没有强制执行任何类型。如果您确实在代码中定义了类型提示,这意味着使用您的库的其他人可以在他们自己的代码上运行 mypy,并且可能会收到一些类型警告。
  • 我不认为 OP 要求在运行时做任何事情;他说“如果我愿意,我可以投入运行时”,但从某种意义上说,这似乎很容易。他似乎想要 static 时间检查。而 PEP 484 / mypy 正好提供了这一点:如果您将一个类定义为具有类型化的抽象方法,那么如果子类有错误的参数,它们将不会通过类型检查。
最近更新 更多