Python静态类型不起作用

Aym*_*smi 5 python static-typing python-3.x

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

def somme(a: int, b: int) -> int:
    return a + b
Run Code Online (Sandbox Code Playgroud)

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

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

Nic*_*teo 10

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

但正如它继续说:

函数注释只不过是一种在编译时将任意Python表达式与函数的各个部分相关联的方法.

Python本身并没有为注释添加任何特定的含义或意义.从左到右,Python只是使这些表达式可用,如下面的访问函数注释中所述.

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

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


小智 5

实际上,你不应该在这里获得静态类型.你写的代码实际上是很容易的文档和"类型提示"的形式,解释在这里.引用那个PEP:

虽然这些注释在运行时通过常用的注释属性可用,但在运行时不会进行类型检查.相反,该提议假定存在一个单独的离线类型检查器,用户可以自动运行其源代码.从本质上讲,这种类型的检查器就像一个非常强大的linter.(虽然个别用户当然可以在运行时使用类似的检查器来进行设计合同执行或JIT优化,但这些工具还不够成熟.)

换句话说,它的开发是为了支持第三方库,它实际上会为您进行检查.虽然我的一个朋友经常使用MyPy来实现它,但我从来没有在Python中使用静态类型.这可能就是你要找的东西.

编辑:

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

pip install mypy-lang
Run Code Online (Sandbox Code Playgroud)

用法: 您可以按如下方式对程序进行类型检查:

~$ mypy my_script.py
Run Code Online (Sandbox Code Playgroud)