Последней каплей моего терпения стало то, что в последнем из разработанных мной пакете было просто необходимо добавить в контейнер хотя бы один объект прежде, чем этот контейнер добавить ещё куда то. И мне совсем не хотелось городить при этом какие то костыли ломающие простую логику работы с контейнерами.
Вот что я сделал с zope.intid:
- добавил маркер IIntIdsDisabled - объекты с этим интерфейсом игнорируются утилитой;
- сделал отложенную индексацию объектов, которые вызвали исключение NotYet.
Благодаря использования слабых ссылок решилась возможная проблема с утечкой памяти - ссылки из хранилища будут автоматически удаленны питоном в случае если объекты, на которые они ссылаются, будут удаленны (т.е. на них не будет ни одной жесткой ссылки).
После того как я завершил работу у меня возникло недоумение - почему за столько лет существования этой утилиты никто не сделал то же самое?
Я отправил в рассылку zopd-dev запрос на добавление моих изменений в основную ветку - надеюсь что хоть кто-нибудь на него откликнется. А пока что мой форк пакета zope.intid можно взять тут.
PS: более подробно про исключение NotYet и возможные способы борьбы с ним при использовании оригинального zope.intid я писал в заметке "Что такое исключение NotYet и с чем его едят".
Комментариев нет:
Отправить комментарий