Ergänzend zu dem was Sirius3 geschrieben hat:
Für jemanden der selbst die Standardbibliothek meiden möchte ist es ein ziemlicher Schritt das externe `regex`-Modul zu importieren. Zumal davon nichts verwendet wird das nicht auch das `re`-Modul der Standardbibliothek kann.
Der Code im ``if __name__ == …``-Guard sollte in einer Funktion stehen. Sonst werden immer noch modulglobale Variablen definiert.
Methoden ruft man auf dem Objekt auf, nicht auf der Klasse mit dem Objekt als erstem Argument, also ``start.strftime(…)`` und nicht ``datetime.strftime(start, …).
Der Test mit dem regulären Ausdruck ist noch in einem anderen Aspekt unzureichend: `match()` lässt auch noch beliebige Zeichen *nach* dem regulären Ausdruck zu, sofern man das nicht im regulären Ausdruck selbst ausschliesst. Ansonsten müsste man `fullmatch()` verwenden.
Man wiederholt möchlichst keinen Code und keine Daten. Das ist fehleranfällig. Statt vor einer ``while`` Schleife etwas zu machen was man dann in der Schleife noch mal macht, würde man das nur *in* der Schleife machen und die Bedingung nicht im ``while`` sondern am Ende der Schleife prüfen.
Bei der Eingabe von `end_date_time` hat man genau einmal am Anfang die möglichkeit "None" einzugeben, danach *muss* man eine Zeitangabe machen. Blöd wenn man sich bei "None" vertippt und das danach nicht mehr wiederholen kann.
Der Code für die drei Eingaben ist auch nahezu gleich und unterscheidet sich fast nur durch Namen und ein bisschen in den Texten. Das heisst das wäre eher *eine* Funktion für die Eingabe eines Zeitpunktes die dreimal aufgerufen wird.
Es ist ein bisschen verwirrend Namen wie `start_date_time` an Zeichenketten zu binden und `start` an `datetime`-Objekte.
Ungetestet:
Code: Alles auswählen
#!/usr/bin/env python3
from datetime import datetime
DATETIME_FORMAT = "%d/%m/%Y %H:%M:%S"
def input_timestamp(prompt, none_input=None):
while True:
text = input(prompt)
if text == none_input:
return None
try:
return datetime.strptime(text, DATETIME_FORMAT)
except ValueError:
pass
def evaluate(start, end, gesucht):
if gesucht < start:
return (
f"Die Suche {gesucht:{DATETIME_FORMAT}} fand vor der Startzeit"
f" {start:{DATETIME_FORMAT}} statt."
)
elif start <= gesucht and end is None:
return (
f"Die Suche am {gesucht:{DATETIME_FORMAT}} fand nach der Startzeit"
f" am {start:{DATETIME_FORMAT}} statt. Schlußzeit wurde nicht"
f" angegeben."
)
elif start <= gesucht < end:
return (
f"Die Suche am {gesucht:{DATETIME_FORMAT}} fand nach der Startzeit"
f" am {start:{DATETIME_FORMAT}} und vor der Schlußzeit am"
f" {end:{DATETIME_FORMAT}} statt."
)
else:
return "Alles Scheiße, nixs klappt mehr!"
def main():
prompt_template = (
"Bitte ein Datum und Zeit für die {} im Format dd/mm/yyyy HH:MM:SS"
" eingeben ... "
)
start = input_timestamp(prompt_template.format("Startzeit"))
end = input_timestamp(prompt_template.format("Schlußzeit"), "None")
gesucht = input_timestamp(prompt_template.format("Suchzeit"))
print(evaluate(start, end, gesucht))
if __name__ == "__main__":
main()