Неправильные завершения джедая для многопроцессорного модуля в python3

Работая с автозаполнением-python атома, который использует jedi, я обнаружил, что есть неправильные предложения для модуля multiprocessing в python3. Вот пример:

>>> import jedi
>>> source = '''
... import multiprocessing as mp
... mp.Pro'''
>>> script = jedi.Script(source, 3, len('mp.Pro'), 'example.py')
>>> script.completions()
[<Completion: process>]

Модуль на самом деле имеет пакет process, но также имеет класс Process внутри области модуля:

>>> import multiprocessing as mp
>>> [n for n in mp.__all__ if n.endswith('rocess')]
['Process', 'current_process']

Сравнивая модуль multiprocessing python2 и python3, я обнаружил, что они немного отличаются. Современная версия импортирует пространство имен пространства имен контекста по умолчанию:

globals().update((name, getattr(context._default_context, name))
             for name in context._default_context.__all__)
__all__ = context._default_context.__all__

К сожалению, у меня нет никаких идей, как решить эту проблему или обойти ее. У Вас есть какие-то предложения?


person frist    schedule 09.11.2016    source источник


Ответы (1)


Джедаи не понимают записи в globals().

Это явно указано в http://jedi.readthedocs.io/en/latest/docs/features.html#unsupported-features

Очень долгое время я даже не рассматривал возможность реализации этого, теперь я открыт для этого. Но может надолго. (Это больше не будет большим убийцей производительности.)

Однако пока я думаю, что вам просто нужно жить с этой проблемой.

person Dave Halter    schedule 09.11.2016
comment
Спасибо за ваш ответ, я надеюсь, что вы получите его через некоторое время. Также мне интересно, знаете ли вы, как работает автозаполнение в IDE, таких как PyCharm? - person frist; 10.11.2016
comment
Это работает аналогичным образом. Однако, кроме того, у них есть много скелетных файлов (я думаю, что они так их называют). Вывод типа для многопроцессорной обработки, вероятно, будет перенаправлен на такой скелетный файл, чтобы обеспечить лучшее автозаполнение (где нет globals(). Джедаи, напротив, в основном пытались понять код Python в полной мере. Я чувствую, что теперь джедаи подошли к точке, где потребуется плагин и/или каркасная система. - person Dave Halter; 10.11.2016