petit algo, pour avis - Python - Programmation
Marsh Posté le 10-10-2018 à 21:30:52
xilebo a écrit : - mauvaise gestion des exceptions. Bien que ca existe en C++, je ne les ai jamais vraiment utilisées (on peut s'en passer ) sauf que c'est un peu obligatoire en python. Je ne sais pas quoi mettre dans try, except, else, et finally ( voir fonction r_parse_hex et r_parse_xml ) |
Rien du tout, sauf si tu veux spécifiquement gérer les erreurs correspondantes. Ici au lieu du try/finally tu voudras utiliser un "context manager"(similaire mais pas identique au RAII de C++) géré via with, et à la limite un gros try/except autour du tout si tu veux planquer les erreurs sans spécialement les gérer mais aussi sans arrêter complètement le processing.
Le "else" est également assez peu utilisé, ici on mettrait plus tout dans le body, on bien on utiliserait un early return:
Code :
|
Prendre un objet qu'on modifie en place et renvoie c'est aussi un peu étrange, il y a des contextes où ça se fait (builders) mais ici ça semble pas trop être le cas.
xilebo a écrit : - j'ai un peu bidouillé pour formatter ma string venant du fichier xml correctement en hex : j'ai paddé avec des 0 pour être sur d'avoir 4 caractères ( e['chk_xml'] = chk.attrib['hexa'].rjust(4,'0') ) |
Bah si t'as besoin de 4 char et que ton entrée peut en avoir moins, faut padder. Tu pourrais le faire avec un format à la place mais tu gagnerais rien.
xilebo a écrit :
|
Alternativement tu peux parser ton truc avec struct.unpack (genre <H) et le formatter comme nécessaire derrière. Ou bien pas le formatter et parser la sortie de ton fichier XML avec int(val, 16).
xilebo a écrit :
mais j'aurais préféré un truc du genre :
|
S'pas trop possible à cause de la manière dont t'as structuré ton processing: ton r_insert va pas nécessairement générer de nouveaux éléments, et va potentiellement aller altérer des trucs en place à la place.
Si tu veux faire un truc du style, je suggère d'itérer juste sur les bases et pour chaque base aller chercher les données dans le fichier hex et le fichier xml en parallèle, ça évite des bricolages genre aller faire des recherches linéaires dans une liste. Apprends aussi à utiliser les fonctions de formattage Python (%, format ou f-strings).
Pas testé, mais un truc genre:
Code :
|
Si tu veux absolument un itérateur ou une listcomp c'est moyen pratique à cause des manipulations de path avant de parser les fichiers. Ça serait faisable avec un helper ou bien la technique de la liste unaire (for foo in [val] c'est comme faire foo = 1 au milieu de la listcomp) mais je recommande pas spécialement.
D'ailleurs en regardant ce code, je me dis que la gestion d'erreur devrait aller autour des appels à parse_xml et parse_hex, si l'un des deux foire l'autre est pas utile:
Code :
|
Les fonctions de parsing s'occupent que de leur "happy path", et c'est le driver qui gère les erreurs de parsing.
Marsh Posté le 12-10-2018 à 14:04:40
Merci beaucoup pour ces précisions, je comprends mieux et je vois que je ne suis pas complètement dans le faux.
J'ai appliqué quelques correctifs suite aux conseils. L'objet retourné, c'est juste quand j'ai prototypé mes fonctions , elles étaient vides, j'ai tendance à retourner un truc plutot que de mettre pass, mais effectivement ici c'est pas super utile.
Marsh Posté le 09-10-2018 à 14:37:14
Bonjour,
je me permets de vous soumettre un petit code python que j'ai écrit, afin de parser un répertoire de façon récursive, de récupérer seulement les fichiers dont l'extension est xml et hex ( la racine est la même) et d'extraire dans l'un le checksum en texte, et l'autre en binaire à une adresse donnée. Le but est de ressortir les fichiers qui ont des checksums différents.
Voici le résultat :
le code est bien entendu critiquable, je ne suis pas familier du python même si j'ai déjà écrit quelques programmes, j'essaie juste d'écrire à la "python" plutot qu'à la "C++" étant issu du C++.
Voici les choses que j'estime critiquables :
- mauvaise gestion des exceptions. Bien que ca existe en C++, je ne les ai jamais vraiment utilisées (on peut s'en passer ) sauf que c'est un peu obligatoire en python. Je ne sais pas quoi mettre dans try, except, else, et finally ( voir fonction r_parse_hex et r_parse_xml )
- j'ai un peu bidouillé pour formatter ma string venant du fichier xml correctement en hex : j'ai paddé avec des 0 pour être sur d'avoir 4 caractères ( e['chk_xml'] = chk.attrib['hexa'].rjust(4,'0') )
- j'ai encore plus bidouiller pour formater la string venant du fichier hex :
* je lis 1024 octets ( c'est normalement sur mais j'ai pas géré si inférieur )
* mon checksum est à l'octet 0x212 + 0x213 mais à l'envers ( little endian ) , je l'inverse en rajoutant puis transforme en string avec hex(), puis je passe en majuscule avec upper()
- mon parcours de fichier est comme ca :
mais j'aurais préféré un truc du genre :
sauf que je ne sais pas comment rajouter dans la ligne du code permettant de filtrer d'une part les hex/xml, et appeler une fonction d'autre part à chaque itération pour effectuer le traitement.
Bref, n'hésitez pas à faire vos commentaires si vous en avez envie, l'objectif pour moi est de m'améliorer et surtout d'écrire du code respectant la philosophie python