Verfasst: Donnerstag 7. Juli 2005, 15:52
Wie in http://www.python-forum.de/viewtopic.php?p=20802#20802 festgestellt, möchte ich einen String-Formatter für Zahlen mit Tausender-Punkte 

Seit 2002 Diskussionen rund um die Programmiersprache Python
https://www.python-forum.de/
Weil Module etwas anderes sind als Klassen!? Das hätte ziemlich komische Konsequenzen. Man kann zum Beispiel keine Module mehr als gemeinsamen Namensraum nutzen. Und da Klassen auch Objekte sind, die dann bei jedem importieren neu erzeugt werden, wird es Probleme geben wenn man eine Instanz einer Klasse erzeugt und in einem anderen Modul zum Beispiel `isinstance()` benutzen möchte. Das wird immer `False` liefern, weil man durch den Import nicht mehr an ein Basisklassenobjekt kommt, sondern jedesmal ein neues erzeugt wird.Leonidas hat geschrieben:Wieso? Wenn du in beiden Modulen Objekte erzeugst, sind es verschiedene Objekte, auch wenn alle Parameter beim erstellen gleich waren. Warum sollte das bei Modulen anders sein?BlackJack hat geschrieben:Wie soll das denn funktionieren? Wenn ich ein Modul in zwei anderen Modulen importieren, dann möchte ich gerne das gleiche Modul in beiden haben und nicht in beiden eine neu geladene Kopie.
Dann kann man `reload()` benutzen oder `dreload()` in IPython. Aber selbst wenn hier ``import`` das Modul wirklich neu laden würde, löst das die Probleme nicht. Beim Testen hat man früher oder später Namen an irgendwelche Objekte aus einem Modul gebunden und vielleicht in Listen, Dictionaries oder als Callback etc. als Parameter in andere Objekte gesteckt. Wenn man nun das Modul neu lädt, dann bleiben existierende Bindungen an Objekte aus dem vorherigen laden trotzdem bestehen und man kämpft irgendwann mit einem Mix aus Objekten der verschiedenen "Generationen". Das Problem gibt's seit SmallTalk und lässt sich nur durch einen Neustart des Interpreters beheben. SmallTalk versucht ein wenig "intelligenter" zu sein und existierende Objekte durch die neuen auszuwechseln, aber manchmal bekommt man dadurch auch inkonsistente Objekte.Ich finds einfach unlogisch, dass man ein Modul nicht neu laden kann, wenn man import modul macht. Das ist besonders ärgerlich im interaktiven Modus, wenn man ein Modul testet und gleichzeitig schreibt.BlackJack hat geschrieben:In was für Situationen benötigt man in Programmen ein `reload()`? Ich persönlich habe es noch nie im Programm benutzt.
Nein, weil es so auch mit tupeln läuft:mawe hat geschrieben:Was mich besonders nervt (hab ich damals auch schon gesagt), ist join.Ich find das völlig unlogisch.Code: Alles auswählen
''.join(liste) # warum so liste.join('') # und nicht so?
Code: Alles auswählen
>>> t = ("hallo", "du", "dumme", "welt", "war", "nur", "spass")
>>> ".".join(t)
'hallo.du.dumme.welt.war.nur.spass'
Code: Alles auswählen
irb(main):001:0> l = ["hallo", "du", "dumme", "welt", "war", "nur", "spass"]
=> ["hallo", "du", "dumme", "welt", "war", "nur", "spass"]
irb(main):002:0> l.join('.')
=> "hallo.du.dumme.welt.war.nur.spass"
Kann man ja kopieren:Leonidas hat geschrieben:Also ich kann mawes Meinung gut verstehen:Ruby hat zwar keine Tupeln, aber ich finde Rubys Verhalten in dem Fall klarer.Code: Alles auswählen
irb(main):001:0> l = ["hallo", "du", "dumme", "welt", "war", "nur", "spass"] => ["hallo", "du", "dumme", "welt", "war", "nur", "spass"] irb(main):002:0> l.join('.') => "hallo.du.dumme.welt.war.nur.spass"
Code: Alles auswählen
>>> class mylist (list):
... def join(self, s):
... return s.join(self)
...
>>> mylist(["hallo", "du", "dumme", "welt", "war", "nur", "spass"]).join(".")
'hallo.du.dumme.welt.war.nur.spass'
>>>
Code: Alles auswählen
irb(main):040:0> class String
irb(main):041:1> def join(l)
irb(main):042:2> l.join(to_s())
irb(main):043:2> end
irb(main):044:1> end
=> nil
irb(main):045:0> '.'.join(['abc', 'def'])
=> "abc.def"
Jup. Das wäre fein.Leonidas hat geschrieben:So ein Feature wäre in Python vielleicht auch nicht schlechtObwohl es auch ein paar Probleme mitbringt.
Hi Jens!jens hat geschrieben:Wen es interessiert: lambda wird nun wohl doch nicht abgeschaft:
Hi Henning!henning hat geschrieben:Aber ich denke das Hauptargument gegen Lambda war gar nicht, dass es wenig genutzt wird, sondern viel mehr dass es zu leicht "falsch" genutzt wird (also um unübersichtlichen Code zu erzeugen), oder sehe ich das falsch?