web-dev-qa-db-fra.com

Organisation des classes Python en modules et / ou packages

J'aime la convention Java d'avoir une classe publique par fichier, même s'il y a parfois de bonnes raisons de mettre plus d'une classe publique dans un seul fichier. Dans mon cas, j'ai d'autres implémentations de la même interface. Mais si je les plaçais dans des fichiers séparés, j'aurais des noms redondants dans les instructions d'importation (ou des noms de module trompeurs):

import someConverter.SomeConverter

tandis que someConverter serait le nom du fichier (et du module) et SomeConverter le nom de la classe. Cela me semble assez inélégant. Mettre toutes les classes alternatives dans un seul fichier conduirait à une instruction d'importation plus significative:

import converters.SomeConverter

Mais je crains que les fichiers deviennent assez volumineux, si je mets toutes les classes liées dans un seul fichier de module. Quelle est la meilleure pratique Python ici? Une classe par fichier est-elle inhabituelle?

56
deamon

Il s'agit en grande partie de préférences personnelles. En utilisant les modules python, vous avez la possibilité de conserver chaque classe dans un fichier séparé tout en autorisant import converters.SomeConverter (ou from converters import SomeConverter)

La structure de votre fichier pourrait ressembler à ceci:

* converters
     - __init__.py
     - baseconverter.py
     - someconverter.py
     - otherconverter.py

puis dans votre __init__.py fichier:

from baseconverter import BaseConverter
from otherconverter import OtherConverter
58
Zach

La solution de Zach se casse sur Python 3. Voici une solution fixe.

Il s'agit en grande partie de préférences personnelles. En utilisant les modules python, vous avez la possibilité de conserver chaque classe dans un fichier séparé tout en autorisant import converters.SomeConverter (ou from converters import SomeConverter)

La structure de votre fichier pourrait ressembler à ceci:

* converters
     - __init__.py
     - baseconverter.py
     - someconverter.py
     - otherconverter.py

puis dans votre __init__.py fichier:

from converters.baseconverter import BaseConverter
from converters.otherconverter import OtherConverter
41
Spundun