Ich habe die Punkte überarbeitet und denke bzw. hoffe, dass es jetzt passt.
Der try... except Block für die Eingabe wurde angepasst und der Wertebereich wird jetzt über einen AssertionError abgefangen. Ich hoffe ich habe sie im Sinne des Erfinders angewendet.
Code: Alles auswählen
def main():
while True:
try:
month = int(input('Eingabe Monat: '))
assert 0 < month < 13
break
except ValueError:
print('ValueError: Falsche Eingabe, es sind nur ganze Zahlen erlaubt')
except AssertionError:
print('AssertionError: Falsche Eingabe, erlaubt ist 1 - 12')
# Jahrszahl ist nur für den Februar nötig
if month == 2:
while True:
try:
year = int(input('Eingabe Jahr: '))
assert year > 0
break
except ValueError:
print('Falsche Eingabe, es sind nur ganze Zahlen erlaubt')
except AssertionError:
print('Falsche Eingabe, es sind nur positive Zahlen erlaubt')
output(month, get_days(month, year), year)
else:
output(month, get_days(month))
Die Funktion get_days() akzeptiert nun bei allen Monaten Jahreszahlen und sollte dadurch robuster in der Anwendung sein. Zusätzlich erhält man bei einem fehlerhaften Aufruf keine -1 mehr als Rückgabewert, sondern es wird eine Exception geworfen. Auch wurde die Bedingung für das Schaltjahr vereinfacht.
Code: Alles auswählen
def get_days(month, year = None):
'''Gibt die Anzahl der Tage von month zurück. year wird nur beim Monat Februar benötigt'''
# Länge der Monate in einem dictionary speichern
month_days = dict.fromkeys([1, 3, 5, 7, 8, 10, 12], 31)
month_days.update(dict.fromkeys([4, 6, 9, 11], 30))
month_days.update({2: {'is_leapyear': 29, 'no_leapyear': 28}})
if month == 2:
try:
if (year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)): #Schaltjahr
leapyear = 'is_leapyear'
else:
leapyear = 'no_leapyear'
return month_days[month][leapyear]
except TypeError:
print('Error in get_days(), fehlende Jahreszahl bei Februar => Jahr wird auf "kein Schaltjahr" gesetzt')
return month_days[month]['no_leapyear']
else:
return month_days[month]
An der Ausgabe habe ich nichts geändert.