Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

L' art d' éviter les imports circulaires

+3 votes

Je souhaite qu'un utilisateur renseigne une batterie de champs via tkinter.
Après avoir rempli, il valide. Ceci vient remplir un dictionnaire. ex

current_user =  {"pseudo":"billy", "age":18 }

Chaque "formulaire" vient agrandir une liste de formulaires ( une liste de dicos ici ) ex:

 liste_de_formudico = [{ "age":87,"pseudo":"gertrude"},{"pseudo":"billy", "age":18 }]

L' ID d'utilisateur correspond à son index dans listedeformudico .

Je n'utilise pas de bdd, on restera très simple. On va stocker listedeformudico dans un objet myMemoryObject qui est une instance de myMemoryClass.

On utilisera ensuite Pickle pour serializer facilement dans un fichier de sauvegarde. Jusqu'ici ça va...

Maintenant je souhaite avoir un module Statistiques.py qui servira à faire plein de traitements :

grouper et afficher par age, sexe, pseudo par odre alphabétique, pays etc etc.

Le gros du code pour ce prog portera sur les stat et mérite donc un fichier distinct,même si on aurait pu découper ça en méthodes directement dans myMemoryClass.py

Je ne sais pas comment faire les imports sans que ça plante.

pour ceux qui viennent d' arriver, vous pouvez lire ça:
http://sametmax.com/les-imports-en-python/
et ça:
http://sametmax.com/quelques-erreurs-tordues-et-leurs-solutions-en-python/

demandé 29-Jun-2015 par buffalo974 (2,632 points)

Je crois que le sujet a déjà été traité ici , à savoir comment se démerder avec les imports/dépendances circulaires

Faites vous des schémas à la UML ciblant les imports pour anticiper ce genre de pépin ?

1 Réponse

+5 votes
 
Meilleure réponse

En l'absence de plus d'info, les seules réponses sont déjà données : il faut utiliser import avec précision.

Penser à l'architecture générale (avec l'aide de l'UML par exemple) est primordial.
Ton fichier contenant les données sérialisées doit être bien proprement rangé quelque part, où le producteur et le consommateur de données pourront le trouver.

1er cas : le producteur peut communiquer avec le consommateur

  • utiliser tempfile (tuto) ou un nom de fichier standardisé.
  • transmettre le nom du fichier lors d'une communication

2nd cas : pas de communication possible

Définir un intermédiaire qui va se charger des communication ; on se rapproche du pattern Mediator.

Cet intermédiaire peut proposer des accès au formulaires :

FILE_NAME_FORMS = 'data/forms'

def save(forms, filename=FILE_NAME_FORMS):
     """Save given list of form in the forms file"""
     # pickle works here

def load(filename=FILE_NAME_FORMS):
     """Return list of form saved in the forms file"""
     return # pickle works here

Dans un bon packaging, le programme est lancé depuis la racine, où l'on trouve le répertoire du module, et pourquoi pas un répertoire data/, accessible depuis n'importe quel sous module.

Enfin, sans nécessairement donner des fonctions qui travaillent avec pickle, un simple accesseur vers le nom du fichier est suffisant dans le module médiateur.

Dans la lib standard, logging utilise ce principe pour l'accès, non pas à des fichiers, mais à des loggers.

répondu 30-Jun-2015 par lucas (2,292 points)
sélectionné 1-Jul-2015 par buffalo974
...