Open Karduin opened 5 years ago
Bonjour Karduin,
Effectivement pour l'affichage je peux utiliser ta méthode et voir ce qu'elle donne (je n'ai encore jamais utilisé center() ), ces quelques lignes de code seront déjà plus claires !
L'intersection entre mon set de caractères spéciaux et ma liste 'cleaned2' transformée en set me paraît être également une bonne idée, il faut que je teste ça... mais je dois faire une réinstallation Windows 7 sur mon PC demain, avec pas mal de logiciels à réinstaller (les mises à jour Windows ne passent plus depuis au moins 9 mois, le pc redémarre en boucle après chaque tentative et aucune autre solution trouvée sur internet)
Merci à toi, je vais donc dans un premier temps modifier le code avec center() et tester l'intersection :-)
@yaizac Bonjour 1ere remarque , personnellement j'aime bien tester un code avec un jeu d'exemple pour voir les sorties et les resultats attendus , mais en l'occurrence avec les paths qui vous sont propres cela parait difficile. Pour ce domaine, peut etre mettre ces noms de paths dans des variables explicites plutot que les mettre en dur , surtout s'ils venaient à changer ou etre utilisés à plusieurs endroits
Pour continuer sur les tests de pattern , il me semble que vous pourriez utiliser des expressions regulières.
sur les dates où il y a pas mal de lignes de codes : suggestions :
sum_days = int(tot_duration / (3600 * 24))
sum_hours = int(tot_duration / 3600 - sum_days* 24)
sum_mins = int(tot_duration / 60 - sum_hours * 60 - \
sum_days * 24 * 60)
sum_secs = int(tot_duration - sum_mins * 60 - \
sum_hours * 3600 - sum_days * 3600 * 24)
car le passage au float puis l'utilisation frequente du int ensuite ne me semblent pas utiles , autant utiliser le int dès le debut
pour l'affichage suivant pour faire plus compact : msg = "Les analyses doivent se terminer dans: " if sum_days: msg+= f"{sum_days} jour(s) " if sum_hours: msg+= f"{sum_hours} heure(s) " msg+= f"{sum_mins} minutes {sum_secs} secondes.\n" print(msg)
enfin il me semble que les calculs sur les ajouts de dates ont un petit pb (sauf si je n'ai pas compris) : sum_secs2 = second + sum_secs supmin = sum_secs2//60 sum_secs2 -= supmin *60
sum_mins2 = minute + sum_mins + supmin
suphour = sum_mins2//60
sum_mins2 -= suphour *60
sum_hours2 = hour + sum_hours + suphour
supday = sum_hours2//24
sum_hours2 -= supday *24
sum_days2 = day + sum_days + supday
car lorsque vous ajoutez la minute qd la somme des secondes depasse 60, vous ne retirez pas ensuite les 60 secondes mises dans la variable minute , idem pour les autres calculs
enfin sur le long paragraphe où vous traitez les dates , il me semble que des modules time ou date doivent savoir faire le meme travail de facon beaucoup plus compacte sans passer par le decodage des nombre de jours des mois , si pb pour les trouver , je rechercherai aussi comment vous aider Du coup je pense aussi que votre fonction conditions devrait aussi etre très largement simplifiable
@yaizac
La première chose qui frappe, c'est qu'on voit tout de suite que c'est du Fortran traduit: il y n'y a aucune instruction return
! ça fait tout drôle... C'est typique du coup de voir une fonction comme input_file_xjob
qui fait carrément un exit()
.
C'est principalement aussi pour ça que vous avez besoin de globales; de manière générale c'est une pratique peu recommandée; a fortiori pour un script de taille et de complexité modeste comme celui-ci. Il aurait été plus élégant de passer des objets en paramètres, et retourner des résultats qu'on repasse aux fonctions suivantes
Je suis par ailleurs d'accord avec jipibi au sujet des chemins en dur, et de l'utilisation de librairies pour le traitement des dates et heures, ce serait étonnant qu'on ait besoin de tellement de code dans cette zone-là du système
Enfin par rapport à votre questionnement au sujet des classes, évidemment on pourrait y penser, mais ça ne serait pas à mon sens un apport très décisif.
Une fois qu'on a dit tout ça, j'ai envie de vous dire que si le script fait ce qu'on attend de lui, le mieux c'est peut-être encore d'y toucher le moins possible...
@JiPiBi
Merci pour vos remarques et suggestions, je vais tâcher de modifier ce qui concerne les paths et les sommes de jours/heures/minutes/secondes. Les variables ne sont peut-être pas suffisamment explicites ou leurs noms sont possiblement mal choisis car je n'ai pas remarqué d'erreurs dans les calculs sur les temps (ou alors je ne me suis pas suffisamment penché sur la question).
Je verrai ça à tête reposée la semaine prochaine... et concernant les modules datetime et time vous avez raison, j'avais créé des longues conditions imbriquées mais je suis convaincu que ces modules peuvent m'aider à simplifier les 2 dernières fonctions. Je vais essayer de modifier le code par moi-même, ça sera un bon exercice.
@parmentelat
Effectivement j'ai oublié de préciser que je n'avais mis aucune instruction "return" dans mes fonctions, je n'en voyais pas l'intérêt surtout que ça fonctionnait très bien, mais pour des raisons de clarté je vais suivre votre conseil car si j'ai bien compris ça me permettra d'éviter d'englober toutes mes fonctions les unes dans les autres.
J'avoue aussi que ce n'est pas très beau d'avoir une instruction "exit()" dans la fonction "input_file_xjob", mais je ne savais pas comment faire autrement pour quitter le programme en tapant simplement sur la touche 'Entrée' (mais peut-être n'en ai-je pas besoin finalement).
Et concernant les classes idem je m'en occuperai sans doute dans mon prochain programme mais je ne vais pas m'y attarder dans celui-ci. Je modifie ce programme pour tester ce que j'apprends en Python, je me fais la main dessus, car le prochain risque d'être bien + corsé...
Merci à tous les 2, ces modifications vont m'occuper pendant un petit moment déjà ! Je reviendrai sans doute vers vous plus tard :-)
Me revoilà ! :-)
J'ai modifié mon programme d'après tous vos conseils, j'ai retiré les chemins des fonctions pour les mettre dans des variables (à la suite des imports). J'ai retiré 2 fonctions (dont la dernière) et raccourci l'avant-dernière. Tout se trouve dans le fichier 'verif_temps3_for_mooc_v2.py' (uploadé à l'instant). J'ai surtout utilisé la méthode 'timedelta' du module 'datetime' (sur une ligne à la fin de la dernière fonction) pour supprimer des dizaines de lignes...
J'ai supprimé la méthode 'exit()' dans la fonction "input_file_xjob" et j'ai rajouté un try/except dans la première "last_modification_file" au cas où le nom du fichier ait été modifié.
Il ne reste plus qu'une variable globale dans la fonction "input_file_xjob" qui lance un chrono juste après avoir validé la saisie du fichier 'xjob', mais je supprimerai ce bout de code pour finalement ne pas afficher cette durée d'exécution à la fin du programme. En effet ce n'est pas l'information que l'on attend en lançant ce programme, on souhaite seulement savoir si tout est correct dans le fichier 'xjob' et à quelle date/heure vont se terminer les analyses.
Concernant les 'return' dans les fonctions, étant donné qu'elles sont presque toutes englobantes, je ne vois pas comment les utiliser. Si je mets un 'return' dans une fonction, la suivante ne sera pas lancée, ou alors il faudra que je la lance à la fin mais j'aurai alors besoin des variables globales (car certaines sont modifiées dans les fonctions suivantes). Autre solution: je n'appelle pas de fonction, mais j'ai créé ces fonctions pour rassembler des morceaux de code, pour qu'il soit plus facile à lire...
Si vous voyez d'autres aberrations/problèmes dans mon code, ou si vous avez des commentaires je suis preneur... Merci d'avance :-)
Début du programme:
Fin du programme:
Effectivement les calculs de date sont bien réduits comme on pouvait s y attendre. Bravo!
Pour ce qui concerne les fonctions qui se suivent : si tout traitement chaîne toutes les fonctions et qu' on n'est pas amené à répéter de code , personnellement je ne vois pas l intérêt de créer toutes ces fonctions , pourquoi ne pas tout mettre à la suite. Les commentaires suffisent à séparer le code.
Il me semble que vous pourriez aussi, comme je l'avais dit précédemment, améliorer la partie où vous testez les noms des fichiers en utilisant des expressions regulieres.
Envoyé depuis mon smartphone Samsung Galaxy.
@JiPiBi Merci ! Mais précisément de quelle partie du code parlez-vous? car je teste des noms de fichiers un peu partout...
Je vais voir ce que donne le programme sans aucune fonction (ou presque). Je séparerai avec les commentaires, comme je l'ai fait avec les fonctions.
def verif_numerotation
Envoyé depuis mon smartphone Samsung Galaxy.
@JiPiBi Ok merci :-) Je vais essayer de modifier ça aujourd'hui si j'ai un moment, et ensuite je testerai le programme sans aucune fonction. Je reviendrai ici si je rencontre un problème ou si je pense avoir terminé.
Si d'autres personnes veulent ajouter des commentaires, je prends toujours, ça me permet d'évoluer dans le bon sens :-) @ bientôt
Me revoici :-) J'ai supprimé toutes les fonctions et implémenté des expressions régulières (je n'en avais jamais utilisé jusqu'à présent, c'est effectivement bien pratique). Petit extrait:
J'ai uploadé le nouveau programme qui s'appelle maintenant "verif_temps3_for_pc_yoann_0function", je n'ai pas remis le contexte ni le contenu de README_V2 qui contient les changements effectués. J'ai laissé les commentaires qui étaient à la base pour les fonctions. Mon code est maintenant divisé en 10 blocs de code (qui correspondaient aux fonctions).
Comme je l'ai dit dans README_V2, j'ai ajouté une boucle "while True" qui me permet de répéter le code entre les blocs n°2 et n°10, c'est-à-dire juste avant la saisie du nom de fichier 'xjob'. Ceci est important car si le nom de fichier saisi (sans extension) n'existe pas, on peut revenir à la saisie... sinon le programme se termine.
Merci beaucoup à ceux qui m'ont aidé pour en arriver jusque là :-) Et si vous voyez des améliorations à apporter, si vous avez des remarques/commentaires à formuler n'hésitez pas... Tous vos commentaires m'ont bien aidés jusqu'ici ! Je vais pouvoir commencer un nouveau programme + complexe en début d'année prochaine !
@yaizac
Très Bien !
Si l intérêt de regex vous a convaincu c est parfait. Néanmoins en ce qui me concerne j'ai toujours les mêmes difficultés à mémoriser le jargon qui n'est pas des plus évidents et nécessite une feuille d aide en permanence et des tests systématiques .
Pour terminer par des remarques de détail, en relisant une dernière fois en diagonale : je vois que dans les blocs 6 et 8 il subsiste des chemins en dur qui pourraient être remplacés par des variables littérales.
Envoyé depuis mon smartphone Samsung Galaxy.
Merci ^^ Je pense que vous parlez de ces quelques lignes:
Je ne les ai pas modifiées car ce qui ressemble à un chemin en dur n'est en fait qu'un bout de texte dans un fichier XML. Définition de la variable 'cleaned2' (pour rappel) :
C'est peut-être un peu + facile pour moi qui n'ai jamais appris de langage informatique, car je ne risque pas de me mélanger les pinceaux ! Bien sûr je dois parfois regarder un ancien code pour me rappeler la manière de procéder, mais c'est comme tout, il est difficile de s'y remettre quand on a arrêté de coder pendant un long moment...
Ok ce n est pas un chemin utilisé comme tel, mais ce sont qd même 2 strings dont l une est meme le début de l autre. ( c'est aussi cela qui m'avait alerté ) Elles ont sûrement une signification et leur donner un nom signifiant donnerait aussi dans le futur, à vous ou à qqun, qui reprend votre programme une information intéressante pour en comprendre la logique.(On zappe parfois plus vite qu' on ne le pense) Et si par la suite votre valeur changeait ou mieux devait être complétée par d autres valeurs dans une liste, vous serez amené à evoluer. Mais comme je l'ai dit ce n'est que du détail. C est juste pour vous sensibiliser à ces 2 types de problèmes : la mémoire et l évolution des données, voire de leur type.
Envoyé depuis mon smartphone Samsung Galaxy.
Ok c'est modifié :-) J'ai défini ces variables juste avant le bloc n°1 et ensuite remplacé dans les blocs n°6 et 8:
Par contre je ne peux pas mettre de "r" devant les 2 premières chaines pour n'avoir qu'un "\" car elles se terminent toutes les 2 par "\". Je suis obligé de doubler ce caractère à la fin et si je le fais en mettant le "r" devant, mon programme ne marche pas (il m'affiche alors "Nombre d'analyses programmées: 0").
Pas sûr d avoir compris si vous avez ou pas un pb , surtout sans avoir de jeu de données. Mais si vous avez des chaînes qui sont du type : D:\ abc\ Il me semble que str_var = r"D:\abc"+"\" marche Et si c'est D: \abc\ str_var = r"D:\abc"+"\\"
Envoyé depuis mon smartphone Samsung Galaxy.
D'ailleurs pour D: \abc\ str_var = r"D:\abc\" marche aussi
Envoyé depuis mon smartphone Samsung Galaxy.
-------- Message d'origine -------- De : jpbozo jpbozo@hotmail.fr Date : 19/12/2018 13:07 (GMT+01:00) À : flotpython/recreation reply@reply.github.com, flotpython/recreation recreation@noreply.github.com Cc : Mention mention@noreply.github.com Objet : Re: [flotpython/recreation] verif_temp3 (#13)
Pas sûr d avoir compris si vous avez ou pas un pb , surtout sans avoir de jeu de données. Mais si vous avez des chaînes qui sont du type : D:\ abc\ Il me semble que str_var = r"D:\abc"+"\" marche Et si c'est D: \abc\ str_var = r"D:\abc"+"\\"
Envoyé depuis mon smartphone Samsung Galaxy.
En fait en laissant le code tel qu'il est affiché ci-dessus, le programme fonctionne. Je voulais éviter de doubler les caractères "\" mais je ne crois pas avoir le choix en ce qui concerne les 2 premières variables.
Petite vérification, en modifiant le code comme suit cela fonctionne en effet, je l'avais testé puis abandonné car ça me paraissait moins lisible, mais finalement peut-être pas:
Merci pour votre réactivité et tous vos conseils :-)
@yaizac Bonjour, tout d'abord, je ne suis pas un spécialiste, donc il est possible que je dise des âneries. ;-)
D'un point de vue cosmétique, plutôt que de t’embêter à compter les caractères avant ou après,
print(f"\n\n{19*'='} vérifie le nom du fichier xjob saisi {19*'='}\n")
tu peux utiliser la méthode center.
print(' vérifie le nom du fichier xjob saisi '.center(78, '='))
Tu utilise un set pour les caractères interdits, est ce que cela serait intéressant d'utiliser
intersection
pour ton test ?result = caracteres_speciaux.intersection(set(cleaned2))
si vide ok sinon len(result)Bon encore une fois je ne suis pas un spécialiste donc pas sur que ce soit de bonnes idées.