isinstance() fragen

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
peterwoodbridge
User
Beiträge: 50
Registriert: Freitag 30. November 2012, 10:26

Hallo Zusammen

Ich gebe in einer Funktion mehrere Variablen ein; einige sollten immer ein string sein, andere dürfen nur eine Zahl zwischen 1 und 5 annehmen.
Wie kann ich die Sicherstellung am ehesten überprüfen?

Code: Alles auswählen

def schueler_erstellen(name, vorname, alter, klasse, kategorie):
        if isinstance(name, str) and isinstance(vorname, str) and isinstance(alter, int) and isinstance(klasse, int) and isinstance(kategorie, int):
            if klasse > 0 and 0 < klasse < 6 and 0 < kategorie < 6:
               print("OK")

kann dies irgendwie abgekürzt werden, da bei name/vorname dasselbe überprüft wird? und wie sieht es bei einer Vereinfachung von klasse/kategorie aus?

Besten Dank!!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Du könntest zum beispiel Ada verwenden, dort ist es idiomatisch solche Prüfungen zu machen. Bei Python eher weniger.

(Außerdem ist deine Prüfung auf klasse > 0 redundant, weil die zweite Bedingugn genau das gleiche tut)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Typsicherheit gibt es in Python nicht. Man dokumentiert stattdessen einfach, dass ein bestimmter Typ erwartet wird und tut dann bei den einzelnen Argumenten in aller Regel so, als ob sie den erwarteten Typen hätten. Wenn dann etwas unvorhergesehenes passiert (z.B. Aufruf einer bei dem "falschen" Typen nicht vorhandenen Methode), dann kracht es eben (=Exception). Wenn einem dies eher nicht zusagt, dann sollte man IMHO die Sprache wechseln.
peterwoodbridge
User
Beiträge: 50
Registriert: Freitag 30. November 2012, 10:26

snafu hat geschrieben:Typsicherheit gibt es in Python nicht. Man dokumentiert stattdessen einfach, dass ein bestimmter Typ erwartet wird und tut dann bei den einzelnen Argumenten in aller Regel so, als ob sie den erwarteten Typen hätten. Wenn dann etwas unvorhergesehenes passiert (z.B. Aufruf einer bei dem "falschen" Typen nicht vorhandenen Methode), dann kracht es eben (=Exception). Wenn einem dies eher nicht zusagt, dann sollte man IMHO die Sprache wechseln.
ok das leuchtet ein; wann aber sollte isinstance angewendet werden?
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Übrigens war "Typsicherheit" glaube ich etwas ungenau. Vielmehr würde eine solche Frage wohl auf die Forderung nach *statischer Typisierung* hinauslaufen.

Naja, `isinstance()` verwende ich meistens, wenn eine Funktion mit mehreren Eingabetypen klarkommen soll oder ausnahmsweise in Fällen, wo ich einen Fehler seitens des Benutzers früh durch eine Exception abfangen möchte. Wenn man aber anfängt, für *jedes* Funktionsargument einen `isinstance()`-Check zu machen, dann macht man was falsch.
Zuletzt geändert von snafu am Dienstag 30. Juli 2013, 14:57, insgesamt 1-mal geändert.
peterwoodbridge
User
Beiträge: 50
Registriert: Freitag 30. November 2012, 10:26

wenn ich beispielsweise einen string im format "xxxx-xxxx-xxxx-xxxx" haben will (Kreditkarte); will ich nicht etwas eingeben, das theoretisch funktioniert (zB integer statt string oder falsche stringformat)... gibt's da eine clevere art, dies zu unterbinden?
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Dann würde ich wohl sowas hier machen:

Code: Alles auswählen

import re

def is_valid_creditcard_number(number):
    pattern = re.compile(r'\d{4}-\d{4}-\d{4}-\d{4}$')
    return bool(pattern.match(number))
Also lediglich eine Überprüfung der Wertes, ob vier mit Strichen voneinander getrennte Vierergruppen aus reinen Ziffern vorhanden sind. Für alles, was kein String ist, wirft das Ding automatischen einen TypeError. :)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Du kannst da einfach den String verifizieren, ob das eine gültige Kreditkartennummer ist und wenn dem nicht der Fall ist eine passende Exception werfen. Aber da prüft man die Daten selbst ("ist das eine gültige Kreditkartennummer?") und nicht den Datentyp ("ist das ein String mit n Buchstaben?").
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten