PyCharm,什么是python_stubs?

2024-05-23 19:50:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我对PyCharm无法正确识别库中的函数有很多问题,所以我决定研究PyCharm错误识别的一些示例函数的源代码。例如,PyCharm不能正确识别pickle.load();它认为pickle.load()不接受任何参数,而实际上它只接受一个参数。我问过那个问题。所以我写了以下简短的测试代码。

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()。当我在pickle.load()上按Ctrl+B时,这个文件就是我被带到的地方。这个文件的目的纯粹是为了让PyCharm的检查正常工作并提供自动完成功能,PyCharm将所有这些文件放入python_stubs目录。pickle.load()函数的实际定义在pycpyd文件中,位于我的C:\Python34\目录中的某个位置,并且我没有包含py定义的实际pickle.load()文件,因为在安装Python时,我没有安装源代码。

问题:

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

(2)如何防止PyCharm错误地识别或不识别图书馆功能?为了确保PyCharm能够正确地进行检查,我是否应该始终安装Python和所有第三方包的源代码?

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


Tags: 文件函数参数定义源代码example错误load
1条回答
网友
1楼 · 发布于 2024-05-23 19:50:12

(1)是的,你基本上是对的。

python_stubs文件是一个自动生成的文件,其中包含内置函数的伪定义。PyCharm使用它来推断内置函数的类型,以防它们不是为给定版本硬编码的。

(3)不可能总是只从他的文档中正确推断内置functoid的类型。一些docstring以“type signature”开头:

>>> 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上开一张罚单。

相关问题 更多 >