Джедай - автозаполнения Python (подсказки), не показывающие методы или предложения - PullRequest
4 голосов
/ 28 октября 2019

В настоящее время я работаю над Sublime Text 3, используя автодополнения в Jedi - Python, и, если быть точным, он работает с большинством базовых вещей. Однако я использую его так же, как в этом случае с BeautifulSoup4

Проблема main в том, что не отображаются правильные завершения при выполнении нескольких точек (. ) методов в файле, и завершитель должен полагаться на то, что он сначала увидит его, как метод .find_all, а затем предложит его (однако, похоже, это автозаполнение из самого Sublime Text 3).

Что происходит в следующем случае

import requests
from bs4 import BeautifulSoup as Soup // works ok, shows all suggestions

request = requests.get('http://example.com')    
soup = Soup(request.text, 'lxml')


main = soup.find('body') // shows find method 
//However, No available completions in the next case
second_lookup = main.find('div') // doesn't show any autocompletions/hints when starting w/ .fi..

То же самое происходит при поиске любых других «более глубоких» методов для автозаполнения. Я уже пытался настроить все параметры в файле Jedi..settings. Это не помогло, и я попытался использовать Anaconda , так как у него есть некоторые дополнительные инструменты, включая джедаев.

Это, кажется, характерно для некоторых библиотек, таких как, например, numpy и bs4 .

Примечание:

This не специфично для Sublime Text 3. То же самое относится к Atom и аналогичным IDE s.

1 Ответ

1 голос
/ 29 октября 2019

Python - это динамический язык. Аргументы функции или метода полностью зависят от спецификации типа docstrings . То же самое относится и к типу возврата.

Например, это docstring ( или документация ) функции get модуля requests:

def get(url, params=None, **kwargs):
    r"""Sends a GET request.

    :param url: URL for the new :class:`Request` object.
    :param params: (optional) Dictionary, list of tuples or bytes to send
        in the query string for the :class:`Request`.
    :param \*\*kwargs: Optional arguments that ``request`` takes.
    :return: :class:`Response <Response>` object
    :rtype: requests.Response
    """

    kwargs.setdefault('allow_redirects', True)
    return request('get', url, params=params, **kwargs)

Тип возврата указан в определении функции. Вы также можете указать тип аргументов для функций.

Однако метод find класса Soup записан так:

def find(self, name=None, attrs={}, recursive=True, text=None,
         **kwargs):
    """Return only the first child of this Tag matching the given
    criteria."""
    r = None
    l = self.find_all(name, attrs, recursive, text, 1, **kwargs)
    if l:
        r = l[0]
    return r

Редакторы могут искать find методSoup класс. Но они не знают, какой тип объекта возвращает этот метод.


Обходной путь должен указывать тип при назначении переменной:

import requests
from bs4 import Tag
from bs4 import BeautifulSoup as Soup

request = requests.get('http://example.com')

soup = Soup(request.text, 'lxml')

main: Tag  = soup.find('body')

# Auto completion works.
second_lookup = main.find('div')

ИлиВы можете добавить :rtype: Tag в find строку документации. Я знаю, что он возвращает Tag объект, поскольку type(main) или type(second_lookup) оба возвращают <class 'bs4.element.Tag'>.

Предоставленные мной ссылки достаточны для того, чтобы вы узнали о статической типизации в python и отлично документировали свой код. Надеюсь это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...