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 :
```python
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 :**
```python
# -*- 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 :**
```python
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:
2024-10-08 22:36:09,061 | Type de 10.5:
2024-10-08 22:36:09,061 | Type de 15.5:
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.
```