PyCharm,什么是python_stubs?

问题描述 投票:22回答:2

我在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错误识别或不识别库函数?为了确保PyCharm可以正确进行检查,请确保我始终安装Python和所有第三方软件包的源代码吗?

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

python pycharm
2个回答
14
投票

((1)是的,您基本上是正确的。

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

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

>>> 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上打开票证。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.