由于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()
上按下pickle.load()
时,这个文件就是我被带到的地方。这个文件的目的纯粹是为了使PyCharm的检查工作正常,并且可以提供自动完成,PyCharm将所有这些文件放在python_stubs
目录中。pickle.load()
函数的实际定义位于pyc
或pyd
文件中的某个C:\Python34\
目录中,而且我没有包含pickle.load()
定义的实际py
文件,因为当我安装py
时,没有安装源代码。
问题:
(1)我的猜测大致正确吗?你能提供更正确更精确的吗?
(2)如何防止PyCharm错误识别或不识别图书馆功能?我应该确保我总是安装Python和所有第三方软件包的源代码,以确保PyCharm能够正确地进行检查吗?
(3)如果我说得对,PyCharm会生成这些文件,PyCharm是如何猜测函数的签名的?
发布于 2014-06-17 17:11:21
(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开始,引入了论证诊所,它允许更好地检查C中定义的内置程序,我不确定PyCharm是否已经能够获得这些信息。
(2)尝试重建蟒蛇骨骼。然而,AFAIK,唯一真正的选择,如果这不起作用,就是在PyCharm问题追踪器上打开一张票。
发布于 2020-05-29 23:45:22
PEP484定义了这些存根文件。根据PEP,它们应该是类型提示,并且可以被类型检查器使用.
https://stackoverflow.com/questions/24266114
复制相似问题