【问题标题】:Python static typing does not workPython静态类型不起作用
【发布时间】:2016-09-28 08:31:15
【问题描述】:

我发现 Python 打算支持静态类型,但它仍处于测试阶段。 我用 python 3.4.3 尝试了以下代码:

def somme(a: int, b: int) -> int:
    return a + b

支持语法,但我没有得到预期的结果。如果我输入 somme('1', '3') 我得到 13,而我应该得到 TypeError 异常说 int variable expected

有人知道为什么它不起作用吗?

【问题讨论】:

  • 输入只是提示,不是强制的。
  • 顺便说一句,您所描述的是运行时类型检查不是在编译时完成的静态类型检查。

标签: python python-3.x static-typing


【解决方案1】:

函数注解有注解,仅此而已。它们是有关预期用途的文档。就像PEP 3107 中所说的那样,该机制提供了一种指定函数参数和返回值的单一标准方法,取代了各种临时工具和库。

但正如它继续说的那样:

函数注解只不过是一种关联方式 具有函数各个部分的任意 Python 表达式 编译时。

Python 本身并没有附加任何特殊含义或 注释的意义。留给它自己,Python 简单地使 这些表达式可用,如访问函数中所述 注释如下。

PEP 484 添加了更多的约定和工具,用于使用这些注释来标记类型,在 Python 3.5 中采用。但是语言本身仍然没有运行时检查:它“包括对离线类型检查器的支持,例如 mypy”。

也就是说,在使用这些注解之后,您可以运行第三方类型检查器来检查您的代码是否符合注解类型。将这些注释构建到语言中应该可以让各种 IDE 更容易提供此服务。

【讨论】:

  • 谢谢,但我说的不是这个。
  • @AymenGasmi:……不,真的,这就是你在说的。函数参数后面的: int,最后是-> int,是吗?
  • 是的,我明白了,这解释了为什么语法是正确的,但我真正要找的是 mypy.我虽然类型检查器现在是内置的,但它似乎还没有,它仍然应该用作第 3 方。 @chrislessard 的答案正是我想要的。不过还是谢谢你:)
【解决方案2】:

实际上,您不应该在这里使用静态类型。正如here 所解释的那样,您编写的代码实际上是一种简单的文档和“类型提示”形式。引用该 PEP:

虽然这些注解在运行时通过通常的 annotations 属性可用,但在运行时不会进行类型检查。相反,该提案假设存在一个单独的离线类型检查器,用户可以自愿运行其源代码。本质上,这样的类型检查器充当了一个非常强大的 linter。 (虽然个人用户当然可以在运行时使用类似的检查器来执行按合同设计或 JIT 优化,但这些工具还不够成熟。)

换句话说,它是为支持第三方库而开发的,该库实际上会为您进行检查。尽管我的一个朋友经常使用MyPy 来实现它,但我从来没有为 Python 中的静态类型而烦恼。这可能就是您正在寻找的。​​p>

编辑:

安装:可以使用 pip 安装 MyPy:

pip install mypy-lang

用法:您可以按如下方式检查您的程序:

~$ mypy my_script.py

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    • 2013-10-06
    • 2012-03-24
    • 2010-11-19
    • 2016-02-10
    • 2017-08-30
    • 1970-01-01
    相关资源
    最近更新 更多