#1 Le 18/03/2021, à 17:42
- DonutMan75
[RESOLU] Python : bonnes pratiques pour un module perso
Hello,
bon je suis désolé de vous solliciter à nouveau sur des questions Python, mais je sèche de nouveau sur une question de conception de code....
Je veux faire quelque chose de simple mais de très (très) propre (c'est comme ça qu'on apprend !)
J'ai créé une classe Python pour stocker des informations ainsi que deux fonctions myread() et mywrite() pour lire/écrire ces informations dans (ou depuis) un fichier.
J'imagine quelque chose comme ça :
$ ls *
programme_principal.py
mods/
__init__.py
readwrite.py
maclasse.py
programme_principal.py va lire un objet depuis un fichier A pré-existant et le réécrire tel quel dans un nouveau fichier B.
J'aurai donc quelque chose comme :
from mods.maclasse import MonObjet
from mods.readwrite import myread, mywrite
unobjet = myread("fichierA")
mywrite(unobjet, "fichierB")
Dans maclasse.py j'ai simplement la définition de l'objet (je suis OBLIGE de le mettre dans un fichier à part puisqu'il est nécessaire à la fois à programme_principal.py et aux fonctions de lecture/écriture)
class MonObjet():
pass
Et enfin dans readwrite.py j'ai les fameuses fonctions de lecture/écriture. Je suis également obligé d'importer la définition de MonObjet vu que ces fonctions les manipulent... Donc quelque chose comme :
from maclasse import MonObjet
def myread(filein):
blabla
def mywrite(objet, fileout):
blabla
Quand je fais ça, j'ai une erreur au niveau de l'import au sein de readwrite.py :
ModuleNotFoundError: No module named 'maclasse'
En bidouillant, je vois que ça semble marcher si je remplace dans readwrite.py
from maclasse import MonObjet
par
from burst.maclasse import MonObjet
Alors que maclasse.py et readwrite.py sont au même niveau au sein de l'arborescence...
Mes questions :
1- selon vous quelle serait la façon la plus propre de faire ???
2- y-a-t'il une façon standard de procéder pour gérer les "définitions générales" (ici la classe "MonObjet" qui est nécessaire à la fois au programme principal et au module readwrite) ?? Je vois par exemple qu'il est possible de mettre du code dans __init__.py mais est-ce adapté ?
Dernière modification par DonutMan75 (Le 19/03/2021, à 11:08)
Hors ligne
#2 Le 18/03/2021, à 17:51
- DonutMan75
Re : [RESOLU] Python : bonnes pratiques pour un module perso
Bon en continuant de tester, je constante également que ceci semble fonctionner (noter le "." devant maclasse) :
readwrite.py
from .maclasse import MonObjet
Mais à ce stade, est-ce que mon projet est bien écrit ou bien y'a-t'il déjà des choses à améliorer niveau conception ?
Merci d'avance
D.
Hors ligne
#3 Le 18/03/2021, à 17:52
- toitoinebzh
Re : [RESOLU] Python : bonnes pratiques pour un module perso
salut DonutMan75
je n'ai pas touché à Python depuis un moment mais j'ai rencontré ce souci, je suis preneur également d'une solution simple
de mémoire, je modifiais le pythonpath pour y ajouter le dossier qui contient le programme principale
export PYTHONPATH="${PYTHONPATH}:/my/other/path"
après ça, dans tout mes programmes et modules, j'utilisais toujours des imports du type (toujours à partir du programme racine)
from mods.maclasse import MonObjet
par contre, cela m'obligeait à tester mes modules depuis le dossier principale, ce qui n'est pas pratique
de même pour le pythonpath, cela t'oblige à relancer la commande export à chaque fois que tu lances ton programmes dans un terminal et surtout à lancer le programme uniquement depuis ce terminal (pas celui qui se lance automatiquement avec un ide de type geany ou spyder)
Hors ligne
#4 Le 18/03/2021, à 23:35
- Compte supprimé
Re : [RESOLU] Python : bonnes pratiques pour un module perso
Bonjour,
@DonutMan75:
Pour les bonnes pratiques, le mieux c'est de se référer à la documentation officielle : https://docs.python.org/fr/3/tutorial/modules.html
à première vu ton paquet semble bien construit...
à mon sens, il est préférable d'utiliser des imports explicites . C'est plus lisible et ça évite des éventuels conflits dans les espaces de nommage.
de même pour le pythonpath, cela t'oblige à relancer la commande export à chaque fois que tu lances ton programme dans un terminal et surtout à lancer le programme uniquement depuis ce terminal
Pour une modification pérenne , met ton export dans ton .bashrc
#5 Le 19/03/2021, à 11:08
- DonutMan75
Re : [RESOLU] Python : bonnes pratiques pour un module perso
Hello pseudofab et toitoinebzh,
merci pour vos retours !
Merci pour le lien, je crois que je suis en effet bien dans les clous (l'exemple donné avec le logiciel audio m'a beaucoup éclairé !)
J'ai également regardé sur github quelques projets pyhtons pour vérifier comment ils étaient structurés et ça semble correspondre à ce que je fais :
- les classes sont bien dans des fichiers séparés
- les modules s'appellent entre eux avec . (voire ..)
Bonne journée à tous et à bientôt !
D.
Hors ligne