"Typsicherheit" (war: Re: [Python-de] socket und umlaute)

Stefan Schwarzer sschwarzer at sschwarzer.net
Sam Nov 22 16:35:37 CET 2003


Hallo Olaf,

On Sat, 2003-11-22 13:50:32 +0100, Olaf 'Ruebezahl' Radicke wrote:
> Alles schön und gut. Eine so hohe Abstraktion mag seine
> Vorteile haben. Aber es währe noch schöner wenn ich
> die *Möglichkeit* hätte, Typen so zu deklarieren das
> ich z.B. nicht mehr einfach eine Variable mal als str mal
> int benutzen kann. Weil wenn ich ein ziemlich langen
> verworrenen Code habe, wie soll ich da raus finden,
> ob ich jetzt ein int oder ein str vor mir hab? Selbst
> wenn ich im Code nach einer Zuweisung suche kann ich
> Pech haben und in irgend einer unterfunktion wird da
> stillschweigend aus ein int ein str gemacht. Eh ich
> den Fehler gefunden habe, können Tage vergehen.

Wenn du "langen verworrenen" Code hast, _schreit_ das nach
Vereinfachung/Refaktorierung des Codes, unabhängig davon, ob die
Verknüpfung eines Namens mit einem bestimmten Typ möglich ist oder
nicht. :-) Letzteres flickt das eigentliche Problem nur sehr
notdürftig.

Du kannst in Python nicht "aus einem int ein str" machen. Ein Objekt
hat immer einen bestimmten Typ (außer vielleicht so pathologischen
Fällen wie Zuweisungen an __class__  ;-) ). Meinst du eher "eine
Funktion/Methode akzeptiert ein int und gibt ein str zurück"? Wenn ja,
musst du die Schnittstellen deiner Module/Klassen/Methoden/Funktionen
so entwerfen, dass sie nicht nur irgendwie dein Problem lösen, sondern
auch intuitiv - d. h. ohne genaue Kenntnis der inneren Implementierung
- benutzbar sind. Vielleicht habe ich dich bzw. dein Problem auch
nicht richtig verstanden und bin auf dem falschen Dampfer. :-)

> Ich könnte mir eine Klasse bzw. Typ "StaticTyp" Vorstellen:
> 
> int_vier = StaticTyp(int, "4")
> str_vier = StaticTyp(str, "4")
> 
> try:
>     if int_vier == str_vier:
> 	print "kein Fehler"
> except StaticTypError, par:
>     print "So ja nicht: ", par

Du könntest diese Klasse StaticTyp, soweit ich sehe, in Python
schreiben. Das wäre allerdings nur begrenzt wirksam, da viele von
Python's eingebauten oder in Modulen vorliegenden Hilfsmitteln nach
wie vor gewöhnliche "ints" und "strs" zurückgeben würden.

Nichtsdestotrotz bin ich ziemlich sicher, dass dein Problem anders
gelöst werden kann - und sollte - als mit statischer Typbindung.

> PS:
> Was meine Programmiererfahrung betrifft. In den letzten
> ca. 2 Jahren habe ich mich mit C, C++ und Perl beschäftigt.
> Perl war meine erste Sprache, die ich aber sehr schnell
> verwarf, weil sich Python wesentlich leichter debuggen lässt.

Das ging mir auch so und war der Grund für die Abkehr von Perl:
Manchmal ging die Zeit, die ich beim vermeintlichen "Einfach-so-
hinschreiben-können" gespart hatte, wieder für die Fehlersuche drauf.
Meine Fehler in Python-Code (zumindest die, die ich finde ;-) ) sind
dagegen eher trivial und schnell zu beheben, oder selten.

> Für C und C++ sind meine Projekte zu klein (auch personell)
> als das der Aufwand noch in Relation zum Nutzen stände.

C oder C++ zu verwenden hat m. E. nichts mit der Größe des Projekts zu
tun, sondern mit der Art des Projekts. Ich kann mir gut vorstellen,
dass auch für viele "große" Projekte Python weitaus besser als C/C++
geeignet ist/wäre.

Viele Grüße
 Stefan