How python source code in large projects are organized?
Christopher Arndt
chris.arndt at web.de
Sat Sep 26 12:30:09 EDT 2009
On 20 Sep., 22:10, exar... at twistedmatrix.com wrote:
> On 07:10 pm, pengyu... at gmail.com wrote:
>
> >On Sun, Sep 20, 2009 at 11:31 AM, Daniel Fetchinson
> ><fetchin... at googlemail.com> wrote:
> >>>I am wondering what is the best way of organizing python source code
> >>>in a large projects. There are package code, testing code. I'm
> >>>wondering if there has been any summary on previous practices.
>
> >>I suggest looking at the source code of large projects like twisted,
> >>PIL, django, turbogears, etc. These have different styles, pick the
> >>one you like best.
Start by having a standard for structuring the single Python files. I
like to have mine organized like this:
- (shebang)
- encoding declaration
- module docstring
- __all__ symbol export list
- imports
- standard library
- third-party
- project specific
- author, version, date and copyright information
- globals (logging setup, constants, etc.)
- utility functions
- classes
- "main" function (some like to have this at the top)
- if __name__ == '__main__': clause
For sub-packages, like to have the following layout:
mainpackage/
subpackage2/
test/test_subpackage2.py
__init__.py
base.py
exceptions.py
module1.py
module1.py
subpackage2/
...
__init__.py
mainpackage.py
If a package is not too big, the test may also go into a "test" sub-
directory of the main package.
I have an __all__ symbol export list in all module file, so then in in
__init__.py I can do:
from base import *
from exception import *
from module1 import this, that
from module2 import foo, bar
without worrying about import too much and in my main package I can
use:
from package import this, bar
And in e.g. package.module1 I can do
from package.exceptions import SomeError
without having to worry about circular imports.
If my package has any code to be called directly from the command
line, I create a script in the root of the distribution or in a "bin"
subdirectory:
mydistro/
bin/
script1
mainpackage/
...
and in that script:
#!/usr/bin/env python
from mainpackage import run
# or
# from mainpackage.command.mycommand import run
run()
you can also add a command line script entry point to your setup
script to let this script be automatically created on installation by
setuptools/easy_install. Look at the TurboGears 1.1 branch for
examples.
HTH, Chris
More information about the Python-list
mailing list