python - Jedi 补全不适用于使用 Image.open() 方法创建的 Image 对象
问题描述
我正在使用 deoplete-jedi 在 Neovim 中提供自动完成功能。我发现如果在使用Pillow时使用Image.open()方法创建 Image 对象实例,则自动完成功能不起作用。但是对于使用Image.new()方法创建的 Image 实例,自动完成工作正常。
经过大量调试,我终于找到了原因。因为 Jedi 包无法为Image.open()
方法创建的 Image 实例提供补全。
下面的代码显示了差异:
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())
由于这两种方法都返回一个 Image 对象,我不知道为什么自动完成的行为不同。
版本信息
- Python:Python 3.6.8
- 绝地:0.13.3
- 枕头:5.2.0
解决方案
问题通常是Image.open()
像缓存这样的事情,几乎不可能推断出正确的类型。
在这个例子中(看看https://github.com/python-pillow/Pillow/blob/master/src/PIL/Image.py#L2690),绝地试图跟随im
-> _open_core(...)
-> 其他im
-> factory(...)
->factory
似乎factory, accept = OPEN[i]
-> 但是什么是OPEN
-> 它被定义为一个空的{}
,并且从外部填充register_open()
或从外部填充 ->register_open
不在同一个文件中调用。
这就是绝地停止寻找解决方案的地方。所以你可以看到推断类型并不总是可能的。即使我不确定返回的类型是什么,我也试着看了 10 分钟。解决方案通常是为此的存根/类型注释。
推荐阅读
- php - preg_replace 用于字符串中的“phpbb”报价和颜色标签
- nlp - 句子的实体检测在训练和测试句子中有所不同
- asp.net-mvc - 通过剃刀初始化打字稿变量值
- python-3.5 - 无法建立初始 TCP/IP 连接 (Chilkat-Python)
- notepad++ - 需要正则表达式来匹配记事本++中的特定模式
- python - 修复 numpy.nextafter 没有返回函数
- jupyter-notebook - 需要正确的命令语法才能启动本地 jupyter 笔记本服务器并在 OneDrive 文件夹位置打开 .ipynb 文件
- android - 如果我以相同的方法执行两个事务,则领域已经处于写入事务中
- python - 使用python快速扫描端口
- vue.js - 使用 jQuery 将 vuejs 挂载到 DOM 元素