
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 _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

yield und Co. sind doch nicht wirklich das Problem... Das geht ja zu Not mit den __future__ import... Probleme gibt es z.B. bei strip([char]): http://docs.python.org/lib/string-methods.html#l2h-205 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" Changed in version 2.2.2: Support for the chars argument. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" Wie kann man in Python v2.2.1 das chars-Argument "hinzufügen" ??? Ich hab noch http://cheeseshop.python.org/pypi/python23_support gefunden... Das kann das aber u.a. auch nicht: """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" Does not provide: - generator support. This must be done locally in backported scripts by adding 'from __future__ import generators' to the start of the script. - sets (this is done in a separate backported module) - extended slices, s[i:j:step], e.g. a[::2], a[::-1] - extensions to dict (i.e. constructor arguments, d.fromkeys, d.pop) - str.strip(s, chars=None) (but str.strip(s) works fine) - consistent unicode support for filenames used with file objects - importing modules from zip files - any changes in the module library (e.g. shutil.move(src, dest)) """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" Kann ich es also vergessen??? _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Jens Diemer wrote:
Den Schluss würde ich nicht ziehen. Statt dessen würde ich meinen Code so umschreiben, dass er auch mit Python 2.2 funktioniert. - basestring: Keine Ahnung, wozu Du das brauchst, aber man kann es vermutlich durch types.StringTypes ersetzen. - enumerate: Einfach über range(len(collection)) iterieren und Element explizit indizieren Ciao, Martin _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Martin v. Löwis schrieb:
Den Schluss würde ich nicht ziehen. Statt dessen würde ich meinen Code so umschreiben, dass er auch mit Python 2.2 funktioniert.
Ja, das scheint wohl der einzige Weg zu sein. Ich dachte mir, wenn es funktioniert das man die verwendeten neuen Features einfach zur alten Python Version "transferiert" warum nicht das so regeln? Mit den beiden Beispielen (basestring und enumerate) klappt das ja über das __builtin__. Im Forum [1] hat Gromit allerdings erwähnt das es mit Funktionen aus der C-Lib so nicht funktioniert. Also könnte ich das so machen, das ich alle Features, die nicht in einer C-Lib stecken backporte und auf alle anderen muß ich dann wohl verzichten. [1] http://www.python-forum.de/post-36856.html#36856 -- Mfg. Jens Diemer ---- CMS in pure Python CGI: http://www.pylucid.org _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Jens Diemer wrote:
Wenn das tatsächlich ohne semantische Einschränkungen geht, kann man das sicher so machen (wie z.B. bei enumerate). Wenn man aber die Semantik des Features nicht in allen Details "nachbauen" kann, sondern gerade nur so, dass es für den eigenen Code funktioniert (wie z.B. bei basestring), dann ist das gefährlich: Falls man irgendwann "mehr" von dem Feature braucht, fällt nicht so leicht auf, dass das so in Python 2.2 ja gar nicht geht. Ciao, Martin _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

yield und Co. sind doch nicht wirklich das Problem... Das geht ja zu Not mit den __future__ import... Probleme gibt es z.B. bei strip([char]): http://docs.python.org/lib/string-methods.html#l2h-205 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" Changed in version 2.2.2: Support for the chars argument. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" Wie kann man in Python v2.2.1 das chars-Argument "hinzufügen" ??? Ich hab noch http://cheeseshop.python.org/pypi/python23_support gefunden... Das kann das aber u.a. auch nicht: """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" Does not provide: - generator support. This must be done locally in backported scripts by adding 'from __future__ import generators' to the start of the script. - sets (this is done in a separate backported module) - extended slices, s[i:j:step], e.g. a[::2], a[::-1] - extensions to dict (i.e. constructor arguments, d.fromkeys, d.pop) - str.strip(s, chars=None) (but str.strip(s) works fine) - consistent unicode support for filenames used with file objects - importing modules from zip files - any changes in the module library (e.g. shutil.move(src, dest)) """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" Kann ich es also vergessen??? _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Jens Diemer wrote:
Den Schluss würde ich nicht ziehen. Statt dessen würde ich meinen Code so umschreiben, dass er auch mit Python 2.2 funktioniert. - basestring: Keine Ahnung, wozu Du das brauchst, aber man kann es vermutlich durch types.StringTypes ersetzen. - enumerate: Einfach über range(len(collection)) iterieren und Element explizit indizieren Ciao, Martin _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Martin v. Löwis schrieb:
Den Schluss würde ich nicht ziehen. Statt dessen würde ich meinen Code so umschreiben, dass er auch mit Python 2.2 funktioniert.
Ja, das scheint wohl der einzige Weg zu sein. Ich dachte mir, wenn es funktioniert das man die verwendeten neuen Features einfach zur alten Python Version "transferiert" warum nicht das so regeln? Mit den beiden Beispielen (basestring und enumerate) klappt das ja über das __builtin__. Im Forum [1] hat Gromit allerdings erwähnt das es mit Funktionen aus der C-Lib so nicht funktioniert. Also könnte ich das so machen, das ich alle Features, die nicht in einer C-Lib stecken backporte und auf alle anderen muß ich dann wohl verzichten. [1] http://www.python-forum.de/post-36856.html#36856 -- Mfg. Jens Diemer ---- CMS in pure Python CGI: http://www.pylucid.org _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Jens Diemer wrote:
Wenn das tatsächlich ohne semantische Einschränkungen geht, kann man das sicher so machen (wie z.B. bei enumerate). Wenn man aber die Semantik des Features nicht in allen Details "nachbauen" kann, sondern gerade nur so, dass es für den eigenen Code funktioniert (wie z.B. bei basestring), dann ist das gefährlich: Falls man irgendwann "mehr" von dem Feature braucht, fällt nicht so leicht auf, dass das so in Python 2.2 ja gar nicht geht. Ciao, Martin _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
participants (2)
-
"Martin v. Löwis"
-
Jens Diemer