Man weiss erst, was man an Python hat, wenn man C# schreibt
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). _______________________________________________ Python-de maillist - Python-de@starship.python.net http://starship.python.net/mailman/listinfo/python-de
Am Montag, 17. März 2003 15:12 schrob Gerson Kurz:
- 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:
Schön, sowas mal zu hören ;-). Hast Du zufällig Benchmarks gemacht, wie schnell C# verglichen mit Python (oder Java, etc) ist? Ich habe gehört, dass das rennen soll wie normale EXEs, was mir zu glauben schwer fällt. wr -- The greatest trick the devil ever played was convincing the world he didn't exist. - Unknown _______________________________________________ Python-de maillist - Python-de@starship.python.net http://starship.python.net/mailman/listinfo/python-de
Gerson Kurz wrote:
- 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.
Das müsste eigentlich über Delegates funktionieren (wobei Du u.U. noch Wrapper-Factory-Funktionen einführen musst).
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.
In C++ ist foo(bar) ein Cast, also das gleiche wie (foo)bar. Keine Ahnung, ob das in C# auch so ist. Ciao, Martin _______________________________________________ Python-de maillist - Python-de@starship.python.net http://starship.python.net/mailman/listinfo/python-de
Gerson Kurz wrote:
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#.
ACK.
[...] - 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;
Typischer IDE-generierter Code halt :-/
[...] protected override void Dispose( bool disposing )
A propos: Nichtdeterministische Garbage Collection. Ich hab mir vor kurzem mit folgendem vorübergehend beholfen: foreach (SearchResult in ...) { [...] if (counter % 1000 == 0) { System.GC.Collect(); // Argh! } counter++; } Bei Python weiss ich wenigstens, das while 1: x = Foo() in der momentanen Implementierung konstanten Speicher braucht. Einige Java-VMs kannst du mit so was sogar an die Wand fahren :-D
[...] - 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.
C# (.NET) hat Introspektion.
- 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.
Ich hab noch nie Kraut und Rüben in Containern gehabt. Und wenn, dann immer von einer gemeinsamen Basisklasse. foreach tut's also für mich in C#.
[...] - Ich vermisse die Triplequote-Strings
C#: string helpstr = @"bla bla bla bla bla bla bla bla";
[...] - Es tut mir leid, wenn ich sowas
m_input.TextChanged += new System.EventHandler(this.onInputTextChanged);
Lies: "Wir führen mal eben schnell für GUI-Programmierung die Sprachfeatures Events und Delegates ein." Aus Sicht von "Practicability beats Purity" ist das vielleicht gar nicht mal so schlecht. Oder willst du stattdessen lieber Java's Inner Classes? ;-) -- Gerhard _______________________________________________ Python-de maillist - Python-de@starship.python.net http://starship.python.net/mailman/listinfo/python-de
participants (4)
-
"Martin v. Löwis" -
Gerhard Häring -
Gerson.Kurz@t-online.de -
Willi Richert