Fichier d'input

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour,

J'écris un programme en python (mais je ne pense pas que ce soit important ici) qui pour l'instant lit un fichier texte en input.

Ma première question est à propos de la manière de lire efficacement ce fichier. Il est écrit sous la forme suivante.

"mot_clé" données (plusieurs entiers ou chaines de caractères) "mot_clé" données (plusieurs entiers ou chaines de caractères) "mot_clé" données (plusieurs entiers ou chaines de caractères) …

Dans mon code, je lis les lignes une à une et j'utilise autant de "if" que j'ai de mot clés différents. Ça rend la fonction très longue et difficile à lire. J'avais pensé à créer un dictionnaire de fonctions, ce qui simplifierait la fonction principale. Avant que je ne réécrive les 3/4 du code, pensez-vous qu'il y aurait une meilleure solution pour lire ce fichier ?

Ma deuxième question concerne une interface graphique. J'aimerais en créer une, et vu que je ne l'ai jamais fait, je voudrais avoir vos avis. Est-ce que je devrais utiliser les informations venant de la GUI directement, ou pour écrire un fichier d'input tel que j'utilise actuellement ? Le premier cas est plus direct, mais le 2ème me permettrait de pouvoir choisir comment utiliser le code sans devoir en maintenir deux versions en parallèle. Mais comme je l'ai dit, je n'ai jamais fait ça, donc je ne connais pas vraiment les difficultés qui peuvent survenir.

Merci !

Staff

Cette réponse a aidé l'auteur du sujet

Dans mon code, je lis les lignes une à une et j'utilise autant de "if" que j'ai de mot clés différents. Ça rend la fonction très longue et difficile à lire. J'avais pensé à créer un dictionnaire de fonctions, ce qui simplifierait la fonction principale. Avant que je ne réécrive les 3/4 du code, pensez-vous qu'il y aurait une meilleure solution pour lire ce fichier ?

Le dictionnaire de fonction est effectivement une solution un peu plus propre. Si tu es motivé, tu pourrais créer un décorateur qui appliqué à une fonction la déclare faite pour traiter le mot clé associé à son nom. D'ailleurs si le reste de la ligne est proprement séparée, elles peuvent alors utiliser une signature propre qui décrit chaque paramètre.

Pour le deuxième problème, si ton code est bien fait, la lecture de l'input et leur traitement sont séparés. Du coup dans la GUI tu devrait réutiliser la partie "traitement" des actions. En gros tu aurais deux sources de commandes possibles, depuis un fichier et depuis la GUI, et les deux devraient utiliser les mêmes fonctions pour effectuer le traitement réel.

Au pire du pire, il vaut mieux que tu repasse par un fichier d'input (ou par un objet "type fichier" construit en mémoire depuis une string). Avoir deux versions du même code c'est la porte assurée à de gros problèmes de maintenances. Mais la solution propre reste que le traitement soit généré dans un "module" (objet, jeux de fonctions, etc.) dédié et que chaque interface utilisateur (fichier ou GUI) appellent ce traitement.

+0 -0
Auteur du sujet

Merci pour la réponse. Je dois avouer ne pas savoir ce qu'est un décorateur, je me renseignerai.

Tu as mis le doigt sur la difficulté : "si ton code est bien fait". Je n'ai jamais vraiment appris à programmer, donc ce que je fais fonctionne, et c'est à peu près tout, c'est pour ça que je viens demander des conseils pour le rendre plus efficace/plaisant esthétiquement.

Pour l'instant, tout est mélangé dans la fonction principale. Je lis le mot clé, selon ce mot, je lis un certain nombre de paramètres, et je fais directement ce que je dois faire. Je suppose qu'utiliser un dictionnaire de fonction (et peut-être avec les décorateurs quand je saurai ce que c'est et comment ça marche) correspond à ce que tu appelles "un traitement séparé", vu que ces fonctions pourraient être appelées depuis la partie du code qui lit l'input en fichier texte ou celle qui lit l'input venant de la GUI. C'est bien ce que tu voulais dire ?

Staff

Cette réponse a aidé l'auteur du sujet

Les décorateurs c'est les parties qui ce placent devant les fonctions (ou class) de la forme @monDecorator. Mais si tu ne maitrise pas le concept, laisse tomber cette partie.

Pour le reste, oui, sépare en deux ton code. Tu devrais avoir d'un code le code qui se charge de lire le fichier et extraire les mots clés et paramètres, et de l'autre un "module" qui se charge d'executer les actions. La partie qui lit les fichiers doit lire toute la ligne et ne faire qu'appeler une fonction dans le module d'execution en lui passant les paramètres. Elle ne se charge ainsi que de la lecture.

Le Gui pourra alors, lui aussi, appeler les fonctions d'execution directement.

+0 -0
Staff

Il vaut mieux le faire maintenant que plus tard.

Si tu fais ta GUI en générant un fichier, tu va faire des étapes intermédiaires inutiles.

Si tu recopie le code, tu peux être surs qu'a un moment donné tu va modifier le comportement d'une fonction et oublier de modifier celui de l'autre. Et du coup tu aura des bugs présent d'un coté et pas de l'autre.


Je ne sais pas ce que représente tes actions mais il y a aussi une autre solution : passer par une structure interméidaire.

En gros tu crée des objets python qui representent ta suite d'instruction. Ainsi ton parseur de fichier va devoir créer cette structure depuis le fichier texte. La gui est censé elle aussi la construire depuis son interface. Enfin ton traitement lui ne fait qu'utiliser cette structure intermédiare pour executer le traitement.

Mais pour t'aider et conseiller plus il nous faudrait un exemple de fichier ou une explication plus détaillé de ce que tu souhaite faire.

+0 -0
Auteur du sujet

Pour un exemple (et même le code source), j'avais présenté mon petit programme ici (je ne veux pas être accusé de faire de la pub dans la mauvaise section, je supprimerai le lien si nécessaire). Par contre, j'ai déjà commencé à factoriser certaines parties du code (dictionnaires de couleurs et de tailles et quelques autres bricoles) sans mettre à jour le github.

Je pense que je vais juste mettre le dictionnaire de fonction dans un autre fichier pour l'instant, et lire un cours sur des concepts un peu plus avancés, pour voir ce que je pourrais faire à terme.

Staff

(je ne veux pas être accusé de faire de la pub dans la mauvaise section, je supprimerai le lien si nécessaire).

Non ne t'inquiète pas ! La pub ce serait si tu faisais un nouveau sujet toutes les 5 minutes où si tu postais dans un sujet sans de rapport direct pour te faire la pub.

Pour des problèmes de code, surtout si il y a des informations importantes quand à l'objectif du programme, il ne faut pas que tu hésite. Met le sans soucis. Avoir le contexte est important pour aider.

Et justement, là c'est intéressant. Je pige rien à la cristallographie mais si je pige bien tu part d'une cellule de base, puis tu la modifie en rajoutant une série de defaut et à la fin du génère une image de résulat ?

Si oui, je pense que tu aurais tout interet à travailler autour d'une class pour représenter ta cellule. Cela s'y adapte assez bien. A tu appris des notions de programmation objets ?

+0 -0
Auteur du sujet

Oui, c'est exactement le principe.

Je connais (un peu) les objets. Je m'en sers actuellement pour représenter les atomes, les liens entre atomes et les chaînes de caractères. J'ai plus de mal à voir comment je peux représenter ma cellule complète dans un objet par contre. Pour l'instant, j'ai trois listes (une par objets) qui sont mergées à la fin, juste avant de dessiner.

Staff

Cette réponse a aidé l'auteur du sujet

Bah comment tu le structure en interne n'a pas d'importance. Tu peux créer une classe "cellule" qui prend dans le constructeur le type de base puis une methode par defaut à rajouter et enfin une methode pour générer le dessin. Tu peux tres bien, à l'interieur de la class, continuer à la modéliser via tes 3 listes.

Ainsi, pour l'interface depuis les fichier, à chaque ligne il appellerai la méthode dédié et le gui pourrait faire la même chose. Dans les deux cas tu ne ferais que créer un objet qui représente ta cellule et utiliser les methodes pour la modifier.

+0 -0
Auteur du sujet

Je pense que je vois ce que tu veux dire. Mais dans ce cas, je garde tous mes "if" pour lire le fichier d'input et appeler les méthodes nécessaires, non? Et le code qui est pour l'instant dans ma fonction principale pour dire ce qu'il faut faire se retrouve dans la définition de l'objet, si j'ai tout suivi correctement.

J'essaierai de trouver quelques heures pour commencer ça pendant mes congés, pour voir ce que ça donne. Merci en tout cas !

Édité par Rockaround

Staff

Non ça n'a rien à voir avec les if. La façon dont tu parses le fichier sera de toute façon indépendante du reste du code, que tu utilises des fonctions dans un dictionnaire ou un if.

Édité par nohar

I was a llama before it was cool

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte