Python-Entwickler sind wahrnehmungsgestört?

Gute Links und Tutorials könnt ihr hier posten.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Ein guter Artikel von Zed Shaw über die Wahrnehmungsstörung von vielen Python-Entwicklern, was die Unzulänglichkeiten von Python angeht: http://zedshaw.com/blog/2009-05-29.html

IMHO lesenswert.

Stefan
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Sehr schön. Wobei ich mich gerade in Java einarbeite und wirklich staune, wie guuuuuuuuuHuuuuuuuuuuut Python in manchen Belangen ist. Wenn ich das richtig verstehe, kann man so selbstverständliche Sachen wie Parameter mit Standard-Werten in Java nur mit Überladungen realisieren. Das ist doch mal echt mist (Wobei ich mich - wie gesagt - gerade erst einlese).

Aber ein schöner Artikel. Danke
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Barabbas hat geschrieben:Das ist doch mal echt mist (Wobei ich mich - wie gesagt - gerade erst einlese).
Keine Sorge, das denke ich mir beim schreiben von Java ständig.

Eigentlich wundert es mich ein wenig, dass es keine zweite Stdlib für Python gibt. Nachdem nun die Warts der Sprache in 3.0 zum Teil entfernt worden sind, wäre eigentlich die Stdlib dran.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
lunar

sma hat geschrieben:IMHO lesenswert.
Darüber kann man geteilter Meinung sein, allerdings lässt jeder Einwand mich ja jetzt als wahrnehmungsgestört erscheinen, daher lasse ich das lieber.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Barabbas hat geschrieben:Sehr schön. Wobei ich mich gerade in Java einarbeite und wirklich staune, wie guuuuuuuuuHuuuuuuuuuuut Python in manchen Belangen ist. Wenn ich das richtig verstehe, kann man so selbstverständliche Sachen wie Parameter mit Standard-Werten in Java nur mit Überladungen realisieren. Das ist doch mal echt mist (Wobei ich mich - wie gesagt - gerade erst einlese).
Wem Java zu einfach und zu beschränkt erscheint, dem empfehle ich Scala. Die Syntax ist eleganter und hat das von Python vertraute "def". Die Sprache ist zwar im Unterschied statisch getypt, doch das Typsystem ist mächtiger als das von Java und kommt einem daher nicht so in die Quere. Außerdem muss man dann keine Neidgefühle in Richtung C# entwickeln, denn alles, was da geht, kann Scala eigentlich auch. Dafür ist die Lernkurve für Scala definitiv höher als die für Java. Und die IDE-Unterstützung steckt noch in den Kinderschuhen.

Ihr wollt benannte Argumente wie bei Python? Kein Problem:

Code: Alles auswählen

def f(a: Int, b: String) ...

f(1, "s")       // geht
f(1, b="s")     // geht
f(b="s", a=1)   // geht auch
Default Arguments? Geht auch:

Code: Alles auswählen

def f(a: Int = 0, b: String = "") ...

f(); f(1); f(a=1); f(b="s") // geht alles
Ihr wollt nur nicht wissen, was für ein Programmcode dafür erzeugt werden muss.

Übrigens, Scala kann noch mehr: Funktionen können mehr als eine Parameterliste haben, was praktisch für currying ist, Parameter können eine call-by-name-Semantik haben, was praktisch für eigene Kontrollstrukturen ist (beides lässt sich natürlich auch kombinieren, sodass man sie etwa sein eigenes `while` bauen kann) und noch einiges mehr.

Stefan
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Bild
:)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Bei so Sachen wie der zusätzlichen Typdefinition beim Anlegen eines `val` oder `var`, die plötzlich einen Doppelpunkt statt des Gleichheits-("Zuweisungs-")zeichens erfordert, schüttle ich den Kopf. Oder drei Schreibweisen für `for`-Loops (oder so, irgendwas war da). Momentan scheint mir Groovy die geradlinigste Lösung (auch im Vergleich zu JRuby und Jython) zu sein, wenn es nur darum geht, irgendwas auf der JVM "agiler" als mit Java zu entwickeln. Aber darum geht's in diesem Thread IMHO nicht.


Was den Artikel angeht: Der Mann hat ja recht. Leute, die solche Dinge a) bemerken und b) auch noch (so unterstelle ich) wohlwollend darüber berichten sind selten wie wertvoll - nur üblicherweise ist es auch nicht einfach, mit ihnen umzugehen. Einfach mal jemand, der Dinge aus einem praktischen Blickwinkel sieht. Wer mal eine von Bill Gates' angeblich täglichen Rant-Mails über Microsoft-Produkte gelesen hat, mit denen er seine Mitarbeiter auf die grundlegenden Schwächen mit der Nase gestoßen hat, weiß wohl, was ich meine.

Und ja, ich will diese Änderungen haben! Ich hasse blöde APIs und ich ändere Sachen, die einfach schlechter oder unpassend sind. Bei einem Projekt wie Python ist das nicht einfach, aber Versionsnummern und Changelogs gibt's auch nicht ohne Grund und spätestens im 3.x-Zweig sollte man eher heute als morgen Macken ausmerzen.

Ich weiß nicht, wie bspw. Georg dem gegenüber steht. Wenn er aber einen Weg findet, Sphinx zu "kickstarten", dann würde ich es vermutlich auch für kleine Sachen einsetzen.
BlackJack

An Lunar anknüpfend: Der Text beginnt mit dem "wahrnehmungsgestört"-Totschlagargument, so dass man darauf gar nichts sagen kann. Und im Folgeartikel sagt er, er würde Patches schreiben, aber da er wettet, das sie sowieso nicht angenommen werden, selbst wenn er ganz nett ist, weil er halt kein Buddy von Guido ist, also lässt er's lieber. Na super.

Bei `API Documentation Generation` fehlt mir irgendwie Epydoc!? Was gibt's daran auszusetzen?

Und etwas substantieller darf die Kritik auch an einigen Stellen sein, als das `optparse` und `argparse` "crap" sind. Warum sind sie das?

Ich denke es ist ein Unterschied zwischen diesen "rants" mit Beleidigungen und vagen Anschuldigungen und einer ehrlichen und schonungslosen Aufzählung von Entwurfsfehlern, die anscheinend nicht angegangen werden. Und dieser Unterschied macht den Artikel für mich nicht wirklich lesenswert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@Leonidas: Welche Version des Sedgewick ist denn das? Die für "C" sieht bei mir rei grün aus. Also Pascal, C++, ...?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Y0Gi hat geschrieben:Bei so Sachen wie der zusätzlichen Typdefinition beim Anlegen eines `val` oder `var`, die plötzlich einen Doppelpunkt statt des Gleichheits-("Zuweisungs-")zeichens erfordert, schüttle ich den Kopf. Oder drei Schreibweisen für `for`-Loops (oder so, irgendwas war da). Momentan scheint mir Groovy die geradlinigste Lösung (auch im Vergleich zu JRuby und Jython) zu sein, wenn es nur darum geht, irgendwas auf der JVM "agiler" als mit Java zu entwickeln. Aber darum geht's in diesem Thread IMHO nicht.
Der Doppelpunkt ist für die Typen, die man - juhuu - ab und zu Weglassen darf, wegen Type Inference.
Und Groovy ist ein wenig ein anderes Kaliber als Scala. Groovy scheint mir insofern recht uninteressant zu sein, als da es hauptsächlich eine dynamische Sprache zum Interfacing mit Java ist, wohingegen Scala eher ein Ersatz von Java durch eine mächtigere Sprache sein soll.
Hyperion hat geschrieben:@Leonidas: Welche Version des Sedgewick ist denn das? Die für "C" sieht bei mir rei grün aus. Also Pascal, C++, ...?
Das ist die Pascal-Version. Aber ich mag den Sedgewick nicht so, bevorzuge Goodrich/Tamassia und am liebsten Cormen (der steht nicht im Regal sondern auf dem Schreibtisch).
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

@Y0Gi: Ich verstehe das Kopfschütteln nicht. Mich würde es eher abschrecken wenn für beides das Gleicheitszeichen verwendet würde. ``val foo = String = "Hello"`` fänd ich *sehr* befremdlich.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Ich denke mal, den Rant sollte man jetzt nicht so schwer nehmen. Jede Sprache hat irgendwo seine Stärken und Schwächen, und so lange nicht die wirklich wichtigen Sachen schlecht sind (z.B. builtin-Typen) und die Sprache sonst genug Vorteile bietet.

Ich hab hier ein Script rumfliegen, das ich auf mehrere Sprachen (mehr oder weniger 1:1) portiert habe um zu gucken wie schnell die jeweils bei diesem Problem sind (ist sicherlich nicht sonderlich aussagekräftig, bis jetzt C++, ObjC, Java, Python und Smalltalk(Squeak) ). Dabei war die Version in Python (neben der in Java) noch am angenehmsten zu implementieren. C++ war dabei zwar mit am schnellsten aber am nervigsten zu implementieren, da man wirklich vieles selbst schreiben muss, da in der Standardbibliothek fast nichts dabei ist.

In Python hat das ganze am meisten Spaß gemacht, klar kann man das als Wahrnehmungsstörung bezeichnen, wenn man von Python weniger angenervt als vom Rest ist und man deswegen die eine oder andere Schwäche nicht so stark wahrnimmt. Aber bedenklich finde ich das nicht.
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

os.rmdir() != rm -rf:
str1442:~$ rmdir foobar
rmdir: konnte „foobar“ nicht entfernen: Das Verzeichnis ist nicht leer
"Time Conversion" kann ich nicht beurteilen, aber ich sehe nicht wo datetime usw heutzutage kompliziert sein soll. (<- wahrnehmungsgestört!1!1)

del <list>[<index>]

Code: Alles auswählen

In [1]: a = range(10)

In [2]: a.pop(4)
Out[2]: 4

In [3]: a
Out[3]: [0, 1, 2, 3, 5, 6, 7, 8, 9]

In [4]: a[1:5] = ()

In [5]: a
Out[5]: [0, 6, 7, 8, 9]
del bei Listen ist wirklich unschön, aber es gibt alternative Möglichkeiten. Und die Slicing syntax fügt sich eigentlich ganz gut ein.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

str1442 hat geschrieben:"Time Conversion" kann ich nicht beurteilen, aber ich sehe nicht wo datetime usw heutzutage kompliziert sein soll. (<- wahrnehmungsgestört!1!1)
Datetime ist ganz nett eigentlich, aber es gibt irgendwas (weiß nicht mehr was genau das war) was man in eine Richtung konvertieren kann (also Primitives Objekt <-> Datetime), aber nicht mehr zurück. Ich glaube genau das meint Zed. Wobei das nachzureichen nun wirklich nicht schwer wäre.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Wobei mir im Moment echt kein Programm einfällt, wo ich mal ``del liste[index]`` gemacht hätte. Und auch keinen der Workarounds dafür. Liegt wahrscheinlich an meiner Wahrnehmungsstörung, dass ich um dieses riesengrosse Problem immer herumprogrammiere. Mein Code wird dadurch sicher viel komplizierter, ich seh's bloss nicht. ;-)
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

BlackJack hat geschrieben:Wobei mir im Moment echt kein Programm einfällt, wo ich mal ``del liste[index]`` gemacht hätte.
Komisch, das wollte ich auch schreiben oO' Die Daten zu filtern ist in normalen und realistischen Anwendungsfällen wesentlich sinnvoller.
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Datetime ist ganz nett eigentlich, aber es gibt irgendwas (weiß nicht mehr was genau das war) was man in eine Richtung konvertieren kann (also Primitives Objekt <-> Datetime), aber nicht mehr zurück. Ich glaube genau das meint Zed. Wobei das nachzureichen nun wirklich nicht schwer wäre.
Er redet ja explizit von String zu Time Konvertierungen, die selbst ANSI C definiere. time.h kennt strftime() und ctime(), die das Invers des jeweils anderen zu sein scheinen - zusätzlich gibt es localtime(), time() und ein paar andere. Sowohl das time Modul als auch das datetime Modul definieren aber strftime() und strptime(). Insofern scheint er da nicht ganz auf dem neusten Stand zu sein. Und ansonsten hat er ja noch ganz pauschal behauptet, daß "einfache Aufgaben, die Zeit involvieren" noch immer kompliziert wären.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

@YOGi: Die Typdeklaration mit ":" finde ich konsequent und passend. Eine Zuweisung wäre falsch. Es wird ja kein Typ zugewiesen. Python 3.0 benutzt übrigens auch den ":" innerhalb von Parameterlisten von Funktionen. Das man mit dem "for" auch das monadische "do" von Haskell hat erschlagen wollen, finde ich auch nicht so doll, aber ansonsten ist "for" ja nur syntaktischer Zucker.

Groovy halte ich für einen Bastard, den eigentlich nur seine Mütter und Väter lieben können. Vielleicht ist die Sprache praktisch, aber stilistisch finde ich sie nicht gelungen. Es ist ein Mischmasch aus Konzepten, die nicht so richtig zusammenpassen wollen.

Ansonsten: In einigen Beiträgen hier passiert nun genau das, was Zed als Teil der Wahrnehmungsstörung beschreibt: Die Konzepte werden so wie sie sind verteidigt. QED :)

Sagen wir doch, wie es ist: Die Funktionsbibliothek von Python ist zum Teil vermurkst. Die Existenz eines "del"-Befehls als Spezialfall ist auch nur durch die Historie zu entschuldigen. Ein anderes Beispiel ist `setdefault`, eine Methode, der man nicht gerade ansieht, dass sie einen Wert liest. Das `at:ifAbsentPut:` von Smalltalk ist da doch wesentlich genauer. Ach, und das die Python-Datumsdinger da keine Zeitzonen beherrschen, das nervt mich jedes Mal immer wieder gewaltig. Und komme mir jetzt keiner mit dem Hinweis, dass man ja eine Thirdparty-Lib einbinden kann... es geht einfach darum, dass so etwas Teil der Standardbibliothek sein muss.

Anders ausgedrückt: Die enthaltenen Batterien sind schon ganz schön rostig...

Stefan
lunar

sma hat geschrieben:Sagen wir doch, wie es ist: Die Funktionsbibliothek von Python ist zum Teil vermurkst.
Das bezweifelt doch niemand. Man kann die Kritik an der Standardbibliothek aber auch konstruktiv und produktiv formulieren. Wenn man einfach nur Frust schieben will, so wie es der Autor des Beitrags getan hat, dann hilft das ihm vielleicht, dem Rest der Welt aber nur bedingt. Insbesondere, wenn man sich dann eben diesem Rest gleich auch noch pauschal eine "Wahrnehmungsstörung" unterstellt ... sowas fördert die Zusammenarbeit im Allgemeinen nicht so sehr.
Ein anderes Beispiel ist `setdefault`, eine Methode, der man nicht gerade ansieht, dass sie einen Wert liest.
Wenn du diese Methode zum Lesen von Werten benutzt, hast du was falsch gemacht ... man nutzt diese Methode, um Standardwerte in Wörterbüchern zu setzen. Welcher Name wäre da passender?
Anders ausgedrückt: Die enthaltenen Batterien sind schon ganz schön rostig...
Da stimmt wohl jeder zumindest teilweise zu ... distutils und setuptools sind ja auch nicht die schönsten Eier der Schlange ;)
Antworten