[Python-de] Backports...
Jens Diemer
python_gmane at jensdiemer.de
Mit Mai 17 15:30:46 CEST 2006
Ich bastle gerade an der neuen PyLucid v0.7, dabei benutzte ich colubrid
und jinja. Ich möchte gern Python v2.2.x unterstützen. Also brauche ich
ein paar Backports einiger neuen Python Features...
Es gibt ja die utils von http://aima.cs.berkeley.edu/python/utils.html
Das blöde ist nur, das man in jeder Datei ein from utils import * machen
muß. Dumm ist, wenn man eh die neuste Version von Python hat und die
ganze Reihe von Tests in in jedem Modul überflüssig sind.
Eine andere Möglichkeit ist __builtin__ zu erweitern. Dann ist nur ein
einmaliger import der Backports nötig und alle Neuerungen sind überall
aktiv. Hier zwei Beispiele:
import __builtin__
try: basestring ## Introduced in 2.3
except NameError:
import types
basestring = (types.StringType, types.UnicodeType)
__builtin__.basestring = basestring
try: enumerate ## Introduced in 2.3
except NameError:
def enumerate(collection):
"""Return an iterator that enumerates pairs of (i, c[i]). PEP 279.
>>> list(enumerate('abc'))
[(0, 'a'), (1, 'b'), (2, 'c')]
"""
## Copied from PEP 279
i = 0
it = iter(collection)
while 1:
yield (i, it.next())
i += 1
__builtin__.enumerate = enumerate
Bevor ich jetzt all die Dinge, die ich selber brauche aus den utils mit
__builtin__ anpasse, wollte ich mal nachfragen, ob es nicht schon sowas
gibt??? Gefunden hab ich nix...
Das Problem sind aber noch die Generatoren... Die gibt es zwar schon in
Python 2.2, aber nur mit einem from __future__ import generators und das
IMHO nur für das aktuelle Modul und nicht global.
z.B. erhalte ich einen SyntaxError bei der Verwendung von yield... yield
ist wohl einer der wenigen Key-Wörter. Somit klappt der Trick mit den
__builtin__.yield = yield nicht...
Wie kann man yield global "aktivieren" ???
Da der import von "from __future__ import *" keine großen
Preformanceeinbussen mit sich bringt, könnte ich das zur not auch in
jeder Datei machen...
Mfg.
Jens