我正在创建一个处理Python模块的库。没有详细介绍,我需要一个常见的Python模块扩展列表。
显然,我想要.py
,但我也希望包含.pyw
,.pyd
等内容。换句话说,我想要任何可以导入的内容。
标准库中是否有工具可以为我制作此列表?或者我必须自己制作(并硬编码所有值)?
extensions = ['.py', '.pyw', ...]
答案 0 :(得分:7)
此功能可在importlib.machinery
module中找到。在内部,有许多常量与各种Python模块扩展相关:
>>> import importlib
>>> importlib.machinery.SOURCE_SUFFIXES
['.py', '.pyw']
>>> importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES
['.pyo']
>>> importlib.machinery.EXTENSION_SUFFIXES
['.pyd']
>>> importlib.machinery.DEBUG_BYTECODE_SUFFIXES
['.pyc']
>>>
所以,你可以很容易地将它们加入一个全局集 1 :
>>> set(importlib.machinery.SOURCE_SUFFIXES +
... importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES +
... importlib.machinery.EXTENSION_SUFFIXES +
... importlib.machinery.DEBUG_BYTECODE_SUFFIXES)
{'.pyw', '.py', '.pyd', '.pyc', '.pyo'}
>>>
您可能也对all_suffixes
function:
>>> importlib.machinery.all_suffixes()
['.py', '.pyw', '.pyc', '.pyd']
>>>
但请注意,如果使用-O
or -OO
options启动Python,则此函数会将.pyc
替换为.pyo
。为避免这种情况,您可以这样做:
>>> set(importlib.machinery.all_suffixes() +
... importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES +
... importlib.machinery.DEBUG_BYTECODE_SUFFIXES)
{'.pyw', '.py', '.pyd', '.pyc', '.pyo'}
>>>
这将确保.pyc
和.pyo
都在集合中。
最后,你应该警惕importlib.machinery.BYTECODE_SUFFIXES
。正如@MartijnPieters在评论中指出的那样,它总是等于OPTIMIZED_BYTECODE_SUFFIXES
或DEBUG_BYTECODE_SUFFIXES
。这意味着,如果将其添加到集合中,您将获得重复的.pyc
或重复的.pyo
值(除非您使用一套课程)。
来自docs:
importlib.machinery.BYTECODE_SUFFIXES
表示字节码模块的已识别文件后缀的字符串列表。设置为
DEBUG_BYTECODE_SUFFIXES
或OPTIMIZED_BYTECODE_SUFFIXES
基于__debug__
是否为真。
我没有打扰使用此常量,因为我想在集合中同时使用OPTIMIZED_BYTECODE_SUFFIXES
和DEBUG_BYTECODE_SUFFIXES
。所以,没有理由添加它。
1 我决定使用一个集合,因为它们的查找时间比列表快。意思是,它们更适合全球价值观的收集,这些价值观不会改变,也不需要特定的订单。此外,他们还会确保我们不会意外地将重复的扩展名添加到集合中。