Python中的[] -esque装饰器语法是什么意思?

时间:2008-12-18 21:14:05

标签: python syntax decorator

以下是TurboGears 1.0.6中的一段代码:

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

我无法弄清楚如何在函数定义之前放置列表可能会影响它。

在dispatch.generic的docstring中,它提到:

  

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

好的,所以它显然是一种在预装饰器版本的Python中获得类似装饰器的行为的方法,但它有多可能起作用呢?

2 个答案:

答案 0 :(得分:11)

装饰器语法由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 docs关于settrace

这么说

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

答案 1 :(得分:-2)

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

解析器已经改变,可能是因为Python Zen声称“面对模棱两可,拒绝猜测的诱惑。”

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