我正在阅读PEP338。有些话使我感到困惑:
如果找到该模块,并且类型 PY_SOURCE 或 PY_COMPILED ,那么命令行将从{{1}有效地重新解释到
python <options> -m <module> <args>
。
模块中是否有类型的Python?
答案 0 :(得分:5)
可以从不同来源加载模块。作者参考了加载模块的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的类型系统。
答案 1 :(得分:1)
模块的类型表示存储模块的类型的文件,因为python文件有一些可能的类型(和扩展名。
最常见的是编译的python文件( pyc 扩展名)或常规的python普通源( py )。
还有许多其他 py 文件扩展名,请参阅此处的(几乎)完整列表:https://stackoverflow.com/a/18032741/6575931。
答案 2 :(得分:1)
从链接PEP338
引用提议的语义 提出的语义非常简单:如果-m是 用于执行PEP 302 导入机制的模块 在执行之前找到模块并检索其编译的代码 模块符合顶级模块的语义。
现在让我们参考imp(导入机制)的文档并确定可以导入的不同类型的模块 imp.get_suffixes()
imp.get_suffixes()返回3元素元组的列表,每个元素描述 特定类型的模块。每个三元组都有形式(后缀,模式, type),其中suffix是要附加到模块名称的字符串 形成要搜索的文件名,mode是要传递给的模式字符串 内置的open()函数来打开文件(这可以是&#39; r&#39; for 文本文件或&#39; rb&#39;对于二进制文件), type是文件类型, 其中一个值为PY_SOURCE,PY_COMPILED或C_EXTENSION, 如下所述。
随后它解释了不同类型的内容
imp.PY_SOURCE 该模块被发现为源文件。
imp.PY_COMPILED 该模块被发现为已编译的代码对象文件。
imp.C_EXTENSION 该模块被发现为动态可加载共享 库。
因此,PEP 338中提到的类型只是可以导入的模块类型,而这些只有PY_SOURCE或PY_COMPILED是上述三种中仅有的两种类型,命令行有效地从python -m重新解释为python。