Python3 Implementation in Haskell
Der Interpreter übersetzt den Python Code in Haskell Code. Diesen kann man dann mit GHCi interpretiert laufen lassen, oder mit einem Compiler in Maschinen Code übersetzten.
Tornado 1.0
Vor zwei Wochen noch hatte ich im Issue-Tracker ein Kommentar geschrieben und gefragt, wie es mit der 0.3er Version aussieht. Die Version 0.2 war immerhin bereits 9 Monate alt. Nun erfolgte diese Woche der Sprung von 0.2 auf 1.0.
Das Archlinux Package im AUR ist bereits geupdated. Auf dem Server werde ich das Update nächste Woche oder so einspielen. Mal sehen ob der Blog dann noch funktioniert.
Neues an der Python Front
- Jinja 2.4 wurde veröffentlicht - Precomipled Templates klingt relativ interessant.
- Python 2.7 beta 1 veröffentlicht
- Flask 0.1 - Noch ein Python Webframework - basierend auf Werkzeug. Sieht auf den ersten Blick ganz gut aus. Ist anscheinend aus einem April Scherz heraus entstanden.
Python Unterricht bei Google
Keine Ahnung ob das was taugt. Bin noch nicht dazu gekommen mir das näher anzusehen.
Entity Framework, Objekte von einem Context/Entities-Instanz zu einer zweiten kopieren
Vielleicht habe ich ja irgendwelche .NET Experten die sich bereits mit dem Entity Framework auseinandergesetzt haben unter meinen Lesern. Ich bin auf der suche nach einem Äquivalent zu folgendem Python Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | #!/usr/bin/env python # -*- coding: utf-8 -*- from sqlalchemy import create_engine, Table, Column, Integer, Unicode, MetaData from sqlalchemy.orm import sessionmaker, mapper e1 = create_engine('sqlite:///:memory:', echo=True) e2 = create_engine('sqlite:///:memory:', echo=True) metadata = MetaData() users_table = Table('users', metadata, Column('id', Integer, primary_key=True, autoincrement=True), Column('name', Unicode(40)) ) metadata.create_all(e1) metadata.create_all(e2) class User(object): def __init__(self, name): self.name = name def __repr__(self): return u'<User(%s)>' % (self.name) mapper(User, users_table) Session1 = sessionmaker(bind=e1) Session2 = sessionmaker(bind=e2) session1 = Session1() session2 = Session2() u1 = User('foo') u2 = User('bar') session1.add(u1) session1.add(u2) session1.commit() u1 = session1.query(User).get(1) u2 = session1.query(User).get(2) session2.merge(u1) session2.merge(u2) print session1.query(User).all() print session2.query(User).all() |
Speziell die Merge Funktion fehlt beim Entity Framework. Ich kann zwar .Detach() und .Attach() ausführen, aber dadurch wird das Object/Entity leider nicht in der zweiten Datenbank erstellt.
SqlAlchemy gotcha order_by desc
Ich fand in SqlAlchemy anfangs keine Möglichkeit ein simples order_by foo desc auszuführen. In der Query Dokumentation und auch in der ORM Doku war da einfach nichts zu finden. Also wurde ich kreativ und fügte [:-11:-1] zu Session.query(Post).order_by(Post.pub_date) hinzu. Das drehte mir zwar mein Ergebnis so um wie ich das wollte. Allerdings wurde das Limit 10 nicht im Sql-Query ausgeführt sondern erst danach pythonisch. Das ist hat auf die Performance natürlich nicht so tolle Auswirkungen.
Nun bin ich heute aber zufällig auf die desc Funktion in der SqlSoap Doku aufmerksam geworden.
1 2 3 | >>> from sqlalchemy import or_, and_, desc >>> where = or_(db.users.name=='Bhargan Basepair', db.users.email=='student@example.edu') >>> db.users.filter(where).order_by(desc(db.users.name)).all() |
Von ~10 req/sec auf ~30 req/sec. Abend gerettet. Nun habe ich mir mein Bier verdient.
Tags
Ich muss sagen SqlAlchemy gefällt mir immer noch besser.
Gut, ich hatte zuvor eine Weile mit Microsofts Entity Framework gearbeitet. Vielleicht habe ich deshalb meine Ansprüche weit nach unten reguliert.
Jedenfalls kann ich nun meinen Beiträgen wieder Tags zuweisen. Auch wenn ich von dieser Funktion vielleicht nicht all zu oft Gebrauch mache.
Kurzer Python Rant
Da fügen die mit 2.6 so tolle Keywords wie with ein, vergessen dann aber so Module wie gzip oder tarfile entsprechend anzupassen. Wenigstens gibt es die entsprechenden Bugreports. Die wohl aber erst mit Version 2.7 geschlossen werden sollen.
Abgesehen davon ist Python natürlich toll.
Google will Python bis zu 5x schneller machen
Na dann viel Erfolg.
Ipython und Gvim - synchronisation
Als Python-Entwickler testet man öfters mal bestimmte Codestücke in der Python-Konsole, oder noch besser in Ipython. Ipython ist eine verbesserte Python Konsole, die so kleine Nettigkeiten wie etwa die Tab-Vervollständigung mitliefert.

Außerdem lassen sich in Ipython sogenannte Magic-Befehle verwenden. So lässt sich mit %edit blubb.py eine Datei im $EDITOR öffnen. Das Problem dabei ist allerdings, dass man nicht auf das was man im Editor geschrieben hat zugreifen kann. Abhilfe schafft da die ipy_vimserver Extension.
Damit man diese verwenden kann muss man noch dieses kleine Vim-Addon unter .vim/after/ftplugin/python ablegen.
Anschließend öffnet man IPython und aktiviert die Extension:
1 2 | import ipy_vimserver ipy_vimserver.setup('myinstancename') |
Alternativ kann man das auch in ~/.ipython/ipy_user_conf.py fix hinterlegen, damit das bei jedem Start von IPython ausgeführt wird.
Nun erhält man zusätzlich zu %edit den %vim filename Befehl. Dieser öffnet eine neue Gvim Instanz mit der angegebenen Datei. Drückt man nun F5 so wird der Quellcode in Ipython ausgeführt und anschließend kann man in der Ipython Konsole auch auf alle in der mit %vim geöffneten Datei definierten Methoden und Klassen zugreifen.
Kleiner Hinweis: Hat man F5 bereits gemappt, wird das nicht funktionieren. Entweder man ändert das Mapping in ipy.vim oder man führt den Befehl via :python run_this_file() aus.