【问题标题】:Are type hints a safer type checking option than assert?类型提示是比断言更安全的类型检查选项吗?
【发布时间】:2020-05-15 14:49:08
【问题描述】:

我有 2 个代码段来检查函数参数的数据类型。

第一个使用打字

def write_str(str1: str, file1_str: str):

    return None

第二个使用assert

def write_str(str1, file1_str):
    assert (type(str1) == str and type(file1_str) == str)

    return None 

python 类型是否不需要使用断言检查?哪个代码段更好地捕捉错误?

我正在使用 python v3.7

【问题讨论】:

  • 使用类型注解是很好的文档;它还可以让您对代码进行 lint,而 IDE 可以提供帮助。它不会“捕获”任何真正意义上的错误。断言是核的,通常也不提供有用的信息。 Python 不是强类型的,你永远不会 100% 地发现与类型相关的错误。
  • 它们在完全不同的时间运行——当代码被检查时使用类型注释。 mypy,断言是在运行时(除非disabled)。
  • @erip,您认为在 python 中使用 assert 捕获函数参数中的数据类型错误是一种好习惯吗?
  • 这个问题真的没有意义。如果 mypy can 捕获它,它肯定会在 assert 之前捕获,假设您在部署代码之前运行类型检查。至于这是否是一种好习惯,我建议(实际上是have recommended)不要使用assert 进行类型检查,而是抛出一个正确的TypeError(或者通过在运行时根本不检查来允许抛出一个错误)。
  • Python 代码通常不担心运行时类型检查。相反,使用了鸭子类型:如果str1 提供的值与str1 的使用方式一致,那么实际类型是什么并不重要。

标签: python python-3.x assert type-hinting python-typing


【解决方案1】:

注解方法(第一种)在传递错误类型时不会抛出错误。

因此第二种方法更好,但仍可以改进:

def write_str(str1, file1_str):
    assert (isinstance(str1, str) and isinstance(file1_str, str))

    return None 

如果您传递从str 继承的对象,这也将起作用。尽管在这里并不真正相关,但通常推荐isinstance 优于type

【讨论】:

    【解决方案2】:

    来自PEP 3107, Fundamentals of Function Annotations, p. 2

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

    注解对糟糕的python没有任何作用,但它们被其他python的官方项目mypy使用。

    What is mypy:

    Mypy 是 Python 的可选静态类型检查器。您可以添加类型 提示(PEP 484)到您的 Python 程序,并使用 mypy 进行类型检查 它们是静态的。无需运行即可发现程序中的错误!

    简而言之,它是一个 CLI,可以在不运行代码的情况下解析您的代码,并在类型不匹配时返回错误列表。该工具的主要目标是提高代码质量,通常与other quality control tools like linters and formatters一起使用。

    【讨论】:

      猜你喜欢
      • 2021-05-02
      • 2014-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-10
      • 2021-12-08
      • 1970-01-01
      相关资源
      最近更新 更多