Python3:为什么__spec__有效?

pzr*_*zrq 8 python python-3.x

变量__spec__来自哪里?

$ brew install python3
$ python3
Python 3.4.2 (default, Jan  5 2015, 11:57:21) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.56)] on darwin
Type "help", "copyright", "credits" or "license" for more information.

# Under Python 2.7.x this gives a NameError
>>> None is __spec__
True
Run Code Online (Sandbox Code Playgroud)

agf*_*agf 7

Python语言参考,第5部分:导入系统(强调我的):

__spec__必须将该属性设置为导入模块时使用的模块规范.这主要用于内省和重新加载.__spec__适当的设置同样适用于在解释器启动期间初始化的模块.唯一的例外是__main__,__spec__在某些情况下,where 设置为None.

版本3.4中的新功能.

  • @deponovo听起来你正在寻找 [importlib.machinery.ModuleSpec 文档](https://docs.python.org/3/library/importlib.html#importlib.machinery.ModuleSpec) (2认同)

awe*_*oon 6

根据 Python 3文档,如果您使用交互式提示,__spec__则始终为:None

当Python使用-m选项启动时,__spec__设置为相应模块或包的模块规范。当模块作为执行目录、zip 文件或其他 sys.path 条目的一部分加载__spec__时,也会填充。__main__

在其余情况下__main__.__spec__ 设置为 None,因为用于填充的代码__main__不直接与可导入模块对应:

  • 互动提示
  • -c 开关
  • 从标准输入运行
  • 直接从源文件或字节码文件运行