46 votes

Organiser mon projet Python

Je commence un projet Python et je m'attends à avoir 20 classes ou plus dans ce projet. Comme c'est une bonne pratique, je veux les placer dans un fichier séparé. Cependant, le répertoire du projet est rapidement submergé de fichiers (ou le sera lorsque je ferai cela).

Si je place un fichier à importer dans un dossier, je ne peux plus l'importer. Comment importer un fichier à partir d'un autre dossier et devrai-je faire référence à la classe qu'il contient différemment maintenant qu'il est dans un dossier ?

Merci d'avance

31voto

Triptych Points 70247

Créer un __init__.py dans votre dossier de projets, et il sera traité comme un module par Python.

Les classes de votre répertoire de paquets peuvent alors être importées en utilisant une syntaxe comme :

from package import class
import package.class

Sur __init__.py vous pouvez créer un __all__ qui définit from package import * comportement :

# name1 and name2 will be available in calling module's namespace 
# when using "from package import *" syntax
__all__ = ['name1', 'name2'] 

Et voici bien plus d'informations que vous ne voulez en savoir sur les paquets en Python

D'une manière générale, un bon moyen d'apprendre à organiser une grande quantité de code est de choisir un paquetage Python populaire et de voir comment il a été conçu. Je consulterais Django y Torsadé pour commencer.

0 votes

Dois-je mettre quelque chose dans ce fichier __init.py ?

0 votes

Je pense qu'il peut être vide. python.org/doc/2.1.3/tut/

0 votes

Hey - c'est init .py, j'essaie de contourner le formatage de SO.

22voto

S.Lott Points 207588

"Comme c'est une bonne pratique, je veux les mettre dans un dossier séparé chacun. "

Ce n'est pas une très bonne pratique. Vous devez concevoir des modules qui contiennent des classes étroitement liées.

En pratique, aucune classe n'est complètement autonome. En général, les classes sont regroupées en grappes ou en groupes qui sont logiquement liés.

3 votes

J'ai toujours pensé qu'une classe par fichier était un défaut du langage Java. Bien intentionnée, peut-être, mais quand même.

2 votes

@Ben Blank : Une classe publique par fichier est ce que vous faites quand vous avez un langage très complexe et un compilateur très lent. Si vous simplifiez votre langage, vous obtenez des compilateurs plus rapides et vous n'avez pas besoin de ce hack administratif.

12voto

Benjamin Peterson Points 5277

Python ne vous oblige pas à adopter le style de Java, qui consiste à utiliser une classe par fichier. En fait, il n'est même pas considéré comme un bon style de mettre chaque classe dans un fichier séparé à moins qu'elles ne soient énormes (si elles sont énormes, vous devrez probablement faire du refactoring de toute façon). Par exemple, si vous écrivez une calculatrice à interface graphique, la disposition de votre paquetage pourrait ressembler à ceci :

/amazingcalc
   /__init__.py # This makes it a Python package and importable.
   /evaluate.py # Contains the code to actually do calculations.
   /main.py # Starts the application
   /ui.py # Contains the code to make a pretty interface

0 votes

Ils vont probablement finir par être assez grands

2 votes

@Teifion : Large ? Si une classe est "grande" (c'est-à-dire plusieurs centaines de lignes de code), elle en fait probablement trop. La bonne pratique est de décomposer une classe aussi grande en quelque chose de plus facile à comprendre. Sans rapport avec l'utilisation de nombreux fichiers.

6voto

fuentesjr Points 10360

La réponse simple est de créer un fichier vide appelé __init__.py dans le nouveau dossier que vous avez créé. Ensuite, dans votre fichier .py de niveau supérieur, incluez quelque chose comme :

import mynewsubfolder.mynewclass

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X