我是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
就在那里。
我错过了什么吗?我做了一些愚蠢的错事吗?对不起,如果这完全是微不足道的。
答案 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