惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园_首页
C
Check Point Blog
B
Blog RSS Feed
G
Google Developers Blog
H
Help Net Security
博客园 - Franky
Blog — PlanetScale
Blog — PlanetScale
H
Hackread – Cybersecurity News, Data Breaches, AI and More
量子位
Recent Announcements
Recent Announcements
B
Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
D
DataBreaches.Net
小众软件
小众软件
T
The Blog of Author Tim Ferriss
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
MongoDB | Blog
MongoDB | Blog
Y
Y Combinator Blog
T
Tailwind CSS Blog
J
Java Code Geeks
MyScale Blog
MyScale Blog
雷峰网
雷峰网
有赞技术团队
有赞技术团队
博客园 - 聂微东

jdhao's digital space

Conversion between base64 and OpenCV or PIL Image 腾讯云对象存储博客图床开启 CDN 加速(不需要购买额外域名) Search and Replace in Multiple Files in Vim/Neovim Change Table Column Width in LaTeX Image or Table Side by Side in LaTeX LaTeX 并排显示图像或表格 Firenvim: Neovim inside Your Browser Content inside HTML tags missing in Latest Hugo? Creating Markdown Front Matter with Ultisnips Labelme JSON 标注格式转 voc XML 格式 Nifty Nvim Techniques That Make My Life Easier -- Series 6 macOS 下如何为视频制作字幕 Running Command Asynchronously inside Neovim Resolving Merge Conflict after Git Stash Pop Pylint: command not found? A Hands-on Experience with Neovim's Built-in LSP Support How to Convert PDF to Images with Imagemagick 互联网上常用缩略语集锦 File Backup in Neovim Converting PDF Pages to Images with Poppler Nifty Nvim Techniques That Make My Life Easier -- Series 5 Neovim Configuration for System-wide Use How to sort a list of tuple or list in Python -- lambda or itemgetter? Building A Vim Statusline from Scratch 人类第一颗原子弹爆炸始末 Distributed Training in PyTorch with Horovod Learning Expect Programming Essential Knowledge about SSH Nifty LaTeX Techniques -- Series 1 更改 Adsense 邮寄地址,重新寄送 PIN
Why Doesn't Jedi Autocompletion Work for Some Methods
2019-05-13 · via jdhao's digital space

Currently I am writing all my Python code using Neovim and a couple of plugins to provide auto-completion, linting, etc.

For code auto-completion, I use deoplete as my completion engine and deoplete-jedi as the completion source for Python. They work great most of the time. However, occasionally I can not get any auto-completion for some object instances. For example, auto-completion for object instances returned by the Image.open() method in the package Pillow does not work. I decide to take a look.

At first, I think it is an issue with deoplete or deoplete-jedi. However, I find that auto-completion for Image instances returned by other methods, e.g., Image.new(), works as expected. If this is an issue with deoplete or deoplete-jedi, then auto-completion should not work anymore. Maybe it is due to the static type checker Jedi that deoplete-jedi relies on?

To find out the real reason, I use the following script to check if Jedi can provide completion for Image instances returned by Image.open() and Image.new() method1:

import jedi

source1 = '''
from PIL import Image
im = Image.new('test.jpg', (128, 128))
im.
'''

script1 = jedi.Script(source1, 4, len('im.'), 'example1.py')
print(script1.completions())

source2 = '''
from PIL import Image
im = Image.open('test.jpg')
im.
'''
script2 = jedi.Script(source2, 4, len('im.'), 'example2.py')
print(script2.completions())

As expected, the first print() shows a list of completion results, while the second print() shows an empty list.

So this is actually an issue with Jedi. I filed an issue on the Jedi GitHub repo. After a while, I got a reply from the maintainer of this project. The root cause is that Jedi can not infer the type returned by Image.open() method since it is too dynamic to infer. The author suggested that I may use type hints to help Jedi infer the types of the return objects. I tried two ways based on the type hinting documentation of Jedi.

The first way is to use function annotations. I find the source file of Image.open() on my system and change the its definition from

to

def open(fp, mode="r") -> Image:

Now the auto-completion works for instance returned by Image.open() method. While this method works, it is cumbersome to use since it requires changing the source files of various packages.

The second way is to use type hints in inline comments. But the auto-completion does not work anymore. My test script is:

import jedi

source = '''
from PIL import Image
im = Image.open('test.png')  # type: Image
im.
'''

script = jedi.Script(source, 4, len('im.'), 'example.py')
print(script.completions())

The print function shows an empty list.

So for now, you may stick to function annotations if you really want type hints to work for Jedi.

References#