【问题标题】:Class decorators in Python 2.5?Python 2.5 中的类装饰器?
【发布时间】:2010-11-29 19:47:33
【问题描述】:

有没有办法让 类装饰器Google App Engine 上工作,仅限于 Python 2.5

或者让我换个说法:是否可以从它已经执行的同一进程中改变 Python 解析器的行为?示例:

good.py:

alter_python_parser()
import bad

bad.py:

@decorated
class Foo(object): pass

或者这可能是完全不可能的。

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

EDIT:

如何创建一个new-style import hook 来进行即时字符串替换并从内存中加载模块?这应该是可能的。如果还没有实现,我会试一试。

但是如何从Python 2.5 解析Python 2.6+ 代码?是否有仅限 python 的解析器? PYPY 有什么用?

【问题讨论】:

    标签: python google-app-engine python-2.5


    【解决方案1】:

    装饰器只是语法糖。只需更改装饰器使用的实例,即

    @decorated
    class Foo(object): pass
    

    变成

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

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

    不过,您可以使用ast module(在新版本的 Python 中)自动执行上述过程。

    【讨论】:

    • 我知道这只是语法糖。但我不想对已经有效的代码进行大量更改。所以,ast 可能会有所帮助。如果有 _ast 模块的 Python 实现,我也许可以使用导入钩子即时执行...
    • 它只适用于 2.6 以上版本的 ast 模块。我怀疑你是否能够即时完成。
    • jfyi,我创建了一个导入钩子,它将使用来自lib2to3ast 树修复类装饰器:pypi.python.org/pypi/seven
    • 恭喜,这是一个了不起的成就。
    猜你喜欢
    • 2019-09-20
    • 2010-10-14
    • 2011-04-28
    • 2012-02-09
    • 2013-10-30
    • 2014-02-16
    • 2015-08-21
    • 1970-01-01
    相关资源
    最近更新 更多