【问题标题】:Do modules have types in Python?Python 中的模块有类型吗?
【发布时间】:2017-03-04 19:42:32
【问题描述】:

我正在阅读PEP338。有些词让我很困惑:

如果模块被发现,并且是 type PY_SOURCEPY_COMPILED ,那么命令行被有效地从 python <options> -m <module> <args> 重新解释为python <options> <filename> <args>

Python 中的模块有类型吗?

【问题讨论】:

标签: python python-module


【解决方案1】:

模块可以从不同的来源加载。作者引用了模块加载的 2 个特定来源,请参阅 imp module documentation

imp.PY_SOURCE
该模块是作为源文件找到的。

[...]

imp.PY_COMPILED
该模块被发现为已编译的代码目标文件。

[...]

imp.C_EXTENSION
该模块被发现为可动态加载的共享库。

这些值用于imp.get_suffixes() function 等的返回值。

PEP 声明只支持从源(.py 文件)和字节码缓存文件(.pyc)加载的模块; -m 开关不支持 C 扩展模块(通常是 .so.dll 动态加载的库)。

生成的模块对象仍然只是一个模块对象;您找到的文本中的单词 type 并不是指 Python 的类型系统。

【讨论】:

    【解决方案2】:

    引用链接PEP338

    建议的语义 提出的语义相当简单:如果 -m 是 用于执行 PEP 302 导入机制 的模块 在执行之前找到模块并检索其编译代码 模块符合顶级模块的语义。

    现在让我们参考imp(导入机制)的文档,确定可以导入的不同类型的模块 imp.get_suffixes()

    imp.get_suffixes() 返回 3 元素元组的列表,每个元组描述 特定类型的模块。每个三元组都有形式(后缀、模式、 type),其中 suffix 是要附加到模块名称的字符串 形成要搜索的文件名,mode 是要传递给的模式字符串 用于打开文件的内置 open() 函数(这可以是 'r' 文本文件或二进制文件的'rb'),type是文件类型, 它具有值 PY_SOURCE、PY_COMPILED 或 C_EXTENSION 之一, 如下所述。

    随后它解释了不同的类型是什么

    imp.PY_SOURCE 模块作为源文件被发现。

    imp.PY_COMPILED 模块被发现为已编译的代码目标文件。

    imp.C_EXTENSION 模块被发现为动态可加载共享 图书馆。

    因此,PEP 338 中提到的类型只不过是可以导入的模块类型,其中只有 PY_SOURCE 或 PY_COMPILED 是上述三种类型中仅有的两种类型,命令行有效地从 python -m 重新解释为蟒蛇。

    【讨论】:

    • 感谢您的帮助,您的回答也很棒。
    【解决方案3】:

    模块类型表示存储模块的文件类型,因为python文件有一些可能的类型(和扩展名。

    最常见的是已编译的 Python 文件(pyc 扩展名)或常规的 Python 纯源代码(py)。

    还有许多其他 py 文件扩展名,请在此处查看(几乎)完整列表:https://stackoverflow.com/a/18032741/6575931

    【讨论】:

      猜你喜欢
      • 2018-07-01
      • 2019-07-06
      • 2017-11-22
      • 2019-02-27
      • 2017-06-13
      • 1970-01-01
      • 2022-01-13
      相关资源
      最近更新 更多