模块在Python中有类型吗?

时间:2016-10-22 16:39:53

标签: python python-module

我正在阅读PEP338。有些话使我感到困惑:

  

如果找到该模块,并且类型 PY_SOURCE PY_COMPILED ,那么命令行将从{{1}有效地重新解释到python <options> -m <module> <args>

模块中是否有类型的Python?

3 个答案:

答案 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。