【问题标题】:What does the []-esque decorator syntax in Python mean?Python 中的 []-esque 装饰器语法是什么意思?
【发布时间】:2010-09-27 14:46:32
【问题描述】:

这是 TurboGears 1.0.6 中的一段代码:

[dispatch.generic(MultiorderGenericFunction)]
def run_with_transaction(func, *args, **kw):
    pass

我不知道在函数定义之前放置一个列表会如何影响它。

在 dispatch.generic 的文档字符串中,它提到:

请注意,在使用较旧的 Python 版本时,您必须使用 '[dispatch.generic()]' 而不是 '@dispatch.generic()'。

好的,所以它显然是一种在 Python 的预装饰器版本中获得类似装饰器的行为的方法,但它到底是如何工作的呢?

【问题讨论】:

    标签: python syntax decorator


    【解决方案1】:

    装饰器语法由 PyProtocols 提供。

    """ 最后,需要注意的是,这些“魔法”装饰器使用了一种非常狡猾的技巧:它们滥用 sys.settrace() 调试器钩子来跟踪分配是否正在发生。 Guido 对此持非常模糊的看法,但钩子的现有功能在 2.2、2.3 或 2.4 中不会发生变化,所以不要太担心。这确实是一个“早期访问”装饰器的技巧,并且 2.4 的生命周期足够长,可以让我们的代码切换到 2.4 语法。在 Python 2.5 或 2.6 左右的某个地方, add_assignment_advisor() 可以放弃神奇的部分,而只是使用它的装饰器的向后兼容性包装器。 """ http://dirtsimple.org/2004/11/using-24-decorators-with-22-and-23.html

    所以听起来这些工作是通过将实际的装饰器包装在一些魔术中,这些魔术挂钩到特殊的代码中,以便调试器操纵实际分配给函数的内容。

    python 文档是这样说 settrace 的

    """ 笔记 settrace() 函数仅用于实现调试器、分析器、覆盖工具等。它的行为是实现平台的一部分,而不是语言定义的一部分,因此可能并非在所有 Python 实现中都可用。 """

    【讨论】:

      【解决方案2】:

      没什么神秘的,就是以前的语法。

      解析器发生了变化,可能是因为 Python Zen 声称“面对歧义,拒绝猜测的诱惑。”。

      [] 应该只用于列表,有它。

      【讨论】:

      • 我正在查看我的 Python 2.5 解析器正在解析的代码。当我尝试使用这种语法风格在 python 中声明一个装饰器时,它只是创建一个包含一个项目的列表对象。哪个版本的 Python 使用了这种语法?在哪里可以查看文档?
      • -1,它是旧 Python 版本的外部实现,但不是语法。
      猜你喜欢
      • 2013-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-02
      • 1970-01-01
      • 2015-09-21
      • 2014-03-31
      相关资源
      最近更新 更多