Mise à jour du code Python et gestion des logs
Bonjour Thibault, merci beaucoup pour la correction et les suggestions. J'ai re-travaillé cette semaine sur le projet afin d'y implémenter tes suggestions.
Dans ta fonction convert_entry, les méthodes isdigit(), isnumeric() et isdecimal() ont des comportements très similaires pour les chaînes de caractères ...
-> J'ai corrigé et utilisé isdigit() uniquement pour la detection des integers.
Pour les nombres décimaux, tu vérifies la présence d'un point . comme séparateur décimal. Comme en français on utilise souvent la virgule , pour les décimales, tu pourrais aussi remplacer les virgules par des points avant de faire la conversion.
-> Oui, bonne remarque, j'ai ajouté le remplacement de la virgule pour le point.
Aussi, si un utilisateur entre un nombre avec plusieurs points ou virgules, comme 5..5 ou 5,5,5, ton code risque de rencontrer des problèmes. Pour éviter cela, tu peux essayer de vérifier que le nombre de séparateurs décimaux est bien égal à 1 ou 0.
-> c'est déjà détecté par :
if "." in entry_value and entry_value.count(".") == 1
a moins qu'il y ai une autre façon de faire.
Pour la suite concernant le debug tu pourras regarder le logging à la place des print, ça permet de facilement faire ce que tu fais avec ta variable debug (avec le logging, tu définiras différents niveaux de log pour changer le niveau d'affichage).
J'ai ajouté la gestion des logs trés simple donner dans la vidéo 'print vs debug' Je n'ai pas encore trouvé comment faire apparaître le 'level' INFO, DEBUG, ERROR, dans les traces dans le fichier à la suite de l'horodatage. Je vais continuté de chercher dans le documentation.
Voici le nouveau code Python, et un exemple de trace du fichier de log :
# -*- coding: utf-8 -*-
import logging
# logging module documentation:
# https://docs.python.org/fr/3/howto/logging.html
logging.basicConfig(filename="appli.log",
format='%(asctime)s | %(message)s',
level=logging.ERROR)
def convert_entry(entry_value: str) -> int | float:
""" Converts the given string into an integer or float.
:param entry_value: string
:return: int or float representation of the given string
"""
# is integer ?
if entry_value.isdigit():
# ok to integer convertion
logging.debug(f"convert_entry: Ok to integer convertion: {entry_value}\n")
return int(entry_value)
# is float ?
# if existed, replace comma by point to continue
if "," in entry_value:
logging.debug(f"convert_entry: \"{entry_value}\" Replace comma by point to continue...\n")
entry_value = entry_value.replace(",", ".")
# only one decimal point detection
if "." in entry_value and entry_value.count(".") == 1:
logging.debug("convert_entry: Only one \"point\" detected, continue...\n")
# letter detection (temporary exclude point)
if entry_value.replace(".", "").isdigit():
# ok to float convertion
logging.debug("convert_entry: No letter detected.\n")
logging.debug("convert_entry: Ok to float convertion\n")
return float(entry_value)
else:
# error, not digital
logging.error(f"convert_entry: Not number detected: {entry_value}\n")
print(f"\"{entry_value}\" n'est pas un nombre !")
exit(-1)
else:
# error
logging.error(f"convert_entry: \"{entry_value}\" Multiple point or bad input detected.\n")
print(f" Erreur \"{entry_value}\" n'est pas correct.")
exit(-1)
# main app
if __name__ == '__main__':
""" Docstring calculator Project
Realize calculator in command line.
It can adding two numbers.
:author: JC GILLOT
:create date: 2024-10-03
:release v0.1
:updated date: 2024-10-08 Add Thibault suggestion.
"""
logging.debug(f"======== main start =======\n")
# get and convert first user input
first_number = input("Veuillez entrer un premier nombre : ")
first_number = convert_entry(first_number)
# get and convert second user input
second_number = input("Veuillez entrer un deuxième nombre : ")
second_number = convert_entry(second_number)
# processing
result = first_number + second_number
# result providing
logging.debug(f"Type de {first_number}: {type(first_number)}\n")
logging.debug(f"Type de {second_number}: {type(second_number)}\n")
logging.debug(f"Type de {result}: {type(result)}\n")
logging.info(f"Le résultat de l'addition du nombre {first_number} avec le nombre {second_number} est égal à {result}")
print(f"Le résultat de l'addition du nombre {first_number} avec le nombre {second_number} est égal à {result}")
fichier de log :
level=logging.INFO
2024-10-08 22:25:39,315 | Le résultat de l'addition du nombre 5 avec le nombre 10.5 est égal à 15.5
2024-10-08 22:26:19,659 | convert_entry: "10..5" Multiple point or bad input detected.
2024-10-08 22:26:52,579 | convert_entry: "1a" Multiple point or bad input detected.
level=logging.DEBUG
2024-10-08 22:31:49,004 | ======== main start =======
2024-10-08 22:35:47,518 | convert_entry: Ok to integer convertion: 5
2024-10-08 22:36:09,061 | convert_entry: "10,5" Replace comma by point to continue...
2024-10-08 22:36:09,061 | convert_entry: Only one "point" detected, continue...
2024-10-08 22:36:09,061 | convert_entry: No letter detected.
2024-10-08 22:36:09,061 | convert_entry: Ok to float convertion
2024-10-08 22:36:09,061 | Type de 5: <class 'int'>
2024-10-08 22:36:09,061 | Type de 10.5: <class 'float'>
2024-10-08 22:36:09,061 | Type de 15.5: <class 'float'>
2024-10-08 22:36:09,061 | Le résultat de l'addition du nombre 5 avec le nombre 10.5 est égal à 15.5
2024-10-08 22:37:13,710 | ======== main start =======
2024-10-08 22:37:19,606 | convert_entry: Ok to integer convertion: 5
2024-10-08 22:37:29,469 | convert_entry: "1,,5" Replace comma by point to continue...
2024-10-08 22:37:29,469 | convert_entry: "1..5" Multiple point or bad input detected.
2024-10-08 22:39:03,978 | ======== main start =======
2024-10-08 22:39:15,648 | convert_entry: Ok to integer convertion: 5
2024-10-08 22:39:33,375 | convert_entry: Only one "point" detected, continue...
2024-10-08 22:39:33,375 | convert_entry: Not number detected: 1.o
2024-10-08 22:39:53,422 | ======== main start =======
2024-10-08 22:40:05,067 | convert_entry: "1a" Multiple point or bad input detected.
level=logging.ERROR
2024-10-08 22:42:01,383 | convert_entry: "1b" Multiple point or bad input detected.
2024-10-08 22:42:23,845 | convert_entry: "1..5" Multiple point or bad input detected.
Bonjour JC,
Bravo pour ce nouveau script, ton code est toujours super bien documenté et clair 👍
Concernant le niveau de logging, il faut utiliser levename :
logging.basicConfig(
level=logging.DEBUG, # Niveau minimal de logging
format='%(asctime)s | %(levelname)s | %(message)s' # 👈
)
Pour tes messages de log aussi, pour éviter d'utiliser des antislash avant chaque guillemet, tu peux utiliser les guillemets simples et doubles, par exemple :
# Tu peux faire ça :
f"'{entry_value}' n'est pas un nombre !"
# Au lieu de ça :
f"\"{entry_value}\" n'est pas un nombre !"
En règle générale, je préfère utiliser des guillemets doubles pour mes f-string, ça permet de n'avoir aucun soucis avec les mots comme n'est et également si tu souhaites entourer un mot avec des guillemets simples.
Pour les points multiples potentiels, effectivement c'est bien géré avec le count il était passé sous mon radar ^^
Encore bravo et bonne continuation !
Thibault.
Inscris-toi
(c'est gratuit !)
Tu dois créer un compte pour participer aux discussions.
Créer un compte