2010-11-29 4 views
5

Y at-il une manière que je peux faire décorateurs de classe travail sur Google App Engine, qui se limite à Python 2.5?Décorateurs de classe en Python 2.5?

Ou laissez-moi reformuler: est-il possible de modifier le comportement de l'analyseur de Python à partir du même processus qui est déjà en cours d'exécution? Exemple:

good.py:

alter_python_parser() 
import bad 

bad.py:

@decorated 
class Foo(object): pass 

Ou est-ce peut-être juste simplement impossible.

Explication: Je veux utiliser une bibliothèque tierce partie qui utilise beaucoup de décorateurs de classe, et ne veulent pas à la fourchette et maintenir ma propre version. Une alternative serait d'exécuter mon code sur Typhoon App Engine avec un python plus récent, mais je crains que Google ne sera pas mise à jour leur version de Python pour un temps looooooongues ...

EDIT:

Que diriez-vous de créer un new-style import hook qui ferait la substitution de chaîne à la volée et charger le module de la mémoire? Cela devrait être possible. Je vais essayer, s'il n'y a pas encore de mise en œuvre.

Mais comment puis-je analyser le code Python 2.6+ de Python 2.5? Y a-t-il un analyseur python seulement? Que utilise PYPY?

Répondre

9

Décorateurs ne sont que du sucre syntaxique. Il suffit de changer les cas d'utilisation de décorateur, qui est,

@decorated 
class Foo(object): pass 

devient

class Foo(object): pass 
Foo = decorated(Foo) 

Vous ne pouvez pas, de façon réaliste, changer l'analyseur.

Bien, vous pouvez automatiser le processus ci-dessus à l'aide du ast module (dans une nouvelle version de Python).

+0

Je sais que c'est que le sucre syntaxique. Mais je ne veux pas maintenir des changements massifs au code qui fonctionne déjà. Donc, 'ast' aiderait probablement. S'il y aurait une implémentation Python du module '_ast', je pourrais peut-être le faire à la volée avec un hook d'import ... –

+0

Cela ne fonctionnera qu'avec le module ast au dessus de la version 2.6. Je doute que tu sois capable de le faire à la volée. –

+0

D'accord; Je vais essayer. –

Questions connexes