Завершение джедая не работает для объекта Image, созданного с использованием метода Image.open () - PullRequest
0 голосов
/ 07 мая 2019

Я использую deoplete-jedi для автозаполнения в Neovim. Я обнаружил, что автозаполнение не работает, если я создаю экземпляр объекта Image с использованием метода Image.open () при использовании Подушка . Но для экземпляра Image, созданного с использованием метода Image.new () , автозаполнение работает правильно.

После долгих отладок я наконец-то выяснил причину. Поскольку пакет Jedi не может предоставить дополнения для экземпляра Image, созданного методом Image.open().

В приведенном ниже коде показаны различия:

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

1 Ответ

1 голос
/ 08 мая 2019

Проблема обычно заключается в том, что такие вещи, как 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 минут. Решением обычно являются заглушки / аннотации типа для этого.

...