我遇到了很多问题,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错误地识别或不识别库函数?我是否应该确保始终安装Python的源代码和所有第三方软件包,以确保PyCharm能够正确地进行检查?
(3)如果我是对的,PyCharm生成这些文件,PyCharm如何猜测函数'签名?
答案 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,它们应该用于类型提示,并且可以由类型检查器使用。