PyCharm,什么是python_stubs?
由于PyCharm无法正确识别库中的函数,我遇到了很多问题,因此我决定研究PyCharm无法正确识别的一些示例函数的源代码。例如,PyCharm无法pickle.load()
正确识别。它认为pickle.load()
不带任何参数,而实际上却带一个参数。我在这里问过这个问题。因此,我编写了以下简短的测试代码。
import pickler = 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\
是)是什么?
我的猜测如下。我被带到此文件中是因为PyCharmpickle.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的问题跟踪器上打开故障单。
以上是 PyCharm,什么是python_stubs? 的全部内容, 来源链接: utcz.com/qa/405757.html