[Python-de] Konventionen

Georg Brandl g.brandl at gmx.net
Fr Jul 30 23:21:17 UTC 2010


Am 30.07.2010 23:03, schrieb Ulf Rompe:
> Am 30.07.2010 13:49, schrieb Sebastian Bechtel:
>> Es ist ja Möglich, mit from ... import ... sehr spezifisch Dinge zu
>> importieren in den Namenraum.
> 
> Meines Erachtens gehört diese Möglichkeit zu den größten 
> Design-Schwächen von Python (was nur beweist, dass Python schon ziemlich 
> perfekt ist, wenn mir nichts schlimmeres daran auffällt). Wenn ich mich 
> präzise ausdrücken kann, warum sollte ich es dann nicht tun? Schreibe 
> ich nur time() in meinen Code, wird vermutlich noch jedem Leser klar 
> sein, um was es geht. Wer es nicht weiß, muss dann schon nach oben in 
> die import-Liste scrollen und nachsehen. Nun könnte man argumentieren, 
> dass das zumutbar sei - aber welcher Gewinn steht dem gegenüber? Dass 
> man ab der dritten Verwendung einige Bytes spart? Hey, wir machen doch 
> kein Perl hier.

Es ist aber halt schon etwas mühselig, jedesmal
"django.forms.extras.widgets.SelectDateWidget" zu schreiben (das ist
jetzt eine zufällig ausgewählte Klasse aus Django).  Da bietet der
from-Import einfach Komfort, und wie du schon bemerkt hast, immerhin
steht oben in der Datei, wo der Name herkommt.  Schlimmer IMO ist das
in anderen Sprachen, z.B. in Haskell, wo ein "import Foo" automatisch
alle Funktionen aus "Foo" zur Verfügung stellt, ohne dass irgendwo
stehen muss, welche das sind.

Für Pakethierarchien gibts ja auch die Möglichkeit des "abgestuften"
from-Imports, also z.B.

    from django.forms.extras import widgets

und dann

    widgets.SelectDateWidget

was einen recht guten Kompromiss darstellt.

> Und die Treffsicherheit hast Du ja auch schon angesprochen: Auch, wenn 
> man davon ausgehen kann, dass time() wohl von nirgendwo sonst kommen 
> wird - sicher ist das keinesfalls. Irgendwann wird sich jemand finden, 
> der in Deinem Modul eine lokale time-Funktion einbaut. Sein Code, der 
> die benutzt, wird dann auch funktionieren. Deiner aber nicht mehr. Oder, 
> schlimmer noch, er wird sich nur anders verhalten, und Du wirst es erst 
> bemerken, wenn der Kunde drüber meckert. :-)

Ja, da tun Tools wie pyflakes gut, die auch sonst beim Entwickeln nicht
fehlen sollten.

> Vom Zusatzaufwand beim Refaktorieren will ich jetzt mal gar nicht erst 
> anfangen - ich komme mir ja schon ganz destruktiv vor.
> 
> Also gut, ein Vorteil des "from ... import ..." fällt mir dann doch ein: 
> Bei sehr großen Modulen verringert das den Overhead, weil nur das im 
> Speicher lagert, was auch gebraucht wird. Wenn allerdings ein Modul 
> wirklich derart groß ist, dass sich das bemerkbar macht, ist vermutlich 
> auch schon irgendetwas aus dem Ruder gelaufen...

Das ist allerdings eine Fehleinschätzung; egal ob "import foo" oder "from
foo import X", in beiden Fällen wird das Modul geladen, und zwar komplett
-- anders funktioniert das auch nicht.  Der Unterschied besteht nur darin,
welche Namen im Namensraum des Importeurs gebunden werden.

cheers,
Georg




Mehr Informationen über die Mailingliste python-de