Sustie

主页 所有文章 文章检索

给boto3增加type hints

最近使用boto3的时候,发现boto3.client()的返回值没有标注类型,导致开发的时候很不方便。我原先以为是boto3的开发者忘了添加,后来看了源代码才知道,boto3.client()返回的对象的 class 是在运行时动态生成的,所以很难进行 type hints。(这就是动态语言的坏处啊!)

好在有个开发者生成了boto3各种 client 的 stub,包名叫boto3-stubs。假如使用的是 S3 client,就输入:

pip install boto3-stubs[s3]

然后在 VSCode 里输入:

client = boto3.client('s3')

应该就会看到client已经被自动推断出了类型。

假如我们需要给接受 S3 client 的函数参数标注类型,就要这么写:

from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from mypy_boto3_s3.client import S3Client
else:
    S3Client = object

def f(x: S3Client):
    pass

TYPE_CHECKING是一个特殊常量,对于代码分析器,它的值为 True,正常运行时则为 False。加上S3Client = object的作用则是为了保证运行时S3Client依然是被定义的变量,不然执行时会报错。这个问题也可以通过加上from __future__ import annotations来解决。