Code Aufbau

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.
Antworten
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@sls: Die Prüfung der ISBN kann etwa so ausschauen:

Code: Alles auswählen

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.
mebus08
User
Beiträge: 6
Registriert: Montag 30. Januar 2017, 12:11

Sorry das ich mich erst jetzt wieder melde.... viel arbeit.... egal.

So ich habe die Funktionen jetzt in eine zusammengepackt.

Code: Alles auswählen

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?

Code: Alles auswählen

if not check_isbn('123456789k'):
    print('Die eingegebne ISBN ist nicht richtig')
else:
   mache weiter
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@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?
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
Antworten