jedi能够自动完成自定义库吗?

时间:2017-09-29 00:50:13

标签: python autocomplete dataset jedi

我是Python的新用户,所以我不确切知道我在做什么。请记住:)

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

但是,在尝试 dataset 的示例脚本时:

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

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

我尝试调试它并将问题缩小到 jedi dataset 。 在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就在那里。

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

1 个答案:

答案 0 :(得分:0)

此示例的问题在于,静态类型推断比您在终端中执行的方式难得多。 Jedi可以为两者工作,但显然可以通过更短的时间获得运行时信息以取得成功。

如果您查看 .<List<File>, List<Message<ByteArrayOutputStream>>>transform(files -> { HashMap<String, ZipOutputStream> zipOutputStreamHashMap = new HashMap<>(); HashMap<String, ByteArrayOutputStream> zipByteArrayMap = new HashMap<>(); ArrayList<Message<ByteArrayOutputStream>> messageList = new ArrayList<>(); files.forEach(file -> { String warehouseId = file.getName().substring(file.getName().indexOf('.') + 1); ZipOutputStream warehouseStream = zipOutputStreamHashMap.computeIfAbsent(warehouseId, s -> new ZipOutputStream(zipByteArrayMap.computeIfAbsent(s, s1 -> new ByteArrayOutputStream()))); try { warehouseStream.putNextEntry(new ZipEntry(file.getName())); FileInputStream inputStream = new FileInputStream(file); byte[] bytes = new byte[4096]; int length; while ((length = inputStream.read(bytes)) >= 0) { warehouseStream.write(bytes, 0, length); } inputStream.close(); } catch (IOException e) { e.printStackTrace(); } }); zipOutputStreamHashMap.forEach((s, zipOutputStream) -> { try { zipOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } }); zipByteArrayMap.forEach((key, byteArrayOutputStream) -> { messageList.add(MessageBuilder.withPayload(byteArrayOutputStream).setHeader("warehouseId", key).build()); }); return messageList; }) .split() .transform(ByteArrayOutputStream::toByteArray) .handle(Ftp.outboundAdapter(FTPServers.PC_LOCAL.getFactory(), FileExistsMode.REPLACE) ...... 的代码,很清楚了解返回的类型并非易事。有很多电话很难接听。这里最大的问题是缓存。词典用于保存表。绝地还没有遵循字典的任务。这意味着,尽管绝地了解dataset,但绝地却不了解{'a': 1}['a']。绝地(Jedi)认为该词典是空的,不希望更改词典。我希望有一天能实现,但这并不容易,因为您始终必须考虑性能。

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

PS:在您的x = {}; x['a'] = 1; x['a']上缺少Script('import dataset;dataset.table.').completions()的地方快速记一下。这是有道理的。 insert确实不存在,它在insert中:

dataset.table.Table.insert