在Python 3中,模块可以是名称空间模块,没有__init__.py
(根据PEP 420)或作为常规模块(即' [modules]包,因为它们在Python 3.2中实现早期' - PEP 420)拥有__init__.py
或单个.py
文件。
如何区分命名空间模块和普通'之间的区别?模块?
(我使用的是Python 3.5.3)
e.g。
名为mod
的命名空间模块打印为:
(Pdb) mod
<module 'mymodule' (namespace)>
和普通模块打印为:
(Pdb) mod
<module 'mymodule' from '/path/to/mymodule/__init__.py'>
答案 0 :(得分:4)
命名空间包有__path__
而没有__file__
:
if hasattr(mod, __path__) and not hasattr(mod, '__file__'):
print("It's a namespace package.")
答案 1 :(得分:0)
在Python 3.8 documentation中,__file__
是:
加载模块的位置的名称,例如“内置”用于内置模块,文件名用于从源代码加载的模块。通常应设置“来源”,但可以将其设置为“无”(默认值),表示未指定(例如,对于名称空间包)。
此外,正确答案应该是:
is_namespace = (
lambda module: hasattr(module, "__path__")
and getattr(module, "__file__", None) is None
)