Your __getattr__
returns None
for all attributes, including __path__
, and if a module has a __path__
attribute, it's treated as a package.
For a package, from test import x, y
needs to handle possible submodules named test.x
and test.y
. The code that does this handling uses hasattr
first, to test whether test
already has x
and y
attributes:
elif not hasattr(module, x):
...
and that hasattr
is responsible for the first __getattr__('x')
and __getattr__('y')
calls.
The second __getattr__('x')
and __getattr__('y')
calls are just the ones you'd expect to happen, to retrieve test.x
and test.y
for the import.
Your __getattr__
shouldn't return a value for special attributes like __path__
.
Also, unrelated, naming a module test
is a bad idea, because the standard library already claimed that name for Python's own test suite.