在用 Python 编写 AWS 服务时,要用到 Boto 3 组件,而像 boto3.client('s3') 获得的对象只能被 IDE 识别为一个 BaseClient, 具体包含什么操作方法是在运行时由参数 s3 指示的基于 JSON 文件所描述的。因此 IDE 对 s3 = boto3.client('s3') 的 s3 对象无法提供有效的智能提示,每次用 Boto 3 时不得不打开 Boto 3 的在线 API 文档来对照。长此以往,总觉麻烦且效率低下,有种一直摸着石头过河的感觉。那么,是否有办法让 IDE 智能提示出各种 boto3.client('
本文重点推荐 botostubs, 下面会叙说具体理由,在进入正是之前,不妨来回顾一下直接使用 Boto 3 时没有好的智能提示的问题
Boto 3 组件智能提示的现状
Visual Studio Code 中对 s3 = boto3.client('s3') s3. 没有任何提示
源代码:Python资源共享群:484031800
IntelliJ IDEA 中只识别为 BaseClient
反而 Python 控制台令人意外的聪明,能提示出全部的操作,由于 Python 控制台每输入完一行马上进行解析,所以知道运行时类型
boto3.client('
> import boto3 >>> s3 = boto3.client('s3') >>> type(s3)>>> type(boto3.client('sqs'))
现在正式开始步入正题,看我的日志总是需要一点耐心的
botostubs 开启 boto 3 API 在 IDE 中的智能提示
看 botostubs 组件页面 h ttps://pypi.org/project/botostubs/ ,它号称的是让任何 IDE 能对 Botot 3 API 进行智能提示,比如 IntelliJ IDEA, Visual Studio Code, Vim, Emacs, Sublime, Atom 等。而且它能紧跟 Boto 3 的更新,它每三天检查一次 boto 3 是否有更新,有更新时则生成新的桩 -- 今天(2019-07-13) GitHub 上显示最后更新时间为 12 天前。所以本地要在 IDE 中获得最新智能提示,应经常性的用 pip install --upgrade botostubs 更新。
首先需要安装 botostubs, 命令 pip install botostubs
botostubs 在 IDE 的使用
应用 botostubs 时需要在代码中有一点变动,基本对原有代码没有侵入性的。
下图是在 IntelliJ IDEA 中的表现,有了 botostubs 后, IDE 能认出这儿的 s3 是一个 S3 类型,进而提示出所有实际可用的操作以及方法参数类型
在这里 botostubs 借用了 Python 3 之后类型提示(type hints) 的语法,关于类型提示可参考 全面理解Python中的类型提示(Type Hints) 。
具体来说除了前面的紧随变量声明后的 # type: botostubs.S3 ,还有另外两种书写形式。在此对比一下所有的三种方式
形式 代码 说明 行内注释 import botostubs import boto3 s3 = boto3.client('s3') # type: botostubs.S3 s3.delete_bucket(...)
1. import botostubs 行可省略
2. 如果有 import botostubs 的话,在 IntelliJ IEDA 书写 type: botostubs. 处也会有提示其下的类型
3. 书写比较便利,如果发布时需移除 botostubs 依赖可把源文件中的 import botostubs 去除
4. 同时支持 Visual Studio Code,通用性较强
文档注释 import boto3 s3 = boto3.client('s3') """ :type: botostubs.S3 """ s3.delete_bucket(...)
1. import botostubs 此时没有必要存在,因为在文档注释中写 :type: botostubs. 处没有智能提示
2. 源代码级别就无需依赖于 botostubs ,它纯粹是级 IDE 看的
3. 但是在 Visual Studio Code 中没有智能提示
类型声明 import botostubs import boto3 s3: botostubs.S3 = boto3.client('s3') s.delete_bucket(...)
1. import botostubs 也不能省略了,否则解析执行时会报错
2. 对 botostubs 有强依赖,不建议使用,而且 Python 2 不能用 -- 不过谁还在用 Python 2 呢?
3. 在 Visual Studio Code 中也支持
以上三种形式在 IntelliJ IDEA 都有效果,基于通用性来讲第一种方式更可取,这也是为什么 botostubs 的官方只演示了该方式。在发布包带上 botostubs 这个运行时无关的依赖还算不上什么牺牲。
注:如果在基于 IntelliJ 的 IDE 中不能得到有效提示,需要在 IDE 的 Help/ Edit Custom Properties... 中加上一行
idea.max.intellisense.filesize=20000
再来到 Visual Studio Code 中体验一下
在 Visual Studio Code 中也可以用 batch: botostubs.Batch = boto3.client('batch') 的形式,但是不支持文档注释方式
batch = boto3.client('batch') """ :type: botostubs.Batch """ batch. # 这时在 Visual Studio Code 中没有智能提示
还有一个 Visual Studio Code 比 IntelliJ IDEA 弱的地方是,书写注释时 botostubs. 无法提示出其下的类型,希望 Visutal Studio Code 以后会有所改进。
注:在 Visual Studio Code 中用 botostubs 的话,如果不能提示,请在 Visual Studio Code 设置中把 python.jediEnabled 设置为 false。
顺带了解另两个 pyboto3 和 autoboto
虽然不建议使用它们,但不妨来看一下
pyboto3 在 IntelliJ IDEA 中
上图来自于官方的 GitHub 网站 https://github.com/wavycloud/pyboto3 。它的实现与 botostubs 类似,只是没有人再维护了,随着 Boto 3 的升级,只能提示老的 API 的,而且也只在 Python 2.7 下测试过。亲测了一下,在 Visual Studio Code 中没有智能提示。
autoboto 实际是 boto3 的封装
https://github.com/jbasko/autoboto 也说了不建议使用,已彻底停止维护了。
boto3 with auto-complete in PyCharm and dataclasses not dicts. NOT RECOMMENDED FOR USE (2019-01-26)
它完全构架于 Boto 3 之上的,可维护性太差,Boto 3 一小升级可能导致 autoboto 大动手脚与之相适应。
from autoboto.services import s3 s3 = s3.Client()
也由于它完全颠覆了使用 Boto 3 的方式,以致于它更可能带来新的问题。
总结
botostubs 是目前最佳选择,并且编码形式上推荐 s3 = boto3.client('s3') # type: botostubs.S3 。它与 Boto 3 保持同步更新,并兼容于 IntelliJ IDEA 和 Visual Studio Code。 import botostubs 在 IntelliJ IDEA 中是非必要的,打包前去除 import botostubs 即可完全免去发行包对 botostubs 的依赖,带上它也无妨。