2016-10-22 67 views
3

我读PEP338。有些话让我感到困惑:模块在Python中有类型吗?

如果模块被找到,并且是PY_SOURCE的PY_COMPILED,然后在命令行中被有效地从python <options> -m <module> <args>python <options> <filename> <args>重新诠释。

模块在Python中有类型吗?

+1

有*类型的模块*,因为它们来源于字节编译的缓存文件或来自源。单词*类型*与对象的类不同。 –

+1

查看关于python文件扩展名http://stackoverflow.com/a/18032741/6575931 – Uriel

回答

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动态加载的库)。

生成的模块对象仍然只是一个模块对象;在您发现的文本中,类型的文字并不是指Python的类型系统。

1

型模块的指类型,其中所述模块被存储在文件的,因为蟒文件具有一些可能的类型(和扩展。

最常见的被编译Python文件(PYC扩展名)或常规,蟒蛇纯源(PY

还有许多其他PY文件扩展名,请参见(几乎)完整列表在这里:https://stackoverflow.com/a/18032741/6575931

+0

感谢您的帮助,我将阅读相关链接 –

1

从提出的链接PEP338

拟议语义 语义引用是相当简单:如果-m是用于执行模块用于 的PEP 302 导入机制定位 模块并检索其编译代码,然后根据顶级模块的语义执行 模块。

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

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

,随后它解释了不同类型

imp.PY_SOURCE模块被发现的一个源文件。

imp.PY_COMPILED该模块被发现是一个编译的代码对象文件。

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

所以,在PEP 338中提到的类型是什么,但可以导入这些仅PY_SOURCE的或PY_COMPILED是仅有的两个类型的出上述三个的命令行被有效地从蟒重新解释类型的模块-m到python。

+0

感谢您的不错的帮助,而且您的答案也很棒。 –