在用 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>') 的实际操作呢?网上找了找,确实有这个需求,解决办法有
- botostubs: 与 boto3 API 保持更新(每三天),并支持众多 IDE, 试过在 IntelliJ IDEA 和 Visual Studio Code 中可用
- pyboto3: 上次更新在两年前, https://github.com/wavycloud/pyboto3, 只在 Python 2.7 下测试过
- 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. |
||
文档注释 |
|
1. |
||
类型声明 |
|
1. |
以上三种形式在 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')
的形式,但是不支持文档注释方式
1 2 3 |
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 大动手脚与之相适应。
1 2 3 |
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
的依赖,带上它也无妨。
链接:
- Boto3 + Pyboto3 = Autocomplete = ❤︎
- Enable Intellisense for AWS Boto3 Type Hints in Microsoft Visual Studio Code
本文链接 https://yanbin.blog/aws-boto3-python-ide-autocomplete/, 来自 隔叶黄莺 Yanbin Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。