我对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()
函数的实际定义在pyc
或pyd
文件中,位于我的C:\Python34\
目录中的某个位置,并且我没有包含py
定义的实际pickle.load()
文件,因为在安装Python时,我没有安装源代码。
问题:
(1)我的猜测大致正确吗?你能提供更准确的
(2)如何防止PyCharm错误地识别或不识别图书馆功能?为了确保PyCharm能够正确地进行检查,我是否应该始终安装Python和所有第三方包的源代码?
(3)如果我是对的,PyCharm生成这些文件,PyCharm如何猜测函数的签名?
(1)是的,你基本上是对的。
python_stubs
文件是一个自动生成的文件,其中包含内置函数的伪定义。PyCharm使用它来推断内置函数的类型,以防它们不是为给定版本硬编码的。(3)不可能总是只从他的文档中正确推断内置functoid的类型。一些docstring以“type signature”开头:
但是
pickle.load()
没有请注意,在将来的python版本中,这可能会发生变化,因为从python3.4开始,引入了Argument Clinic,这允许更好地检查C中定义的内置组件。我不确定PyCharm是否已经能够获得这些信息。
(2)尝试重建python骨架。然而,AFAIK,如果这不起作用,唯一真正的选择是在PyCharm's issue tracker上开一张罚单。
相关问题 更多 >
编程相关推荐