How to structure python packages without repeating top level name for import

The first level “bagoftricks” is fine. That’s just the name of your “project” so to speak. In the you have a setup.py, and other files that tell the packaging systems what they need to know.

You can then have the code directly in this module, or in a src directory. You can even go as far as just having this structure:

bagoftricks
├── bagoftricks.py
├── README.md
└── setup.py

But I would not recommend that, mostly because you might want to reorganize things later, and it’s easier if you already have a “proper” package. Also most people, tools and docs assume you have a package, so it’s easier.

So the minimum would be:

bagoftricks
├── bagoftricks
│   └── __init__.py
├── README.md
└── setup.py

With __init__.py containing the functions you want to import. You then use these functions like this:

from bagoftricks import levenshtein, anotherfunction

Once that __init__.py becomes too big, you want to split it up in several modules, giving you something like this:

bagoftricks
├── bagoftricks
│   ├── __init__.py
│   ├── anothermodule.py
│   └── levenshtein.py
├── README.md
└── setup.py

Your __init__.py should then import the functions from the various modules:

from bagoftricks.levenshtein import levenshtein
from bagoftricks.anothermodule import anotherfunction

And then you can still use them like like you did before.

Leave a Comment

Hata!: SQLSTATE[HY000] [1045] Access denied for user 'divattrend_liink'@'localhost' (using password: YES)