Python 2.5中的类装饰器?

5

有没有办法让类装饰器在仅支持Python 2.5Google App Engine上工作?

或者我可以这样重新表述:是否可能从已经执行的同一进程中更改Python解析器的行为?例如:

good.py:

alter_python_parser()
import bad

bad.py:

@decorated
class Foo(object): pass

或者这根本是不可能的。

说明:我想使用一个第三方库,该库大量使用类装饰器,但我不想分叉它并维护自己的版本。另一种选择是在Typhoon App Engine上运行我的代码,使用更新的Python版本,但我担心Google不会很长时间内升级他们的Python版本...

编辑:

创建一个new-style import hook怎么样?它可以进行即时字符串替换并从内存中加载模块。这应该是可能的。如果没有已经实现的方法,我会试一下。

但是我如何解析Python 2.6+代码以及Python 2.5?有没有仅限于Python的解析器?PYPY使用了什么?

1个回答

9

装饰器仅是语法糖。只需更改装饰器用法的实例,也就是

@decorated
class Foo(object): pass

成为

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

实际上,你无法更改解析器。

但是,您可以使用ast模块(在新版本的Python中)自动化上述过程。


我知道这只是语法糖。但我不想对已经工作的代码进行大规模更改。因此,ast 可能会有所帮助。如果有一个 Python 实现 _ast 模块,我可以使用导入钩子实时完成... - Attila O.
它只能与 ast 模块 2.6 及以上版本一起使用。我怀疑你无法即时完成它。 - dan_waterworth
2
我已经创建了一个导入钩子,它将使用lib2to3中的ast树修复类装饰器:http://pypi.python.org/pypi/seven。顺便说一下。 - Attila O.
恭喜,这是一个令人印象深刻的成就。 - dan_waterworth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接