【发布时间】:2014-08-07 14:26:29
【问题描述】:
我遇到了很多 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)
我在倒数第二行的pickle.load(f) 上按下了Ctrl+B。我希望这会将我带到包含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() 函数的实际定义在我的C:\Python34\ 目录中某处的pyc 或pyd 文件中,我没有包含py 定义的实际py 文件,因为当我安装了 Python,我没有安装源代码。
问题:
(1) 我的猜测大致正确吗?能否提供更准确更准确的
(2) 如何防止 PyCharm 错误识别或不识别库函数?我是否应该确保我始终安装 Python 的源代码和所有 3rd 方包,以确保 PyCharm 可以正确进行检查?
(3) 如果我是对的,PyCharm 会生成这些文件,PyCharm 如何猜测函数的签名?
【问题讨论】: