【问题标题】:Python 3 type check not works with use typing module?Python 3 类型检查不适用于使用类型模块?
【发布时间】:2019-07-01 04:16:38
【问题描述】:

为什么类型检查在 Python 3 中不起作用?

我已经使用类型检查或提示完成了以下代码:

import typing

def hello(message: str):
    print(type(message))
    print(message)

hello('Hello!')
hello(1)
hello(1.1)

它产生有效的输出(但在 int 或 float 上没有错误)。

<class 'str'>
Hello!
<class 'int'>
1
<class 'float'>
1.1

为什么会这样?可能我不明白打字模块和 Python 提示。

【问题讨论】:

  • 感谢您的所有帮助-所有答案都很好-很难选择一个最好的。现在我明白了,如果我做一些装饰器,提示可以用于验证,但通常它是提高可读性的好提示。很高兴看到 mypy 可以将此信息用于静态类型,它很快就会显示出新的机会。
  • 相信你不用导入typing
  • documentation on this 非常具有误导性。通过使用像runtime support for type hints 这样的术语,它暗示这个功能实际做某事。它没有。它只是空的语法,允许作者以系统的方式记录他们的代码。

标签: python python-3.5


【解决方案1】:

Python 的类型提示仅供参考。类型检查或参数类型的自动强制不是语言的一部分。见PEP 3107

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

类型提示可以被附加模块用来检查参数的类型和返回值,甚至强制参数为预期的类型。例如,here 是一个模块,它会检查参数类型并在发现不匹配时进行投诉。

但这不是 Python 本身的工作方式,因此不要依赖它,也不要寻找将其引入代码的方法。在 Python 风格中,您的函数应该尽可能灵活地编写它们可以使用的参数类型(谷歌“鸭子类型”)。如果他们得到了他们无法处理的东西......好吧,这就是例外。

更新:自 Python 3.5 起,提供类型提示支持的 typing 模块已添加到标准库中(“临时”)。它提供了一些有用的类型名称,包括AnyCallableUnion,以及一个辅助函数NewType。类型提示仍然非常非常可选。

【讨论】:

    【解决方案2】:

    Python 3 没有您正在寻找的那种类型检查。

    def hello(message: str):
    

    这是一个函数注释

    https://www.python.org/dev/peps/pep-3107/

    它所做的只是将一些额外的数据与函数对象相关联。这可以稍后在函数的func_annotations 属性上进行检查。

    除此之外,它没有任何内置行为。目的是让第三方在此基础上构建行为。

    【讨论】:

      【解决方案3】:

      类型提示只是提示,它们应该告诉用户功能期望而不是它需要什么。这在介绍它们的 PEP 中明确提到:PEP 3107:

      函数注解基础

      在开始讨论 Python 3.0 函数注解的具体细节之前,让我们先广泛讨论一下注解是什么,什么不是:

      • 函数注释,无论是参数还是返回值,都是完全可选的。

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

        Python 本身并不赋予注解任何特定的含义或意义。 [...]

      【讨论】:

        【解决方案4】:

        你想要的是一个static typing,它与python接受的dynamic typing范式相反。

        您可以使用mypy - 一个为 python 带来静态类型的项目。

        【讨论】:

          【解决方案5】:

          它们被称为“类型提示”是有原因的。 Python 只是提供了以标准和结构化方式标记类型的选项,以指导其他程序员或促进 IDE 错误检查。

          但是,Python 并没有强制执行这些提示,也没有任何计划,它们仅此而已,与 cmets 差不多。

          【讨论】:

            猜你喜欢
            • 2019-07-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-07-01
            相关资源
            最近更新 更多