PyCharm,什么是python_stubs?

时间:2014-06-17 14:13:14

标签: python pycharm

我遇到了很多问题,PyCharm无法正确识别库中的函数,所以我决定查看PyCharm错误识别的一些示例函数的源代码。例如,PyCharm无法正确识别pickle.load();它认为pickle.load()不接受任何论证,实际上它确实需要一个论点。我问了这个问题here。所以我写了以下简短的测试代码。

import pickle


r = range(10)
f = open("../temp/pickling_example.pkl", "wb")
pickle.dump(r, f)
f.close()
f = open("../temp/pickling_example.pkl", "rb")
pickle.load(f)
print(r)

我在Ctrl+B上按了pickle.load(f),这是倒数第二行。我希望这会将我带到包含pickle.load()定义的源文件,但它会将我带到位于C:\Users\ray\.PyCharm30\system\python_stubs\-1442825926\_pickle.py的文件中。该文件包含以下摘要(见下面的截图)。

在这里你可以看到PyCharm错误识别pickle.load()签名的问题的根源;根据此文件的pickle.load()签名没有参数。

有人可以解释为什么我被带到这里,这个文件是什么,以及python_stubs文件夹(更确切地说,C:\Users\ray\.PyCharm30\system\python_stubs\)是什么?

我的猜测如下。我被带到这个位置的文件,因为PyCharm无法在我的计算机上找到定义pickle.load()的实际源代码。在这些情况下,PyCharm只生成一个虚拟文件,其中只包含所用函数的声明(或只是签名),在本例中为pickle.load()。当我在Ctrl+B上按pickle.load()时,我收到了这个文件。此文件的目的纯粹是为了让PyCharm的检查正常工作并提供自动完成功能,PyCharm将所有这些文件放在python_stubs目录中。 pickle.load()函数的实际定义位于pyc目录中某处的pydC:\Python34\文件中,并且我没有实际的py包含pickle.load()定义的文件,因为当我安装Python时,我没有安装源代码。

问题:

(1)我的猜测大致正确吗?你能提供更准确和更准确的

吗?

(2)如何防止PyCharm错误地识别或不识别库函数?我是否应该确保始终安装Python的源代码和所有第三方软件包,以确保PyCharm能够正确地进行检查?

(3)如果我是对的,PyCharm生成这些文件,PyCharm如何猜测函数'签名?

2 个答案:

答案 0 :(得分:8)

(1)是的,你大多是正确的。

python_stubs文件是自动生成的文件,其中包含内置函数的虚拟定义。 PyCharm使用它来推断内置函数的类型,如果它们没有针对给定版本进行硬编码。

(3)并不总是只能从他的文档中正确地推断出内置函数的类型。一些文档字符串以“类型签名”开头:

>>> print(min.__doc__)
min(iterable[, key=func]) -> value
min(a, b, c, ...[, key=func]) -> value

pickle.load()没有。

请注意,这可能会在将来的python版本中发生变化,因为从python3.4开始引入了Argument Clinic,它允许更好地检查C中定义的内置函数。我不确定PyCharm是否已经能够获取这些信息。

(2)尝试重建python骨架。但是,AFAIK,唯一真正的选择,如果这不起作用,就是在PyCharm's issue tracker打开一张票。

答案 1 :(得分:0)

PEP484定义了这些stub files。根据PEP,它们应该用于类型提示,并且可以由类型检查器使用。