|
|
|
|
Ja, das ist richtig. Deswegen hole ich mir auch den DOM-Knoten mit "callingNode.get(0)" um darauf dann die Methoden auszuführen. Das ganze trallala ist jetzt aber auch nur testweise drin gewesen, da empty() und co. nicht funktioniert haben und ich den scheiß halt manuell da rauslöschen wollte...
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von Smoking am 04.11.2009 17:20]
|
|
|
|
|
|
Python is much luve <3
Meine Situation: Ich möchte gerne bei einer Google AppEngine Anwendung ein ODF-Dokument vervollständigen und es dann per Anhang als Mail verschicken. Außerdem würde ich es gerne zwischenspeichern
Problem hierbei: Auf AppEngine kann man nicht auf die Disk schreiben, lediglich in den Datastore. Also habe ich mir als aller erstes ein entsprechendes Model gebaut, dass als meine Fileobjekt arbeiten soll. Die Daten kommen in ein "Blob" Feld, außerdem hat es noch einen Dateinamen sowie Erstelle- und Änderungszeitpunkt.
Nun ist das Problem: Die ODF-Libary die ich habe, kann nur aus eine "File" Objekt lesen. Ich könnte jetzt hingehen und meiner Model-Klasse alle nötigen Methoden verpassen, so dass sie wie eine "richtige" Datei arbeitet. Das wird aber schnell umständlich, denn weil ODF-Dateien nunmal nur ZIP-Archive sind, muss die Libary da drin rum-seeken können. Das wird alles schnell kompliziert und fehleranfällig.
Meine Lösung:
|
Code: |
class DatastoreFile(db.Model):
name = db.StringProperty()
created = db.DateTimeProperty(auto_now_add=True)
modified = db.DateTimeProperty(auto_now=True)
data = db.BlobProperty()
def __getattr__(self, name):
# falls ein "file-like" attribute gesucht wird, reichen wir das
# das entsprechende attribut vom _buffer objekt zurück
if name in ('open','close','read','write','seek','tell'):
if not self._buffer:
# sollte _buffer noch nicht existieren laden wir es mit den
# daten aus dem datastore
self._buffer = StringIO(self.data)
return getattr(self._buffer, name)
|
|
Ich habe meinem Model einfach eine __getattr__ Methode verpasst. Die wird von Python immer dann aufgerufen, wenn das Objekt kein Attribut (merke: Auch Funktionen eines Objekts sind in Python Attribute) mit dem entsprechenden Namen enthält.
Wenn immer ein Attribut gesucht wird, von dem ich weiß, dass ein "File" sie haben müsste, gebe ich einfach das Attribut von "buffer" zurück. Und "buffer" ist wiederum ein StringIO Objekt, dass es praktischerweise in Pythons Standardbibliothek gibt. StringIO ist einfach ein in-memory File mit allen nötigen Methoden.
Magic \o/
|
|
|
|
|
|
|
So cool Python ja eigentlich ist, für diesen ersten "self"-Parameter bei Methodenaufrufen sollte jemand geschlagen werden.
|
|
|
|
|
|
|
Aber jetzt verstehe ich auch, wieso es IronPython gibt. Die meisten Dinge lassen sich gut nach .NET "portieren", erfordern dar aber eine Menge Mehrarbeit.
Angenommen ich für zum Beispiel ein Scaffolding durch und schaue, welche Eigenschaften eines Objekts ich als Model-Eigenschaften betrachten kann, dann würde man mittels Reflection beim Objekt-Typen nachfragen, welche Eigenschaften er hat. An dieser Stelle kann man dann einen "CustomTypeDescriptor" einbinden, der dann weitere Pseudo-Eigenschaften zur Verfügung stellt.
Das ist aber ne Heidenarbeit, aber ich hab sie trotzdem schon mal gemacht. Für ein Dictionary, bei dem die einzelnen Schlüssel nach außen als "Eigenschaft" reflektiert werden. Das brauche ich für verschiedene Data-Binding Szenarien.
Aber da ich ein sehr "verbos"iger () Mensch bin, ist Python trotzdem nichts für mich.
|
|
|
|
|
|
|
Irgendwie verunsichert mich das immer, wenn ich bei Post von denen ich halbwegs Ahnung haben sollte, jedes zweite Wort nicht verstehe
|
|
|
|
|
|
|
|
|
|
|
jetzt führt sie
|
|
|
|
|
|
|
Zu spät, meine Soldi Sloi Sorida Stimme hat sie bereits.
|
|
|
|
|
|
|
*votier*
|
|
|
|
|
|
|
Es geht doch nichts über einen dezenten GS-Push
So, nu muss ich mich endlich mal überwinden und wieder Tales of Monkey Island Episode 4starten. Hänge da an ner fiesen Stelle fest.
|
|
|
|
|
|
|
|
|
|
|
| Zitat von igor]2
So cool Python ja eigentlich ist, für diesen ersten "self"-Parameter bei Methodenaufrufen sollte jemand geschlagen werden.
| |
Schlag Guido
Er hat das ganze über die Jahre immer wieder mit eigentlich ganz guten Argumenten verteidigt. Z.b. hier.
Das ganze geht im Prinzip auf zwei Ursachen zurück:
- "explicit is better than implicit"
- Die Sprache soll möglich klein gehalten worden. Würde man es streichen müsste man "self" oder "this" als Keyword einführen.
Außerdem erlaubt es z.B. so merkwürdige Dinge wie "nachträglich eine Methode an eine Instanz zu hängen, die trotzdem Zugriff auf die Instanz hat" (wie in die Beispiel im Link).
Das es "unlogisch" o.ä. ist, kann ich so nicht bestätigen. Wenn man es weiß, dann weiß man es eben. Das Methoden in Java über ein magisches "this", das offenbar vom Himmel fällt, Zugriff auf das aktuellen Objekt haben ist für dich vielleicht gewohnter, aber neutral betrachtet auch nicht logischer, oder?
Betrachte es halt als eigenart...schlecht isses auf jeden Fall nicht.
|
|
|
|
|
|
|
Ich komm halt ursprünglich von der C++-Seite, da wird das auch als erster Parameter übergeben, nur wirds da aus der Sprache herausgehalten. "this" ist da eigentlich auch nicht viel mehr als eine Kurzform für "gib mir den ersten Parameter vom Stack -- ja, genau den, den ich nicht ausgeschrieben habe, von dem wir aber alle wissen, dass er da liegt". Jeder, der mal was länger C++ gemacht hat, wird sich notgedrungen irgendwann doch mit den Feinheiten der Sprache auseinandersetzen müssen, wie breit ein char sein darf, was "meistens, aber nicht immer" funktioniert, usw. -- einem durchschnittlichen C++-Programmierer ist auch das mit dem "this"-Pointer auf dem Stack klar. Von daher wundert es mich einfach, dass sogar das ultratechnische, aufgeblähte C++ den versteckt, aber Python den explizit macht.
Eigentlich fühle ich auch nur so eine dumpfe Unzufriedenheit mit der Skriptsprachen-/Rapid Prototyping-Welt. Ich warte noch darauf, dass Python und Ruby ein Kind zeugen, das ich dann adoptieren kann. Beide sind irgendwie toll, aber nicht perfekt. :/
|
|
|
|
|
|
|
Ich fühlte mich auch direkt an meine Anfangszeiten mit C++ erinnert, wo man dann wie blöd versucht hat, eine Instanz-Methode als Callback für WINAPI-Aufrufe zu verwenden.
Das ging natürlich nicht, weil die Signatur, dank des this-Pointers nicht stimmte. Keine Ahnung, wie man das eigentlich elegant gelöst hat, ist mir mittlerweile auch egal.
Was ich nicht verstehe: "explicit is better than implicit"; mir kam es immer so vor, dass bei Python einfach verdammt viel implizit gemacht wird, oder wirkt das nur so, weil ich noch nicht viel damit gemacht habe?
|
|
|
|
|
|
|
Ah cool, ne neue Staffel Crimnal Intent auf Vox.
Aber auch ne neue Titelmelodie bäh
|
|
|
|
|
|
|
| Zitat von [DK]Peacemaker
Was ich nicht verstehe: "explicit is better than implicit"; mir kam es immer so vor, dass bei Python einfach verdammt viel implizit gemacht wird, oder wirkt das nur so, weil ich noch nicht viel damit gemacht habe?
| |
Ich weiß nicht. Ich könnte jetzt auf nix mit dem Finger zeigen was total implizit wäre. Allerdings könnte ih andersrum auf nix zeigen, was irgendwie explizit wäre. Vielleicht das man Funktionsparameter Grundsätzlich als Keyword (also function(param1=bla, param2=foo) ) übergeben kann...aber sonst...ich hab mir da nie viel Gedanken drüber gemacht.
|
|
|
|
|
|
|
|
|
|
|
| Zitat von [DK]Peacemaker
Ich fühlte mich auch direkt an meine Anfangszeiten mit C++ erinnert, wo man dann wie blöd versucht hat, eine Instanz-Methode als Callback für WINAPI-Aufrufe zu verwenden.
Das ging natürlich nicht, weil die Signatur, dank des this-Pointers nicht stimmte. Keine Ahnung, wie man das eigentlich elegant gelöst hat, ist mir mittlerweile auch egal.
[...]
| |
(Theoretisch über mem_fun, oder sonst über einen Wrapper der Boost-Library. Wo du allerdings, je nachdem, wieder in Probleme läufst, wenn die Signatur nicht exakt der WINAPI-Signatur entspricht, und da wieder irgendwo ein stdcall im falschen Hals sitzt. Zum Kotzen.)
|
|
|
|
|
|
|
Wir haben in der Wuala Gruppe unseres Informatik Fachbereichs mitlerweile knapp 3GB verteilt auf ~1500 E-Books. Bald machen wir Google Books konkurrenz
|
|
|
|
|
|
|
In meinem Informatikstudium hab ich maximal 3 themenbezogene Bücher gelesen
e\ wobei, wo ich grad nachdenke: war doch einiges mehr
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von TriggerTG am 04.11.2009 20:59]
|
|
|
|
|
|
Könnte der Grund sein warum du von vielen Posts in denen du eigentlich alles verstehen müsstest jedes zweiten Wort nicht kapierst.
|
|
|
|
|
|
|
Das ist unfair! Das bezieht sich nur auf Peacemakers komisch kranken sachen!
|
|
|
|
|
|
|
Ich versteh ihn.
Meistens.
|
|
|
|
|
|
|
|
|
|
|
| Zitat von Achsel-des-Bösen
Ich versteh ihn.
Meistens.
| |
Freak.
|
|
|
|
|
|
|
Einberufung bekommen. Danke Bundeswehr. Führungsunterstützungsbataillon. Was soll das überhaupt sein? Teeverein? Argh.
|
|
|
|
|
|
|
Sind doch nur noch 6 Monate? Oder bei dir noch 9
|
|
|
|
|
|
|
Fix Einspruch einlegen, sagen, dass die Begründung noch kommt, Begründung schreiben, Anwalt nehmen, falls du zur Verhandlung vorgeladen wirst?
|
|
|
|
|
|
|
Erst ab 2011 werden es 6 Monate. Ich werd mal mit unserer Personalabteilung/Chef reden, ob die mir eine Unabkömmlichkeitserklärung schreiben können, weil ich in einem super wichtigen Projekt bin.
Und das ist noch nicht mal gelogen. Ich erschreck meinen Projektleiter damit, dass das System erst zur Cebit 2011 zu sehen sein wird, weil leider die Bundeswehr meint mich gebrauchen zu können
|
|
|
|
|
|
|
Ich bin ganz ohne Gegenwehr zum Wehrdienst angetreten.
Wenn ich mir so einige Spacken von damals in Erinnerung rufe, hat das den Leuten auch echt gut bekommen mal von zuhause wegzukommen.
Da gabs welche die jeden Tag Post von Mutti& Verwandschaft bekommen haben.
Ich hab nie Post bekommen
Ich denke gerade in diesen Zeiten würde es vielen Jugendlichen gut tun, mal eine straffe AGA zu durchlaufen und zu lernen was Verantwortung und Authorität bedeutet.
|
|
|
|
|
|
Thema: Gehirnsalat ( wir unter uns ) |