Seite 1 von 1
isinstance() fragen
Verfasst: Dienstag 30. Juli 2013, 14:33
von peterwoodbridge
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!!
Re: isinstance() fragen
Verfasst: Dienstag 30. Juli 2013, 14:36
von Leonidas
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)
Re: isinstance() fragen
Verfasst: Dienstag 30. Juli 2013, 14:48
von snafu
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.
Re: isinstance() fragen
Verfasst: Dienstag 30. Juli 2013, 14:54
von peterwoodbridge
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?
Re: isinstance() fragen
Verfasst: Dienstag 30. Juli 2013, 14:57
von snafu
Ü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.
Re: isinstance() fragen
Verfasst: Dienstag 30. Juli 2013, 14:57
von peterwoodbridge
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?
Re: isinstance() fragen
Verfasst: Dienstag 30. Juli 2013, 15:13
von snafu
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.

Re: isinstance() fragen
Verfasst: Dienstag 30. Juli 2013, 15:14
von Leonidas
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?").