Challenges Gestione degli errori e testing -

Raggi cosmici

✪✪✪ Requisiti: credere nella sfortuna

In questi tempi di distanziamento sociale ci viene offerto di lavorare da remoto. Per organizzare il lavoro, ci viene comunicato un calendario con una serie di date per i meeting, espresso come lista di stringhe, nel formato gg/mm/aaaa. Per importare la lista nel nostro calendario preferito, vogliamo costruire un programma che analizzi le stringhe per estrarre come tupla di interi. Quindi per esempio la stringa "29/05/2020" deve essere riconosciuta e trasformata nella tupla (29,5,2020)

Purtroppo, il calendario ci viene trasmesso dall’altro capo del pianeta, proprio durante una tempesta solare. I raggi cosmici interferiscono senza pietà nella comunicazione, cambiando caratteri a caso.

Sapendo che la comunicazione potrebbe non essere completamente affidabile, decidiamo di scrivere un programma resistente agli errori, in modo che riesca a riconoscere quantomeno le date ben formattate e con numeri dei giorni, mesi e anni ragionevoli.

  • Per giorni e mesi sappiamo che i limiti sono 31 e 12

  • per gli anni supponiamo che è impossibile vi siano eventi fissati prima del 2020 e dopo il 2023.

  • Quando trovi un errore: solleva un’Exception che descrive il problema

  • USA un blocco try except per catturare le eccezioni sollevate (anche e soprattutte quelle non previste !)

Esempi di output atteso (ce ne sono tantissimi che se ne possono fare, qua trovate solo una selezione):

Parsing 08/11/2023
   Riconosciuto! (8, 11, 2023)    <-- notate che vogliamo la conversione a interi !
Parsing 02/1012028
   ERRORE: Formato non valido!
Parsing 02/(0/2021
   ERRORE: invalid literal for int() with base 10: '(0'
Parsing 50/04(2920
   ERRORE: Formato non valido!
Parsing 30/04/1803
   ERRORE: Anno non valido!
Parsing 05/72/2021
   ERRORE: Mese non valido!
Parsing 49/02/2022
   ERRORE: Giorno non valido!
[6]:
import random
import string

# FUNZIONE GIA' COMPLETA, NON TOCCARE !
def raggi_cosmici(flusso_dati):
    for x in range(random.randint(1,min(3,len(flusso_dati)))):
        i = random.randint(0,len(flusso_dati)-1)
        #print('i',i)
        lista = list(flusso_dati[i])
        for c in range(random.randint(1,3)):
            #print('lista',lista)
            lista[random.randint(0,len(lista)-1)] = random.choice('0123456789$/()')
            #print('flusso_dati[i]=',flusso_dati[i])
            #print('modifico',flusso_dati[i])
            flusso_dati[i] = ''.join(lista)

# IMPORTANTE: dopo un primo round di testing, SCOMMENTA queste istruzioni random.seed
#             per cambiare gli errori casuali introdotti  e verificare
#             che il tuo programma gestisca anche quelle
# NOTA: Il numero del parametro non influisce sul numero o tipo di errori,
# determina solo  quale sequenza di errori viene generata.
# Se non imposti il seed otterrai errori completamente casuali diversi
# ad ogni esecuzione del programma!

random.seed(7)
#random.seed(6)   # scommenta
#random.seed(9)   # scommenta


calendario = [
    '07/11/2020',
    '30/04/2020',
    '02/10/2022',
    '08/11/2023',
    '25/01/2021',
    '29/05/2023',
]

raggi_cosmici(calendario)  # modifica calendario con errori casuali !


# scrivi qui


Parsing 97/81/2020
    ERRORE: Giorno non valido: 97
Parsing $0/04/2010
    ERRORE: invalid literal for int() with base 10: '$0'
Parsing 02/10/2022
    Riconosciuto! (2, 10, 2022)
Parsing 08/11/2023
    Riconosciuto! (8, 11, 2023)
Parsing 25/01/2021
    Riconosciuto! (25, 1, 2021)
Parsing 29/05/2023
    Riconosciuto! (29, 5, 2023)