Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PyCharm,什么是python_存根?_Python_Pycharm - Fatal编程技术网

PyCharm,什么是python_存根?

PyCharm,什么是python_存根?,python,pycharm,Python,Pycharm,我在PyCharm无法正确识别库中的函数时遇到了很多问题,因此我决定研究PyCharm无法正确识别的一些示例函数的源代码。例如,PyCharm无法正确识别pickle.load();它认为pickle.load()不接受任何参数,而实际上它只接受一个参数。我问过这个问题。因此,我编写了以下简短的测试代码 import pickle r = range(10) f = open("../temp/pickling_example.pkl", "wb") pickle.dump(r, f) f.

我在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)
我在倒数第二行的
pickle.load(f)
上按了
Ctrl+B
。我希望这会将我带到包含
pickle.load()
定义的源文件,但它将我带到
C:\Users\ray\.PyCharm30\system\python\u stubs \-1442825926 \\u pickle.py
位置的文件。此文件包含以下摘要(请参见下面的屏幕截图)

在这里,您可以看到PyCharm错误识别pickle.load()签名的问题根源。;根据此文件的
pickle.load()
签名没有参数

有人能解释一下我为什么被带到这里来,这个文件是什么,以及
python\u stubs
文件夹(更准确地说,
C:\Users\ray\.PyCharm30\system\python\u stubs\
)是什么吗

我的猜测如下。我是在这个位置找到这个文件的,因为PyCharm在我的计算机上找不到定义了
pickle.load()
的实际源代码。在这些情况下,PyCharm只生成一个伪文件,其中只包含所用函数的声明(或签名),在本例中是
pickle.load()
。当我在
pickle.load()
上按下
Ctrl+B
时,这个文件就是我被带到的地方。该文件的目的纯粹是为了使PyCharm的检查能够正常工作并提供自动完成,PyCharm将所有这些文件放入
python\u stubs
目录中。
pickle.load()
函数的实际定义在
pyc
pyd
文件中,在我的
C:\Python34\
目录的某个地方,我没有包含
pickle.load()
定义的实际
py
文件,因为我安装Python时没有安装源代码

问题:

(1) 我的猜测大致正确吗?你能提供更准确的信息吗

(2) 如何防止PyCharm错误识别或不识别库函数?我是否应该确保始终安装Python和所有第三方软件包的源代码,以确保PyCharm能够正确执行其检查

(3) 如果我说的没错,PyCharm会生成这些文件,那么PyCharm是如何猜测函数的签名的呢?

(1)是的,你基本上是对的

python_stubs
文件是一个自动生成的文件,其中包含内置函数的虚拟定义。PyCharm使用它来推断内置函数的类型,前提是它们不是针对给定版本硬编码的

(3) 仅从文档中正确推断内置functoid的类型并不总是可能的。某些文档字符串以“类型签名”开头:

但是
pickle.load()
没有

请注意,这可能会在未来的python版本中发生变化,因为从python3.4开始,引入了可以更好地检查C中定义的内置项的功能。我不确定PyCharm是否已经能够获得这些信息


(2) 尝试重建python骨架。然而,如果这不起作用,唯一的实际选择是在上打开一张票据。

PEP484定义了这些。根据政治公众人物的说法,它们应该用于输入提示,并且可以由类型检查器使用。

哇,非常感谢您首先阅读了我的长问题,更不用说您的精彩答案了!我真的不知道Python骨架是什么。这是Python概念还是PyCharm概念?有没有指向我可以学习骷髅的页面的指针?@Ray这是一个与PyCharm相关的术语。“骨架”是PyCharm从提供其功能所需的已安装和内置库自动生成的所有文件。这包括生成
python_存根
文件。启动PyCharm时,您经常可以在状态栏中看到一些关于为项目解释器重建这些骨架的消息。您应该能够在重新启动时强制重建,使缓存无效(在
文件
菜单下)。
>>> print(min.__doc__)
min(iterable[, key=func]) -> value
min(a, b, c, ...[, key=func]) -> value