Кроме синтаксического сахара, ссылка const
указатель ( не указатель на const
). Необходимо установить то, что это отсылает к тому, когда Вы объявляете ссылочную переменную, и Вы не можете изменить его позже.
Обновление: теперь, когда я думаю об этом еще немного, существует важное различие.
цель указателя константы А может быть заменена путем взятия ее адреса, и использование константы бросило.
цель ссылки А не может быть заменена всегда за исключением UB.
Это должно разрешить компилятору делать больше оптимизации на ссылке.
Хотя вы не объясняете, что означает «поставить на колени», я предполагаю, что у вас закончилась память. Если это так, вероятно, дело в том, что сценарий не фиксирует изменения на диске. Добавление transaction.commit () в цикл (желательно с тестом, выполняющим только каждый сотый или 1000-й раз) должно исправить это.
Изменить: Итак, я был неправ, это не было проблемой памяти. Похоже, программа обновления архетипов поступает правильно.
Покопавшись в коде каталога 2.5, я наконец нашел ответ на ленивое обновление схемы:
if not self._isSchemaCurrent():
logging.debug("updating schema for %s"%self.absolute_url())
try:
import transaction
transaction.begin()
self._updateSchema()
transaction.commit()
except Exception, e:
logging.error('Error updating schema at %s: %s'%(self.absolute_url(), e))
return False
else:
logging.debug("schema for %s is up to date"%self.absolute_url())
return True
Обратите внимание, что это Plone 2.5.3 и из того, что я копал через plone 3 выглядит немного иначе. Для некоторых объектов, для которых я уже настроил processForm, я выполняю обновление там, чтобы форма могла отображать новое поле и обрабатываться. Для других просто в ловушке at_post_edit_script, поскольку у них обычно нет мега важных обновлений схемы. Кроме того, обработка форм в любом случае является самой медленной частью сайта, поэтому взаимодействие с пользователем не сильно сказывается.
Это хакерский метод, но он не вызывает лишних затрат на ввод-вывод и работает со всеми версиями объектов. Я возьму!