[Python-de] Man weiss erst, was man an Python hat, wenn man C# schreibt

Gerson Kurz Gerson.Kurz at t-online.de
Mon Mar 17 15:12:19 EST 2003


Nachdem ich jetzt ein paar Tage C# programmiert habe (siehe etwa
http://p-nand-q.com/e/pcalc_net.html) schätze ich Python noch mehr als
vorher (falls das überhaupt möglich war). Wenn man Python programmiert,
vergisst man leicht, wie *gut* die Sprache ist; deshalb hier ein paar
Punkte, in denen Python zu programmieren einfach mehr Spaß macht und schöner
ist als etwa C#.

- Strichpunkte. Arg! Wie kann man eine neue Syntax definieren im Jahr 2002,
und dann damische Strichpunkte vorschreiben! IIRC konnte schon Turbo Pascal
anno ca. Mitte der 80er selbständig Strichpunkte einfügen - DevStudio.NET
2003 kann das immer noch nicht

- Dictionaries. C# hat auch Dictionaries, aber was für welche! Hier ein
Orginalzitat aus "Programming Microsoft .NET" von Microsoft Press:

"""
Hashtable table = new Hashtable ();
table.Add ("Sunday",    "Dimanche");
table.Add ("Monday",    "Lundi");
table.Add ("Tuesday",   "Mardi");
table.Add ("Wednesday", "Mercredi");
table.Add ("Thursday",  "Jeudi");
table.Add ("Friday",    "Vendredi");
table.Add ("Saturday",  "Samedi");

With the hash table initialized in this manner, finding the French
equivalent of Tuesday requires one simple statement:

string word = (string) table["Tuesday"];
"""

Daß das statement "simple" ist, ist offensichtlich nicht mal ironisch
gemeint.

- A propos: explizite Typangaben. Dem Compiler mag es das Leben einfacher
machen, wenn überall Typen dranstehen, aber wie einfach ist die Pythonsyntax
ohne Typen - und genauso schnell wie .NET ist es vermutlich auch. Zum
Beispiel fängt mein erstes Windows-Forms-Beispiel mit folgender bildhübschen
Syntax an:

	public class Form1 : System.Windows.Forms.Form
	{
		private System.Windows.Forms.MainMenu mainMenu1;
		private System.Windows.Forms.MenuItem menuItem1;
		private System.Windows.Forms.MenuItem menuItem2;
		private System.Windows.Forms.MenuItem menuItem3;
		private System.Windows.Forms.MenuItem menuItem4;
		private System.Windows.Forms.MenuItem menuItem5;
		private System.Windows.Forms.MenuItem menuItem6;
		private System.Windows.Forms.MenuItem menuItem8;
		private System.Windows.Forms.MenuItem menuItem13;
		private System.Windows.Forms.MenuItem menuShowOptions;
		private System.Windows.Forms.MenuItem menuSetFont;
		private System.Windows.Forms.MenuItem menuQuit;

Jammern! Zähneknirschen! Kopfgegendiewandschlagen! Augenrollen! usw.

- Ich vermisse Arrays und Tuples, Python-style. Was man an denen hat, merkt
man erst, wenn man sich durch Sachen wie dies hier

this.Controls.AddRange(new Control[]{m_output, m_splitter, m_input})

antut: auch wenn es nicht so ausschaut, wird hier ein Array von 3
Control-Referenzen übergeben. Toll, nicht?

- Die grauselige "wir schreiben alles aus"-Java-Syntax-Schule. Beispiel:

protected override void Dispose( bool disposing )

- Die grauselige "alles ist eine Klasse"-Java-Syntax-Schule, die dafür dann
ungefähr eine Million static-Funktionen einführt. (Fast jeder System.*
Namespace hat diverse Static Methoden. Aber hey, es ist immer noch "eine
Klasse"). Python ist pragmatisch: es gibt Funktionen, und es gibt Klassen,
je nachdem, was besser geeignet ist. C# ist diktatorisch: one size fits all.

- Python hat ja auch keinen Präprozessor, was ich als alter Makrohacker
lange lange vermisst habe. Dafür hat Python Introspektion und eval(), womit
sich die wichtigsten Sachen abbilden lassen, und die anderen auch, mit etwas
mehr Aufwand. C# hat weder noch.

- Klassen als Objekte. Ich kann in Python etwa schreiben

	instance = { "foo" : class1, "bar" : class2 }[param]()

und erzeuge abhängig von param eine Klasse. (Gut, das Beispiel ist so etwas
undurchsichtig, aber in real life benutze ich etwas ähnliches z.B. für einen
Serial Protocol Analyzer. In C# : Fehlanzeige.

- new. In Python instanziiere ich eine Klasse, indem ich den Konstruktor
aufrufe, etwa so

blablabla = foo(bar)

in C# mache ich das eigentlich genauso, ich *muss* aber new davor schreiben.

blablabla = new foo(bar);

Dabei ist foo(bar), wenn foo eine Klasse ist, eh keine gültige Syntax! In
C++ könnte ich das ja noch verstehen, aber da gibt es ja auch dann delete
dafür.

- Ich vermisse Sachen wie "if a in [liste von werten]", oder "for a in
[liste von werten]". (Wobei foreach letzterem nahekommt, aber auch nur ganz
von der Ferne nahe: "foreach(datentyp bezeichner in liste)", sprich, die
Liste kann nicht unterschiedliche Werte enthalten. Soviel zum Thema
Polymorphismus.

- Ich vermisse schnelle praktische lambdas. Ja, ich weiss, ich habe sie oft
missbraucht, aber ich habe es nicht so gemeint, ehrlich!

- Ich vermisse die Triplequote-Strings

- Ich vermisse *GANZ GANZ GANZ* stark die string-% Syntax. Vergleich:

"Msg: %s" % msg

vs.

String.Format("Msg: {0}", msg)

- Es tut mir leid, wenn ich sowas

m_input.TextChanged += new System.EventHandler(this.onInputTextChanged);

sehe, dauert mich mein Schicksal. Und dann heisst es immer, man solle beim
überlagern von Operatoren darauf aufpassen, daß sie "sinngemäß" überlagert
werden.

- Die "ref"-Syntax. Obwohl ich mich zu 99.99-periodisch Prozent sicher bin,
daß auch in C# Klassen immer per Referenz übergeben werden, muss ich
explizit *angeben*, wenn ich eine Referenz haben will.

- Debug.Assert(expression) anstelle von einfach "assert expression". (Wobei
man dazu noch einen eigenen Namespace einbinden muß, als ob assert ganz
selten benutzt würde).

In ein paar Sachen ist C# vielleicht nicht ganz so schlecht; z.B. gefällt
mir die Properties-Syntax sehr gut (wobei bei Python die
newstyle/oldstyle-classes-Konfusion vielleicht der properties-Syntax
geschadet hat), die ?: syntax,  block comments.

Aber ansonsten: es wird Zeit, daß wieder Leben in das Python.NET - Projekt
kommt (letztes Stadium IIRC ein Whitepaper).






More information about the Python-de mailing list