audax hat geschrieben:Stackless Python, weil CPython keine Continuations unterstützt...wegen des Stacks.
Das ist mir schon klar. Meine Kritik ist, dass ich Stackless Python nicht parallel auf dem Mac installieren kann, um so gefahrlos das ganze auszuprobieren. Müsste es selbst kompilieren - dafür muss ich mich aber auch selbst um die Abhängigkeiten kümmern, was ich schon mal für Python 3 probiert hatte.
Das virtualenv benutzt wird, lässt mich ja hoffen. Leider wollte stackless auch eben unter Ubuntu nicht bauen... versuche jetzt dort die Abhänigkeiten aufzulösen. Wenn ich mir die VM verkonfiguriere, ist das nicht schlimm.
Habe mir inzwischen ein paar der Beispiele angeschaut. Ich verstehe immer noch nicht, warum die `render`-Methode nicht Teil der Objekte ist, sondern von außen angeflanscht wird. Im Wiki-Beispiel sieht man beispielsweise:
Code: Alles auswählen
class Page:
def __init__(self, title):
self.title = title
def edit(self, comp):
content = comp.call(PageEditor(self))
if content: ...speichern...
@presentation.render_for(Page)
def render(self, h, comp, *args):
page = ...lesen...
h << h.a('Edit this page').action(lambda: self.edit(comp))
Eine Funktion mit "self"-Parameter außerhalb einer Klasse finde ich gewöhnungsbedürftig - zumal sie sich ja abhängig von `edit` in der Klasse ist. Und das die Seiten aus der Datenbank nochmal andere Objekte sind als das Page-Objekt selbst, finde ich auch nicht gelungen. Wenn das schon sein muss, dann sollte dies bitte die PageComponent oder PageView oder sowas sein.
Was mög eigentlicht "functional variable" sein? Meine Assoziation wäre, eine, die sich nicht ändert. Gemeint ist aber wohl etwas anderes. So sieht `render` von `PageEditor` aus:
Code: Alles auswählen
def render(self, h, comp, *args):
content = var.Var() # local functional variable
page = ...lesen...
h << h.textarea().action(content)
h << h.input(type='submit', value='Save').action(lambda: comp.answer(content())
h << h.input(type='submit', value='Cancel').action(comp.answer)
Das missfällt mir mehrfach. Ein Textarea hat eine Action? Ich würde hier eher eine Art gebundene Werte erwarten. Offenbar ist aber `content` eine Funktion, die man mit und ohne Parameter aufrufen kann und die dann jeweils ein Setter oder ein Getter ist. Hm. Auch würde ich mir eine höhere Abstraktion für die beiden Buttons wünschen. Und das auch hier offenbar ausgenutzt wird, dass man `answer` mit und ohne Argument aufrufen kann, ist fehleranfällig.
Bei Seaside würde das übrigens so aussehen (content wäre eine Exemplarvariable, der Button leitet seinen Namen aus dem Selektor ab):
Code: Alles auswählen
renderContentOn: html
html form: [
html textArea on: #content of: self.
html submitButton on: #save of: self.
html submitButton on: #cancel of: self]
save
self answer: content
cancel
self answer: nil
Äquivalentes Python wäre vielleicht dies:
Code: Alles auswählen
def render(self, html):
with html.form():
html.textArea().bind_to(self, 'content')
html.button().bind_to(self.save)
html.button().bind_to(self.cancel)
def save(self): self.answer(self.content)
def cancel(self): self.answer(None)
Stefan
PS: Warum erkennt BBCode eigentlich with nicht als Schlüsselwort? ;)