Skip to content Skip to sidebar Skip to footer

How To Use __init__.py In (sub-)modules To Define Namespaces?

my question is about writing Python (3.x) packages and (sub-)modules and the correct usage of __init__.py files to declare namespaces. I used to code in C++, so I like to use a lo

Solution 1:

Is this a good python-like way to define namespaces? Or is there a better / common way to organize the file-system of a package in python. (I did not find a proper tutorial/example for this.)

This is an okay way to setup a Python package. Only okay and not 'good' because of the contents of foo.py and bar.py.

I don't like to use package.foo.foo() / package.subpackage.bar.bar() and would like to use package.foo() / package.subpackage.bar().

In this case, you can't. And not mixing the name spaces is good reason to not do from package.subpackage.bar import bar.

It would have been better if def foo(): ... and def bar(): ... were directly in __init__.py. That way, you could have done package.foo() and package.subpackage.bar(). It could also have been done by using __all__ in init but import * is also not considered good.

Or, the foo and bar packages should have had more in it like foo.function1, foo.other_func, bar.drink, etc. which gives it more human-friendly understandable organisation.

Examples and references are not within scope for good StackOverflow questions but here are some, for a well thought-out question:

Solution 2:

The answer to the second question:

In file package/subpackage/__init__.py, why does it have to be:

from package.subpackage.bar import bar

and not:

from subpackage.bar import bar?

is that you have to use from .bar import bar. The dot is used when you want to do relative imports inside a package structure. See: https://docs.python.org/3/tutorial/modules.html#intra-package-references

Post a Comment for "How To Use __init__.py In (sub-)modules To Define Namespaces?"