簡體   English   中英

如何判斷 Python 模塊是否是命名空間模塊

[英]How to tell if Python module is a namespace module

在Python 3,模塊可以是命名空間的模塊沒有__init__.py (按PEP 420 )或作為常規模塊(即“[模塊]包,因為它們在Python 3.2被實現和更早” - PEP 420 ),其具有__init__.py或者是單個.py文件。

如何區分命名空間模塊和“普通”模塊?

(我使用的是 Python 3.5.3)

例如,名為mod命名空間模塊打印為:

(Pdb) mod
<module 'mymodule' (namespace)>

和普通模塊打印為:

(Pdb) mod
<module 'mymodule' from '/path/to/mymodule/__init__.py'>

命名空間包有一個__path__ ,並且__file__設置為None或沒有__file__屬性。 __file__Python 3.7 及更高版本上設置為None ;以前,它是未設置的。)

if hasattr(mod, __path__) and getattr(mod, '__file__', None) is None:
    print("It's a namespace package.")

相比之下,不是包的模塊沒有__path__ ,不是命名空間包的包有__file__設置為其__init__.py的位置。

Python 3.8 文檔中__file__是:

加載模塊的位置的名稱,例如內置模塊的“builtin”和從源加載的模塊的文件名。 通常應該設置“origin”,但它可能是 None (默認值),表示它是未指定的(例如,對於命名空間包)。

另外,正確答案應該是:

is_namespace = (
    lambda module: hasattr(module, "__path__")
    and getattr(module, "__file__", None) is None
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM