Verfasst: Samstag 22. September 2007, 09:10
Ich dachte, das warst du...poker hat geschrieben:Das ist da doch zuviel gehacke. Dann kann man auch gleich ``class`` als namespace Nutzen. Aber dan kommen die jenigen mit ihrer "reinen" Lehre.
Seit 2002 Diskussionen rund um die Programmiersprache Python
https://www.python-forum.de/
Ich dachte, das warst du...poker hat geschrieben:Das ist da doch zuviel gehacke. Dann kann man auch gleich ``class`` als namespace Nutzen. Aber dan kommen die jenigen mit ihrer "reinen" Lehre.
Ganze Sätze Herr Birkenfeld!birkenfeld hat geschrieben:Ich dachte, das warst du...poker hat geschrieben:Das ist da doch zuviel gehacke. Dann kann man auch gleich ``class`` als namespace Nutzen. Aber dan kommen die jenigen mit ihrer "reinen" Lehre.
Hallo!birkenfeld hat geschrieben:Ich dachte, das warst du...
Hmm, OK. Im kontext zu Gerold's lätzten Post wird's mir nun klar.birkenfeld hat geschrieben:Ich dachte, das warst du...poker hat geschrieben:Das ist da doch zuviel gehacke. Dann kann man auch gleich ``class`` als namespace Nutzen. Aber dan kommen die jenigen mit ihrer "reinen" Lehre.
Auch kannst du den anderen Posts entnehmen, das ich zu den anderen Pattern geraten habe weil **miner** Erfahrung nach es besser "funktioniert" als wenn man eine classe mit statics nutzt um damit ein Singelton zu emulieren (Einige der nachteiel habe ich ja genannt).poker hat geschrieben: Meine Meinung resultiert nicht daraus das andere Leute mir sagen was richtig und falsch ist, sondern durch eigene Erfahrung!poker hat geschrieben: Letztendlich ist die "reine" Lehre nur soviel Wert bis man auf deren Grenzen stößt, das aber in dem Fall halt nicht gegeben ist. Deshalb empfehlen wir dir auch de anderen Lösungen weil sie "sauberer" und "pythonischer" sind.
Und ich denke damit steht Gerold nicht alleine da. In Ruby hat man das erkannt und deshalb gibt es dort ``module``. Da in Python Module anders definiert sind (Also lediglich dateien die selbst wider ein Objekt darstellen), würde da das von Gerold vorgeschlagenen ``namespace`` treffender sein -- Damit hätte man die gleiche Syntax und Semantik innerhalb eines Python ModulesSobald Ihre Programme in Ruby größer und größer werden, werden Sie normalerweise bemerken, dass Sie wiederverwertbaren Code produzieren -- Bibliotheken mit ähnlichen Routinen, die allgemein anwendbar sind. Sie werden diesen Code in separaten Dateien abspeichern möchten, damit ihn auch andere Ruby-Programme verwenden können.
Dieser Code wird oft in Klassen organisiert sein, also werden Sie vermutlich eine Klasse (oder eine Reihe von Klassen, die in Beziehung zueinander stehen) in eine Datei stecken.
Manchmal kommt es jedoch vor, dass man Dinge gruppieren möchte, die normalerweise keine Klasse bilden.
Soll das etwas zusammengefasst heißen: "birkenfeld, bitte implementiere das in Python 3.0?"poker hat geschrieben:In diesem Kontext (Für den Gerold und sicher viele andere auch) das haben wollen würden, wäre ein ``namespace`` Super hilfreich. Damit würde es erst gar nicht zu Ideologischen Diskussionen kommen, weil man schlicht und einfach weiß ``class`` != ``namespace`` (Auch wenn die Semantik vielleicht die gleiche bleibt!)Im übrigen würde **ich es auch** nicht schlecht finden, weil es eine zusätzliche neue Qualität der Strukturierung mitbringt die **erstmal** frei von jeder ``class`` behafteten Ideologie/Dogmatik (nenne es wie du wilst) ist
.
Ich habe ja vorgeschlagen das in Python zu implementieren. Dann kann man damit auch testen, ob das überhaupt praktikabel ist und als Beispielimplementierung würde dass auch für einen etwaigen PEP handlich sein.poker hat geschrieben:Und ich denke damit steht Gerold nicht alleine da. In Ruby hat man das erkannt und deshalb gibt es dort ``module``. Da in Python Module anders definiert sind (Also lediglich dateien die selbst wider ein Objekt darstellen), würde da das von Gerold vorgeschlagenen ``namespace`` treffender sein -- Damit hätte man die gleiche Syntax und Semantik innerhalb eines Python Modules
Naja, das ganze über ``codecs`` zu realisieren halte ich dann auch wider für zu übertrieben. Besser direkt im Python core integrieren um keinerlei Overhead in kauf zunehmen. Aber als POC IMO gut geeignet um die Praktikabilität auszutesten.Leonidas hat geschrieben: Wenn ich mir das so überlege - ich selbst habe selbst mal überlegt so Funktionen zusammenzufassen, aber letztendlich fand ich dass der Vorteil den es bietet zu gering ist, als dass man da weitere Syntaxkonstrukte hinzufügen müsste.
Stimmt, ganz so konsistent ist der Zen dann noch wider nichtLeonidas hat geschrieben: Außerdem heißt es doch "Flat is better than nested.".. andererseits aber auch "Namespaces are one honking great idea -- let's do more of those!". Der Zen hat also auch zwei Meinungen dazu.
Das wäre vielleicht garnicht so schlecht ein PEP mit nem POC zu eröffnenLeonidas hat geschrieben: Ich habe ja vorgeschlagen das in Python zu implementieren. Dann kann man damit auch testen, ob das überhaupt praktikabel ist und als Beispielimplementierung würde dass auch für einen etwaigen PEP handlich sein.
Code: Alles auswählen
import sys, types
class NamespaceType(type):
def __new__(cls, name, bases, d):
rv = type.__new__(cls, name, bases, d)
if namespace is not None:
rv = rv(rv.__name__)
sys.modules['%s.%s' % (rv.__module__, rv.__name__)] = rv
return rv
namespace = None
class namespace(types.ModuleType):
__metaclass__ = NamespaceType
class foo(namespace):
def blub(self):
print "Ich bin ein Modul"
Code: Alles auswählen
import blub
blub.foo.blub()
Code: Alles auswählen
from blub.foo import blub
blub()
Sorry wenn das jetzt pampig rüberkommt aber irgendwie werde ich das Gefühl nicht los das hier einige e die Posts nicht richtig lesen!blackbird hat geschrieben:Ich find zwar die Idee nach wie vor bescheuert, aber mit Metaklassen kann man sich damit wenigstens virtuelle Module bauen:
Wenn man das jetzt in blub.py speichert kann man sowas tun:Code: Alles auswählen
import sys, types class NamespaceType(type): def __new__(cls, name, bases, d): rv = type.__new__(cls, name, bases, d) if namespace is not None: rv = rv(rv.__name__) sys.modules['%s.%s' % (rv.__module__, rv.__name__)] = rv return rv namespace = None class namespace(types.ModuleType): __metaclass__ = NamespaceType class foo(namespace): def blub(self): print "Ich bin ein Modul"
Oder halt auchCode: Alles auswählen
import blub blub.foo.blub()
Code: Alles auswählen
from blub.foo import blub blub()
Und nichts anderes macht dein Beispiel auch. Ok, die Metaclass erzeugt das Pseudo Module und trägt es in ``sys.modules`` ein, aber an dem eigentlichen Akt der Benutzung (``class``) ändert das nichts.poker hat geschrieben: Klar kann man dafür auch einfach eine Klasse nutzen, aber **und** das ist der Punkt, es ist nicht sofort ersichtlich für einen was die Intention ist. Sprich: Wenn ich (und X**N andere) sehe das einer eine Klasse als Funktionssammlung nutzt, ist **mein** erster Gedanke: "Warum keine Module!?". Sprich, die Dogmatik greift da irgendwo **doch** indirekt da man mit ``class`` was andere assoziert als der Einsatzzweck für das man es dann noch gebrauchen könnte!
In diesem Kontext (Für den Gerold und sicher viele andere auch) das haben wollen würden, wäre ein ``namespace`` Super hilfreich. Damit würde es erst gar nicht zu Ideologischen Diskussionen kommen, weil man schlicht und einfach weiß ``class`` != ``namespace`` (Auch wenn die Semantik vielleicht die gleiche bleibt!)Im übrigen würde **ich es auch** nicht schlecht finden, weil es eine zusätzliche neue Qualität der Strukturierung mitbringt die **erstmal** frei von jeder ``class`` behafteten Ideologie/Dogmatik (nenne es wie du wilst) ist
.
. Punkt.poker hat geschrieben:würde es erst gar nicht zu Ideologischen Diskussionen kommen, weil man schlicht und einfach weiß ``class`` != ``namespace`` (Auch wenn die Semantik vielleicht die gleiche bleibt!)
Nein, Rubys ``module`` (Wenn du das jetzt meinst) hat rein garnichts mit Pythons Modulen zu tun. In Ruby könne mit ``module`` eingeführte namespaces beliebig oft in einer Datei vorkommen und werden sehr oft auch zu Strukturierung genutzt. Gerold und viele aus der Ruby Welt scheinen das doch gebrauchen zu können. Ich erkenne auch kein Nachteil davon, nur vorteile.blackbird hat geschrieben: //EDIT: Und Gott sei Dank haben wir nicht das Ruby Modulsystem, glaubt mir, das wollt ihr nicht
Hallo blackbird!blackbird hat geschrieben:[...]Code: Alles auswählen
import blub blub.foo.blub()
Oder halt auchCode: Alles auswählen
from blub.foo import blub blub()
Code: Alles auswählen
namespace Foo:
def bar():
return "bar"
def spam():
return "spam"
print Foo.bar()
print Foo.spam()
Code: Alles auswählen
class Foo:
def bar(self):
return "bar"
def spam(self):
return "spam"
foo = Foo()
print foo.bar()
print foo.spam()
Ich zitiere dich:poker hat geschrieben:Ganze Sätze Herr Birkenfeld!birkenfeld hat geschrieben:Ich dachte, das warst du...poker hat geschrieben:Das ist da doch zuviel gehacke. Dann kann man auch gleich ``class`` als namespace Nutzen. Aber dan kommen die jenigen mit ihrer "reinen" Lehre.Also, was meinst du? Kann dir nicht folgen.
Meiner Meinung sollte man Klassen nicht als Namensräume missbrauchen.
Nein. Ich meinte, dass du in Ruby nur einen Namespace hast und die Module einfach nur über den Constant-Lookup die Klassen suchen. Mit allen tollen Nebenwirkungen. Ist eigentlich JavaScript Module auf Drogenpoker hat geschrieben:EDIT3: In Ruby ist eine Datei mit Ruby Code kein Modu,l wie es in Python der Fall ist! Das muss man unterscheiden (Falls du das jetzt meintest).
Hallo birkenfeld!birkenfeld hat geschrieben:
- Die ganze Thematik "ich brauche aber einen Namespace!!!1" kommt mir sowieso spanisch vor. Wenn du "a.b" willst, erstell dir ein Modul "a", und fertig. Ansonsten nimm "a_b" und gut is.
Code: Alles auswählen
class Foo:
def bar(self):
return "bar"
def spam(self):
return "spam"
foo = Foo()
print foo.bar()
print foo.spam()
Tja, Birkenfeld, wenn du unfähig bist Aussagen einem Kontext zuzuordnen kann ich dir auch nicht helfen. -- Der Rest in dem Thread, bis auf einige wenige, scheinen mittlerweile zu Wissen was der Topic ist, und betrachten die ersten Aussagen von mir und BlackJack zubirkenfeld hat geschrieben:Ich zitiere dich:poker hat geschrieben:Ganze Sätze Herr Birkenfeld!birkenfeld hat geschrieben:Ich dachte, das warst du...poker hat geschrieben:Das ist da doch zuviel gehacke. Dann kann man auch gleich ``class`` als namespace Nutzen. Aber dan kommen die jenigen mit ihrer "reinen" Lehre.Also, was meinst du? Kann dir nicht folgen.
Meiner Meinung sollte man Klassen nicht als Namensräume missbrauchen.
Ah O.K.blackbird hat geschrieben: Nein. Ich meinte, dass du in Ruby nur einen Namespace hast und die Module einfach nur über den Constant-Lookup die Klassen suchen. Mit allen tollen Nebenwirkungen. Ist eigentlich JavaScript Module auf Drogen
So jetzt pass mal auf Birkenfeld! Du nimmst dir das Recht heraus läuten (konkret mir) Aussagen in den Mund zu legen, in dem du Aussagen aus dem Kontext reist und sie einem andere zuordnest, und damit zu Werturteilen, **ohne** den thread gelesen zu haben? Weist du was das heißt? Zwei läute unterhalten sich, du kommst dazu hörst par Zeilen und labberst dann rum und legst läuten falsche Sachen in den Mund ohne den Zusammenhang zu kenne! Heftig oder?!birkenfeld hat geschrieben:Ich habe jetzt weder Zeit noch Lust, sämtliche Posts hier durchzulesen, aber mal ein paar grundsätzliche Dinge dazu:
Nur die Ruhe poker, ich denke nicht dass birkenfeld dich irgendwie wütend machen wollte. Er hat in seinem Post durchaus einige Aspekte reingebracht, die vorher noch nicht da waren.poker hat geschrieben:Schade das ich nun sauer werden musste.
Nett von dir, danke.poker hat geschrieben:Für dich verständlich Ausgedrückt:
Ist ja schön und gut, nur sehe ich keine grundsätzliche Unvereinbarkeit zwischen den "Kontexten". Der einzige Unterschied zwischen einem Singleton und einer "missbrauchten Klasse" ist doch der, dass das Singleton evtl. Daten und nicht nur Methoden hat.Für Kontext eins - Ja, dafür Klassen als Namensräume zu missbrauchen, wo es auch **offensichtlich** (Und das ist offensichtlich, weil Kontext zwei nicht ersichtlich; wie auch => ``class``!!) ein Modul (Was ich vorzugsweise nutze), Borg oder Singelton tut, ist mist.
Für Kontext zwei ist man an der Grenze der "reine" Lehre gestoßen und kann dafür nicht mehr als Grundlage dienen! Um vornherein die ganzen dogmatischen Diskussionen zu vermeiden, plädieren wir auf ein ``namespace``-statement -> Ein Äquivalent zu Rubys ``module``-statement. Den ``class`` weiterhin für Kontext zwei zu nutzen, führt unweigerlich immer zur gleichen Diskussion -> Modul?! ...
Ach Gottchen, du gehörst also auch zu diesen Leuten, die hinter jedem Satz ein vernichtendes "Werturteil" hervorlugen sehen? Oder jede Aussage bitterernst nehmen, wenn nicht drei Smileys dahinterstehen?Verstehst du diesen kleinen aber feinen Unterscheid? Du kannst nicht einfach eine Aussage die in einem anderen Kontext gemacht wurde - und dafür vollkommen richtig ist - herausreisen und sie auf einen anderen übertragen, für den er garnicht bestimmt war und keinerlei Geltung hat, und damit Werturteilen!
Bis zu meinem ersten Post hatte ich das durchaus, und das hab ich auch nicht anders behauptet. Was danach folgte, hab ich nur überflogen. Der hier von dir zitierte Post enthält keinen direkten Bezug zu dir mehr.So jetzt pass mal auf Birkenfeld! Du nimmst dir das Recht heraus läuten (konkret mir) Aussagen in den Mund zu legen, in dem du Aussagen aus dem Kontext reist und sie einem andere zuordnest, und damit zu Werturteilen, **ohne** den thread gelesen zu haben?Ich habe jetzt weder Zeit noch Lust, sämtliche Posts hier durchzulesen, aber mal ein paar grundsätzliche Dinge dazu:
*g* Zum Thema "Werturteil" hab ich mich ja schon geäußert...Weist du was das heißt? Zwei läute unterhalten sich, du kommst dazu hörst par Zeilen und labberst dann rum und legst läuten falsche Sachen in den Mund ohne den Zusammenhang zu kenne! Heftig oder?!
Weißt du was, wenn du es nicht für nötig erachtest es zu lesen steht dir auch kein Recht zu fremden läuten die Worte im Mund zu verdrehen und auch kein Werturteil!
Oh, ich werds überstehen. Mit ein paar seelischen Kratzern.Vielleicht sollte man das mal als Abwechslung mit dir machen?
Schade das ich nun sauer werden musste.
Nein, aber vielleicht lege ich mir ein an. Gleich neben meiner Duschliste...Leonidas hat geschrieben:@birkenfeld: Hast du eigentlich eine Strichliste, bei der du notierst wie oft du als Troll bezeichnet wurdest? Ich habe da dunkel einen sehr ähnlichen Thread in Erinnerung