[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