绝地完成不适用于使用 Image.open() 方法创建的图像对象



我正在使用deoplete-jedi在Neovim中提供自动完成功能。我发现如果我在使用 Pillow 时使用 Image.open() 方法创建图像对象实例,自动完成不起作用。但是对于使用 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),Jedi 试图遵循im->_open_core(...)->其他im->factory(...)->factory看起来像factory, accept = OPEN[i]->但OPEN是什么 ->它被定义为一个空{},并填充register_open()或从外部填充 ->register_open不会在同一个文件中调用。

这就是绝地停止寻找解决方案的地方。因此,您可以看到并不总是可以推断类型。即使我不确定返回的类型是什么,我尝试查看它 10 分钟。解决方案通常是存根/类型注释。

尝试:

im: Image.Image = Image.open('test.jpg')

明确类型暗示im是一个Image.Image对象对我有用,绝地做得很好。

相关内容

  • 没有找到相关文章

最新更新