Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
def is_valid_isbn(isbn):
isbn = get_clear_isbn(isbn):
isbn_length = len(isbn)
if isbn_length == 10:
return check_isbn_10(isbn)
if isbn_length == 13:
return check_isbn_13(isbn)
return False
so dass auf den Aufruf von 'get_clear_isbn' innerhalb der check_isbn-Funktionen verzichtet werden kann. Es braucht also nichts doppelt geprüft werden. Je nach Programmentwurf kann es auch sinnvoll sein 'get_clear_isbn' außerhalb von 'is_valid_isbn' aufzurufen, falls diese irgendwo weiter verwendet werden soll.
def check_isbn(isbn):
'''
Validate ISBN-10 and ISBN-13 Numbers
Return True or False
'''
isbn = str(isbn)
isbn = isbn.lower().replace('-', '').replace(' ', '')
if len(isbn) == 10:
if not isbn[0:9].isdigit() or isbn[9] not in '0123456789x':
return False
else:
last_char = 10 if isbn[9] == 'x' else int(isbn[9])
result = sum(int(number) * result for result,
number in enumerate(isbn[0:9][::-1], 2))
return (last_char + result) % 11 == 0
if len(isbn) == 13:
if not isbn.isdigit():
return False
else:
result_1 = sum(int(number) for number in isbn[0::2])
result_2 = sum(int(number) for number in isbn[1::2]) * 3
return (result_1 + result_2) % 10 == 0
return False
# raise ValueError('No correct ISBN')
aber eine frage habe ich nochmals wegen der Fehlerbehandlung.
Ist es denn nicht einfacher auf true oder false zu reagieren wenn man die funktion aufruft?
Mir fehlt bei deiner Frage die Alternative. Einfacher als was? Meinst du exceptions? Wenn ja: kommt drauf an. Wenn du eine sehr lokale Fehlerbehandlung durchführen kannst, kann man auch nur den rückgaberwert prüfen. Wenn du aber ggf. irgendwo tief in einer Verarbeitung steckst, die dann abgebrochen werden muss, dann ist eine Exception die bessere Wahl.
Beides kann ja aber leicht ineinander überführt werden.
@mebus08: es kommt darauf an, was Du aussagen willst. Der Name der Funktion check_isbn läßt vermuten, dass ein Wahrheitswert zurückgeliefert wird, es kann aber auch sein, dass offensichtlich falsche Eingaben auf einen Programmierfehler hinweisen und deshalb eine Exception geworfen wird. Das ist z.B. dann der Fall, wenn der Parameter vom falschen Typ ist, kann aber auch sein, wenn der String nicht die richtige Länge oder nicht die richtigen Zeichen enthält. Soll also geprüft werden, ob eine ISBN-Nummer die richtige Checksumme hat? Oder ob ein beliebiger String eine korrekte ISBN-Nummer ist?
Es gibt halt Mischformen. So könnte es bei der Übergabe einer Zeichenkette immer einen Wahrheitswert als Rückgabe geben, egal wie unsinnig die Eingabe möglicherweise war. Wenn aber ein komplett falscher Typ übergeben wird, dann könnte man immer noch eine Exception werfen (lassen). Solche Exceptions sollten dann IMHO auch zum Programmabbruch führen oder zumindest zu einem Fehler auf der oberen Ebene, sofern noch eine reelle Chance besteht, das Problem zu lösen. Meistens deutet das auf einen Programmierfehler hin. Wenn der mehr oder weniger "verschluckt" wird, dann besteht eine große Gefahr von Folgefehlern, deren Ursache nur noch schwer nachzuvollziehen ist.