【问题标题】:Is jedi able to autocomplete custom libraries?jedi 是否能够自动完成自定义库?
【发布时间】:2018-03-10 20:26:57
【问题描述】:

我是 Python 的新用户,所以我不知道自己在做什么。请记住这一点:)

我正在使用带有 Sublime Text 3 的 Anaconda 作为我的 Python IDE。 据我了解,Anaconda 使用 jedi 来查找导入包的自动补全。

但是,在尝试数据集的示例脚本时:

db = dataset.connect('sqlite:///ebay.db')
table = db['searches']
table.insert [...]
     ^ problem happens there`

在点之后,我没有自动完成 insert(或任何其他功能)。 当我在 python 控制台中尝试它时,它工作正常。

我尝试调试它并将问题缩小到 jedidataset。 在 Python 控制台:

>>> from jedi import Script
>>> print(Script('import dataset;dataset.table.').completions())

返回:

[<Completion: and_>, <Completion: ClauseElement>, <Completion: Column>, <Completion: DatasetException>, <Completion: ensure_tuple>, <Completion: expression>, <Completion: false>, <Completion: func>, <Completion: Index>, <Completion: index_name>, <Completion: log>, <Completion: logging>, <Completion: normalize_column_name>, <Completion: normalize_table_name>, <Completion: NoSuchTableError>, <Completion: QUERY_STEP>, <Completion: ResultIter>, <Completion: select>, <Completion: SQLATable>, <Completion: Table>, <Completion: threading>, <Completion: Types>, <Completion: warnings>, <Completion: __doc__>, <Completion: __file__>, <Completion: __name__>, <Completion: __package__>]

注意那里没有Completion: insert

如果我尝试列出 dataset. 的完成,它看起来像它的工作:

>>> from jedi import Script
>>> print(Script('import dataset;dataset.').completions())

返回:

[<Completion: connect>, <Completion: Database>, <Completion: database>, <Completion: os>, <Completion: row_type>, <Completion: Table>, <Completion: table>, <Completion: types>, <Completion: util>, <Completion: warnings>, <Completion: __all__>, <Completion: __doc__>, <Completion: __file__>, <Completion: __name__>, <Completion: __package__>]

如您所见,Completion: connect 就在那里,例如。

我错过了什么吗?我在做一些愚蠢的错误吗?对不起,如果这完全是微不足道的。

【问题讨论】:

  • 您使用这些工具是否有特定原因?考虑 Pycharm、PyDev、Aptana 或开箱即用的工具并避免出现问题。
  • 是的.. 原因是我真的用 SublimeText 做所有事情,如果我能保持这种方式会更好。不过我会看看你提到的工具,谢谢!
  • @JosepValls “考虑 Pycharm、PyDev、Aptana”。这完全是错误的。在完成方面,您列出的工具(Pycharm 除外)要糟糕得多。没有人在那里完成工作。与 thta 不同,Pycharm 是一个非常好的工具,但在完成方面也不是更好。他们可能更糟。他们做得更好的是:重构,他们有一个很好的调试器和 linting。

标签: python autocomplete dataset jedi


【解决方案1】:

这个例子的问题是静态类型推断比你在终端中做的要困难得多。 Jedi 可以同时为这两者工作,但显然更容易通过运行时信息获得成功。

如果您查看dataset 的代码,很明显要了解返回的类型并非易事。有很多很难听懂的电话。这里最大的问题是缓存。字典用于保存表格。绝地不遵循字典分配(还)。这意味着虽然 Jedi 理解 {'a': 1}['a'],但 Jedi 不理解 x = {}; x['a'] = 1; x['a']。 Jedi 认为 dict 是空的并且不寻找 dict 更改。我希望有一天能实现它,但这并不容易,因为你总是要考虑性能。

我在 Jedi 跟踪器中针对这种行为创建了一个问题:https://github.com/davidhalter/jedi/issues/1385。但是我不确定这会解决这个问题。真正解决这种情况的是类型注释(或存根)。我很确定 PyCharm 也有同样的问题。

PS:关于您的Script('import dataset;dataset.table.').completions() 的快速注释,其中缺少insert。这是有道理的。 insert 确实不存在,在dataset.table.Table.insert

>>> import jedi
>>> jedi.Script('import dataset;dataset.table.Table.insert').goto_definitions()
[<Definition full_name='dataset.table.Table.insert', description='def insert'>]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 2013-03-17
    • 1970-01-01
    • 2017-01-26
    • 1970-01-01
    相关资源
    最近更新 更多