如何判断Python模块是否是命名空间模块

时间:2017-03-22 20:53:36

标签: python python-3.x module namespaces

在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'>

2 个答案:

答案 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
)