【问题标题】:PyCharm, what is python_stubs?PyCharm,什么是 python_stubs?
【发布时间】: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 时被带到的地方。该文件的目的纯粹是为了让 PyC​​harm 的检查能够正常工作并提供自动完成功能,并且 PyCharm 将所有这些文件放入 python_stubs 目录中。 pickle.load() 函数的实际定义在我的C:\Python34\ 目录中某处的pycpyd 文件中,我没有包含py 定义的实际py 文件,因为当我安装了 Python,我没有安装源代码。

问题:

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

(2) 如何防止 PyCharm 错误识别或不识别库函数?我是否应该确保我始终安装 Python 的源代码和所有 3rd 方包,以确保 PyCharm 可以正确进行检查?

(3) 如果我是对的,PyCharm 会生成这些文件,PyCharm 如何猜测函数的签名?

【问题讨论】:

    标签: python pycharm


    【解决方案1】:

    (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 开始,引入了Argument Clinic,它允许更好地检查 C 中定义的内置函数。我不确定 PyCharm 是否已经能够获得这些信息。

    (2) 尝试重建 python 骨架。但是,AFAIK,如果这不起作用,唯一真正的选择是在PyCharm's issue tracker 上开票。

    【讨论】:

    • 哇,非常感谢您首先阅读了我很长的问题,更不用说您的精彩回答了!我真的不知道 Python Skeleton 是什么。这是 Python 概念还是 PyCharm 概念?任何指向我可以了解骨架的页面的指针?
    • @Ray 这是一个与 PyCharm 相关的术语。 “骨架”是 PyCharm 从提供其功能所需的已安装和内置库中自动生成的所有文件。这包括生成python_stubs 文件。当你启动 PyCharm 时,你经常可以在状态栏中看到一些关于为项目解释器重建这些骨架的消息。您应该能够在重新启动时强制重建使缓存无效(在File 菜单下)。
    【解决方案2】:

    PEP484 定义了这些stub files。根据 PEP,它们应该用于类型提示,并且可以由类型检查器使用。

    【讨论】:

      猜你喜欢
      • 2019-12-12
      • 1970-01-01
      • 2014-03-31
      • 1970-01-01
      • 2021-08-23
      • 1970-01-01
      • 1970-01-01
      • 2022-07-05
      • 2022-08-18
      相关资源
      最近更新 更多