Что означает синтаксис декоратора [] в Python? - PullRequest
8 голосов
/ 19 декабря 2008

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

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

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

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

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

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

Ответы [ 2 ]

11 голосов
/ 19 декабря 2008

Синтаксис декоратора предоставляется 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 () предназначена только для реализации отладчиков, профилировщиков, инструментов покрытия и тому подобного. Его поведение является частью платформы реализации, а не частью определения языка, и поэтому может быть доступно не во всех реализациях Python. "" "

0 голосов
/ 19 декабря 2008

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

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

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

...