【问题标题】:Jedi - Python autocompletions (hints) not showing methods or suggestionsJedi - Python 自动完成(提示)不显示方法或建议
【发布时间】:2019-10-28 16:06:36
【问题描述】:

我目前正在开发 Sublime Text 3 使用 Jedi - Python 自动完成功能,具体来说,它适用于最基本的东西。 但是我在这种情况下使用它就像在 BeautifulSoup4 中一样

主要问题是,在执行多个点 (.) 方法时无法正确显示补全在一个文件上,完成者必须首先像 .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,因为它还有一些额外的工具,包括 Jedi。

这似乎特定于某些库,例如 numpybs4

注意:

并非特定于 Sublime Text 3。 Atom 和类似的 IDEs 也是如此。

【问题讨论】:

  • main 之后输入. 后是否显示任何内容?
  • 不,它不显示任何完成。它应该显示类方法(来自 bs4)
  • 稍后我会检查更多
  • 谢谢,希望有人(像你一样)可以澄清更多问题并至少解决这里的问题。就像 pinpoint 一样,绝地核心的 aham 做错了。
  • 问题基本上是bs4.element.Tag._find_all 中的代码(这是Soup.find 所做的)很难推断,绝地只是不理解它。当我阅读代码时,我什至不太确定返回类型是什么。那么绝地将如何理解......无论如何:解决方案是给 find 方法一个注释以显示它返回的类型。目前还不清楚那里会返回什么。

标签: python sublimetext3 sublime-text-plugin jedi


【解决方案1】:

Python 是一种动态语言。函数或方法的参数完全依赖于docstrings 的类型规范。返回类型也是如此。

例如,这是requests 模块的get 函数的docstring或文档):

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)

返回类型在函数定义中指定。您还可以指定函数的参数类型。

但是Soup类的find方法是这样写的:

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

编辑器可以查找Soup类的find方法。但是,他们不知道这个方法返回什么类型的对象。


分配给变量时,解决方法是specify type

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) 都返回&lt;class 'bs4.element.Tag'&gt;

我提供的链接足以让您了解 Python 中的静态类型并完美记录您的代码。希望这可以帮助。

【讨论】:

  • 谢谢,这是一个非常有用的见解。希望我们可以解决此解决方案以外的其他问题,因为它不太方便,并且不适用于典型用户。因此,我想为大众研究一个更方便的解决方案。非常感谢您花时间写这篇文章,如果没有其他答案出现,我会接受它作为解决方案。
  • 没问题。我同意你的答案是解决方法。但这就是动态语言的问题,例如javascript(或者一些如果它是库或框架)。因为一切都是动态的。然而,Typescript 现在真的很流行。这些类型注释对智能感知大有帮助。
  • 我们能不能把这个 :TAG 放在 beautifulsoup 库中,这样它就可以从那里开始工作了?然后建议提交并与他们合并?
  • 你可以。但它们托管在午餐垫上。 launchpad.net/beautifulsoup 。您也许可以在那里报告错误?
猜你喜欢
  • 2018-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-09
相关资源
最近更新 更多