Seite 1 von 1

Variablentypen für Funktionsargumente definieren?

Verfasst: Freitag 29. Juni 2007, 20:36
von Karl
Hi.
Ich weiß wohl, dass es bei Python eine dynamische typisierung gibt und sich der Typ sozusagen immer an den Inhalt anpasst.
Aber es wäre doch praktisch, wenn man bei Funktionsdefinitionen die Typen angeben könnte ..
Also zB

Code: Alles auswählen

def blablubb(int foo, string bar):
Geht das vielleicht irgendwie? Oder muss man das dann umständlich über exceptions o.Ä regeln?

Verfasst: Freitag 29. Juni 2007, 22:08
von tiax
Warum brauchst du das denn?

Reichts eventuell wenn sich das übergebene Objekt verhält wie ein Integer?

Verfasst: Samstag 30. Juni 2007, 07:51
von BlackJack
@Karl: Nur um Missverständnisse zu vermeiden: Python ist dynamisch und stark typisiert. Der Typ ist nicht beim Namen gespeichert, sondern beim Objekt. Namen kann man also an verschiedenste Typen binden -> dynamisch typisiert. Der Typ eines Objekts ist aber fest, der ändert sich nicht auf magische Weise -> stark typisiert.

Falls Du jetzt mit "umständlich mit Exceptions […] regeln" meinst, ob Du überprüfen musst, ob `foo` ein `int` und `bar` ein `str` ist um dann Ausnahmen auszulösen: Nein das passiert automatisch wenn Du versuchst mit `foo` oder `bar` etwas anzustellen, was die daran gebundenen Objekte nicht unterstützen.

Verfasst: Samstag 30. Juni 2007, 15:03
von Sr4l
In Python 3000 wird das gehen das man bestimmte Typen 'festsetzt'.

In der jetzigen Version fällt mir nur folgendes so auf die schnelle ein:

x = "string"
x.isdigit()
x.isalpha()
x.isalnum()

und man kann noch überprüfen ob ein variable ein string, int ...... ist das heißt aber nicht das in einem string in Wirklichkeit ein Zahl steht.

Verfasst: Samstag 30. Juni 2007, 15:40
von Karl
BlackJack hat geschrieben:@Karl: Nur um Missverständnisse zu vermeiden: Python ist dynamisch und stark typisiert. Der Typ ist nicht beim Namen gespeichert, sondern beim Objekt. Namen kann man also an verschiedenste Typen binden -> dynamisch typisiert. Der Typ eines Objekts ist aber fest, der ändert sich nicht auf magische Weise -> stark typisiert.
Missverständnis erfolgreich vermieden ;)

BlackJack hat geschrieben:Falls Du jetzt mit "umständlich mit Exceptions […] regeln" meinst, ob Du überprüfen musst, ob `foo` ein `int` und `bar` ein `str` ist um dann Ausnahmen auszulösen: Nein das passiert automatisch wenn Du versuchst mit `foo` oder `bar` etwas anzustellen, was die daran gebundenen Objekte nicht unterstützen.
Ok, eigentlich hast du recht. Sogesehn macht es ja keinen Unterschied, ob die Argumente einen festgesetzten Typ haben oder nicht. Irgendwie kam mir das aber merkwürdig vor ... Ok, anscheinend ist das Problem damit gelöst :P
Sr4l hat geschrieben: und man kann noch überprüfen ob ein variable ein string, int ...... ist das heißt aber nicht das in einem string in Wirklichkeit ein Zahl steht.
Ok, das ist mir klar ;)

Verfasst: Samstag 30. Juni 2007, 16:01
von birkenfeld
Sr4l hat geschrieben:In Python 3000 wird das gehen das man bestimmte Typen 'festsetzt'.
Davon weiß ich nichts.
In der jetzigen Version fällt mir nur folgendes so auf die schnelle ein:

x = "string"
x.isdigit()
x.isalpha()
x.isalnum()

und man kann noch überprüfen ob ein variable ein string, int ...... ist das heißt aber nicht das in einem string in Wirklichkeit ein Zahl steht.
Was hat das mit dem Thema zu tun?

Verfasst: Samstag 30. Juni 2007, 16:30
von EyDu
birkenfeld hat geschrieben:
Sr4l hat geschrieben:In Python 3000 wird das gehen das man bestimmte Typen 'festsetzt'.
Davon weiß ich nichts.
Schau mal hier in den Abschnitt "Overloading". Ist zwar nicht direkt festsetzen, sondern nur Dispatchen, aber ich denke, dass es das ist, was Sr4l meinte.

Verfasst: Samstag 30. Juni 2007, 16:36
von birkenfeld
EyDu hat geschrieben:
birkenfeld hat geschrieben:
Sr4l hat geschrieben:In Python 3000 wird das gehen das man bestimmte Typen 'festsetzt'.
Davon weiß ich nichts.
Schau mal hier in den Abschnitt "Overloading". Ist zwar nicht direkt festsetzen, sondern nur Dispatchen, aber ich denke, dass es das ist, was Sr4l meinte.
Schau mal in den Header, da steht "Draft" und nicht "Accepted", und "This PEP proposes a new standard library module, overloading". Das ist also keineswegs eine Feature der Sprache, sondern ein Zusatzmodul.