Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to tell if Python module is a namespace module

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'>
like image 540
Nathanael Farley Avatar asked Mar 22 '17 20:03

Nathanael Farley


2 Answers

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.

like image 195
user2357112 supports Monica Avatar answered Nov 11 '22 02:11

user2357112 supports Monica


From the Python 3.8 documentation, __file__ is:

Name of the place from which the module is loaded, e.g. “builtin” for built-in modules and the filename for modules loaded from source. Normally “origin” should be set, but it may be None (the default) which indicates it is unspecified (e.g. for namespace packages).

Also, the correct answer should be:

is_namespace = (
    lambda module: hasattr(module, "__path__")
    and getattr(module, "__file__", None) is None
)
like image 42
fsenart Avatar answered Nov 11 '22 03:11

fsenart