Issue
In Python 3, modules can be namespace modules without an __init__.py
(as per PEP 420) or as a regular module (i.e. '[modules] packages as they are implemented in Python 3.2 and earlier' - PEP 420) that have an __init__.py
or are a single .py
file.
How can you tell the difference between a namespace module and an 'ordinary' module?
(I am using Python 3.5.3)
e.g.
Namespace module named mod
prints out as:
(Pdb) mod
<module 'mymodule' (namespace)>
and ordinary modules print out as:
(Pdb) mod
<module 'mymodule' from '/path/to/mymodule/__init__.py'>
Solution
Namespace packages have a __path__
, and either __file__
set to None
or no __file__
attribute. (__file__
is set to None
on Python 3.7 and later; previously, it was unset.)
if hasattr(mod, '__path__') and getattr(mod, '__file__', None) is None:
print("It's a namespace package.")
In contrast, modules that aren't packages don't have a __path__
, and packages that aren't namespace packages have __file__
set to the location of their __init__.py
.
Answered By - user2357112 Answer Checked By - Timothy Miller (PHPFixing Admin)
0 Comments:
Post a Comment
Note: Only a member of this blog may post a comment.