在函数内声明变量类型

declare variable type inside function

我正在定义一个以字节为单位获取 pdf 的函数,所以我写道:

def documents_extractos(pdf_bytes: bytes):
    pass

当我调用函数时 不幸的是 传递了一个错误的类型,而不是字节,让我们说一个 int,为什么我没有收到错误?我已阅读有关打字的 documentation,但我不明白。为什么告诉函数变量应该是 bytes 但当你传递和 int 时没有错误的目的是什么?这可以由 isinstance(var, <class_type>) 处理,对吗?没看懂 =(

类型提示在 运行 时被忽略。

在页面顶部,the documentation that you've linked 包含一条说明(强调我的):

The Python runtime does not enforce function and variable type annotations. They can be used by third party tools such as type checkers, IDEs, linters, etc.

类型提示的目的是用于静态类型检查工具(例如 mypy),它使用静态分析来验证您的代码是否遵守书面类型提示。这些工具必须 运行 作为一个单独的进程。它们的主要用途是确保大型代码库中的新更改不会引入潜在的类型问题(最终可能成为难以解决的潜在错误)。

如果你想要明确的运行时间类型检查(例如,如果将错误类型的值传递给函数,则引发Exception) , 使用 isinstance().

默认情况下 python 在 运行 时忽略类型提示,但是 python 会在执行代码时保留类型信息。感谢这个库,作者可以实现 运行 时间类型检查包,例如 typeguard, pydantic or beartype.

如果您不想使用 isinstance 检查自己,您可以使用其中一个库。

Typeguard 示例:

main.py:

from typeguard import importhook
importhook.install_import_hook('mypack')

import mypack


mypack.documents_extractos("test")

mypack.py

def documents_extractos(pdf_bytes: bytes):
    pass

当你 运行 python3 main.py 你会得到错误 TypeError: type of argument "pdf_bytes" must be bytes-like; got str instead