我在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
目录中的pyd
或C:\Python34\
文件中,并且我没有包含py
定义的实际pickle.load()
文件,因为我安装了Python,但没有安装源代码。
问题:
((1)我的猜测大致正确吗?您能否提供更准确,更准确的
((2)如何防止PyCharm错误识别或不识别库函数?为了确保PyCharm可以正确进行检查,请确保我始终安装Python和所有第三方软件包的源代码吗?
((3)如果我是对的,PyCharm会生成这些文件,PyCharm如何猜测函数的签名?
((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上打开票证。
PEP484定义了这些stub files。根据PEP,它们应该用于类型提示,并且可以由类型检查器使用。