简体   繁体   中英

Python3: Why does __spec__ work?

Where does the variable __spec__ come from?

$ 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

From the Python Language Reference, Part 5: The Import System (emphasis mine):

The __spec__ attribute must be set to the module spec that was used when importing the module. This is used primarily for introspection and during reloading. Setting __spec__ appropriately applies equally to modules initialized during interpreter startup . The one exception is __main__ , where __spec__ is set to None in some cases .

New in version 3.4.

According to Python 3 docs , __spec__ is always None if you are using interactive promt:

When Python is started with the -m option, __spec__ is set to the module spec of the corresponding module or package. __spec__ is also populated when the __main__ module is loaded as part of executing a directory, zipfile or other sys.path entry.

In the remaining cases __main__.__spec__ is set to None , as the code used to populate the __main__ does not correspond directly with an importable module:

  • interactive prompt
  • -c switch
  • running from stdin
  • running directly from a source or bytecode file

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM