thonix hat geschrieben:ich muss einen wert an eine Funktion weitergeben die unzureichende Typprüfungen macht und auch nur eine dürftige exception schmeißt.
Optimalerweise nutzt man in Python wie gesagt eben keine Typprüfungen.
thonix hat geschrieben:
Wenn dein Code z.B. zwei Integers addieren will, und du explizit auf Integer prüfst, kann ich nicht meinen Typ "Element von F(5003)" übergeben, auch wenn meiner sich addieren lässt.
Versteh ich leider nicht - kansst du das noch mal erläutern - bin ja wissbegierig
Okay, gehen wir davon aus dass jemand sich diese Klasse geschrieben hat, d.h einen Integer-Datentyp der sich wie ein Integer verhält aber noch andere Sachen kann:
Code: Alles auswählen
In [2]: class IntLike(int):
...: def wichtige_extra_funktion(self):
...: print 'Jetzt mache ich was ganz wichtiges'
Na dann schauen wir mal ob es sich wie ein Integer verhält:
Code: Alles auswählen
In [3]: il = IntLike(250188)
In [4]: il
Out[4]: 250188
In [5]: il + 1
Out[5]: 250189
Okay, wir sehen nun, das sich dieser Integer-Datentyp wie ein ganz normaler Integer verhält, aber auch zusätzlich irgendwas tolles kann:
Code: Alles auswählen
In [6]: il.wichtige_extra_funktion()
Jetzt mache ich was ganz wichtiges
Jetzt definieren wir mal eine simple Funktion mit Typabfrage:
Code: Alles auswählen
In [7]: def addiere_eins(zahl):
...: if type(zahl) is int:
...: return zahl + 1
...: else:
...: raise TypeError('Kein int')
Rufen wir sie mit einem normalen Integer auf, funktioniert sie:
Nun versuchen wir es mal mit unserem abgeleitetem Integer, der sich ja wie gesagt wie ein Integer verhält:
Code: Alles auswählen
In [9]: addiere_eins(il)
---------------------------------------------------------------------------
<type 'exceptions.TypeError'> Traceback (most recent call last)
/home/marek/<ipython console> in <module>()
/home/marek/<ipython console> in addiere_eins(zahl)
<type 'exceptions.TypeError'>: Kein int
Oh, geht nicht, weil die Typabfrage sagt, dass unser IntLike kein Int ist. Aber er verhält sich wie ein Integer und wird trotzdem nicht akzeptiert!
Daher schreibt man addiere_eins() in Python so:
Code: Alles auswählen
In [10]: def addiere_eins(zahl):
....: return zahl + 1
Das ist erstens kürzer und zweitens universeller:
Code: Alles auswählen
In [11]: addiere_eins(250188)
Out[11]: 250189
In [12]: addiere_eins(il)
Out[12]: 250189
Das ganze nennt sich
Duck Typing, ein Begriff der sich in der Python-Welt bisher leider nicht richtig durchgesetzt. Aber sowohl Ruby als auch Python unterstützen Duck Typing gleichermaßen. Kurz zusammengefasst: "It looks like a duck, it quacks like a duck, then it must be a duck.", auf unser Integer-Beispiel bezogen: "It looks like an integer, it acts like an integer, so it must me an integer then.".