2010-10-06 2 views
4

В моем проекте я должен придерживаться Python 2.5 (Google App Engine). Где-то в приложении (на самом деле фреймворк) я должен отслеживать, какие переменные определены и в каком порядке они определены, другими словами, я хотел бы перехватывать всякий раз, когда обрабатывается оператор присваивания.Есть ли способ эмулировать специальный метод __prepare__ для 3-метакласса Python в Python 2.5?

Используя Python 3, я бы определил метакласс M с методом __prepare__, который возвращает интеллектуальный словарь, который отслеживает, когда к нему обращаются. Затем мне просто нужно выполнить все внутри инструкции класса с метакласом M.

Есть ли способ подражать этому в Python 2.5?

Пример того, что я хотел бы достичь

С метаклассом подхода Python 3, я мог бы реализовать переменные, которые работают как ссылки, например, M может быть так, что

# y is a callable 
class C(metaclass=M): 
    x = ref(y) 
    x = 1 

бы быть эквивалентным (вплоть до создания C) с y(1), то есть первое присвоение переменной в словаре C черным ящиком ref создает эту переменную. Дальнейшие назначения просто вызывают параметр ref ref.

+0

Я немного смущен. Вы хотите только выполнить назначения в инструкции класса, чтобы отслеживать порядок или действительно хотите получить полученный класс? – aaronasterling

+0

@Aaron: Меня интересует только то, как заполняется словарь, а не в результате создания соответствующего класса. Используя специальный метод __new__, я могу даже пропустить создание результирующего класса, который уже работает в Python 2.5. Однако я мог бы использовать __new__, чтобы сообщить о моем словаре (в случае, если он создан в __prepare__). Классы метакласса M тогда будут словарями, а не классами. – Marc

+0

- это распоряжение об изгнании нашего? Я действительно не могу придумать способ сделать это, хотя это интересный вопрос. – aaronasterling

ответ

-1

Чтобы начать поиск, просмотрите PEP-3115 и прочитайте о «текущем» поведении, например. поведение, которое было актуальным до реализации Python 3.

3

Вы можете обертывать переменные, заполняющие ваши классы, оболочкой, которая внутренне хранит счетчик и присваивает возрастающее значение. Обертка может быть подклассифицирована для пометки или для добавления поведения к переменным. Вы должны использовать значение переменной для их заказа и обычный метаклас Python 2 для перехвата создания класса.

Django является одним из проектов, который использует эту технику, чтобы запомнить порядок, в котором члены определены в классе модели. Вы можете взглянуть на where the fields are created; он затем используется при реализации метода cmp, чтобы сохранить поля в порядке их создания.

+0

Большое спасибо за указание на технику, используемую Django. Это решит мою проблему с относительным порядком присвоений. Однако он не решает сохранить отслеживаемые переменные. Я отредактирую свой вопрос, чтобы в этот момент сделать это ясно. – Marc

Смежные вопросы