开启 Python 组件 Boto3 在 IDE 中的智能提示

在用 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('<service>') 的实际操作呢?网上找了找,确实有这个需求,解决办法有

  1. botostubs: 与 boto3 API 保持更新(每三天),并支持众多 IDE, 试过在 IntelliJ IDEA 和 Visual Studio Code 中可用
  2. pyboto3: 上次更新在两年前, https://github.com/wavycloud/pyboto3, 只在 Python 2.7 下测试过
  3. autoboto: 需有智能提示,但改变了应用 Boto 3 组件的方式,不建议使用

本文重点推荐 botostubs, 下面会叙说具体理由,在进入正是之前,不妨来回顾一下直接使用 Boto 3 时没有好的智能提示的问题

Boto 3 组件智能提示的现状

Visual Studio Code 中对 s3 = boto3.client('s3')  s3. 没有任何提示

IntelliJ IDEA 中只识别为 BaseClient

反而 Python 控制台令人意外的聪明,能提示出全部的操作,由于 Python 控制台每输入完一行马上进行解析,所以知道运行时类型

boto3.client('<service>') 的实际类型

> import boto3
>>> s3 = boto3.client('s3')
>>> type(s3)
<class 'botocore.client.S3'>
>>> type(boto3.client('sqs'))
<class 'botocore.client.SQS'>

现在正式开始步入正题,看我的日志总是需要一点耐心的

botostubs 开启 boto 3 API 在 IDE 中的智能提示

看 botostubs 组件页面 https://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,还有另外两种书写形式。在此对比一下所有的三种方式

形式 代码 说明
行内注释

1. import botostubs 行可省略
2. 如果有 import botostubs 的话,在 IntelliJ IEDA 书写 type: botostubs. 处也会有提示其下的类型
3. 书写比较便利,如果发布时需移除 botostubs 依赖可把源文件中的 import botostubs 去除
4. 同时支持 Visual Studio Code,通用性较强

文档注释

1. import botostubs 此时没有必要存在,因为在文档注释中写 :type: botostubs. 处没有智能提示
2. 源代码级别就无需依赖于 botostubs,它纯粹是级 IDE 看的
3. 但是在 Visual Studio Code 中没有智能提示

类型声明

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') 的形式,但是不支持文档注释方式

还有一个 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 大动手脚与之相适应。

也由于它完全颠覆了使用 Boto 3 的方式,以致于它更可能带来新的问题。

总结

botostubs 是目前最佳选择,并且编码形式上推荐 s3 = boto3.client('s3') # type: botostubs.S3。它与 Boto 3 保持同步更新,并兼容于 IntelliJ IDEA 和 Visual Studio Code。import botostubs 在 IntelliJ IDEA 中是非必要的,打包前去除 import botostubs 即可完全免去发行包对 botostubs 的依赖,带上它也无妨。

链接:

  1. Boto3 + Pyboto3 = Autocomplete = ❤︎
  2. Enable Intellisense for AWS Boto3 Type Hints in Microsoft Visual Studio Code

本文链接 https://yanbin.blog/aws-boto3-python-ide-autocomplete/, 来自 隔叶黄莺 Yanbin Blog

[版权声明] Creative Commons License 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。

Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments