【问题标题】:Jedi completion does not work for Image object created using Image.open() methodJedi 补全不适用于使用 Image.open() 方法创建的 Image 对象
【发布时间】:2019-05-07 13:29:44
【问题描述】:

我正在使用 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

【问题讨论】:

    标签: python autocomplete python-imaging-library code-completion python-jedi


    【解决方案1】:

    问题通常是像 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 分钟。解决方案通常是存根/类型注释。

    【讨论】:

      猜你喜欢
      • 2013-09-26
      • 2013-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多