![](/img/trans.png)
[英]How to tell if a python module is intended to be python 2 or python 3?
[英]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.