Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 18/03/2021, à 18: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, à 12:08)

Hors ligne

#2 Le 18/03/2021, à 18: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 smile

D.

Hors ligne

#3 Le 18/03/2021, à 18: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 19/03/2021, à 00: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.

toitoinebzh a écrit :

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, à 12: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