这是TurboGears 1.0.6中的一段代码:
[dispatch.generic(MultiorderGenericFunction)] def run_with_transaction(func, *args, **kw): pass
我无法弄清楚如何在函数定义之前放置列表可能会影响它.
在dispatch.generic的docstring中,它提到:
请注意,使用较旧的Python版本时,必须使用'[dispatch.generic()]'而不是'@ dispatch.generic()'.
好的,所以它显然是一种在预装饰器版本的Python中获得类似装饰器的行为的方法,但它是如何工作的呢?
装饰器语法由PyProtocols提供.
""最后,重要的是要注意这些"魔术"装饰者使用非常偷偷摸摸的黑客:他们滥用sys.settrace()调试器钩子来跟踪是否正在进行任务.Guido对此有一个非常暗淡的看法,但是hook的现有功能在2.2,2.3或2.4中不会改变,所以不要太担心它.这真的是一个获得装饰器"早期访问"的技巧,2.4生命周期将足够长为了让我们的代码切换到2.4语法.在Python 2.5或2.6的某处,add_assignment_advisor()可以删除魔术部分,只是对使用它的装饰器的向后兼容包装.""" http://dirtsimple.org/ 2004/11 /使用-24-装饰与- 22 -和- 23.html
所以听起来这些工作是通过将实际的装饰器包装在一些魔术中来挂钩到调试器的特殊代码中来操纵实际为该函数分配的内容.
python文档说这是关于settrace的
""注意settrace()函数仅用于实现调试器,分析器,覆盖工具等.它的行为是实现平台的一部分,而不是语言定义的一部分,因此可能并非在所有Python中都可用.实现."""