Что означает синтаксис декоратора []-esque в Python?

Вот фрагмент кода из TurboGears 1.0.6:

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

Я не могу понять, как размещение списка перед определением функции может повлиять на него.

В строке документации dispatch.generic упоминается:

Обратите внимание, что при использовании более старых версий Python вы должны использовать '[dispatch.generic()]' вместо '@dispatch.generic()'.

Итак, очевидно, это способ получить поведение, подобное декоратору, в версиях Python до декоратора, но как, черт возьми, это может работать?


person Michael Gundlach    schedule 18.12.2008    source источник


Ответы (2)


Синтаксис декоратора предоставляется PyProtocols.

""" Наконец, важно отметить, что эти "волшебные" декораторы используют очень хитрый хак: они злоупотребляют хуком отладчика sys.settrace(), чтобы отслеживать, выполняются ли присваивания. Гвидо смотрит на это очень смутно, но существующая функциональность хука не изменится в 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. реализации. """

person Ed.    schedule 18.12.2008

Ничего загадочного, просто такой синтаксис был раньше.

Парсер изменился, вероятно, потому, что Python Zen утверждает, что «перед лицом двусмысленности откажитесь от искушения угадать».

[] должен быть только для списка, и он есть.

person e-satis    schedule 18.12.2008
comment
Я смотрю код, который анализирует мой парсер Python 2.5. Когда я пытаюсь использовать этот стиль синтаксиса для объявления декоратора в python, он просто создает объект списка с одним элементом. Какая версия Python использовала этот синтаксис? Где я могу увидеть документацию? - person Michael Gundlach; 19.12.2008
comment
-1, это внешняя реализация для более старых версий Python, но синтаксис не тот. - person orip; 19.12.2008