Jedi 完成不适用于使用 Image.open() 方法创建的 Image 对象
Jedi completion does not work for Image object created using Image.open() method
我正在使用 deoplete-jedi 在 Neovim 中提供自动完成功能。我发现如果我使用 Image.open() method when using Pillow. But for Image instance created using 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())
因为这两个方法都是 return 一个 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
未在同一文件中调用。
这就是 Jedi 停止寻找解决方案的地方。所以你可以看到推断类型并不总是可能的。即使我不确定返回的类型是什么,我也试着看 10 分钟。解决方案通常是 stubs/type 注释。
我正在使用 deoplete-jedi 在 Neovim 中提供自动完成功能。我发现如果我使用 Image.open() method when using Pillow. But for Image instance created using 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())
因为这两个方法都是 return 一个 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
未在同一文件中调用。
这就是 Jedi 停止寻找解决方案的地方。所以你可以看到推断类型并不总是可能的。即使我不确定返回的类型是什么,我也试着看 10 分钟。解决方案通常是 stubs/type 注释。