Я давно находил дизайн и реализацию weakref.proxy
несколько шаткими. Свидетель ...:
>>> import weakref
>>> ob=set(range(23))
>>> rob=weakref.proxy(ob)
>>> rob==ob
False
>>> rob.__eq__(ob)
True
... Определенно своеобразно! На практике то, что я использую из weakref
, - это словари со слабым ключом или иногда со слабым значением; но weakref.ref
выше, чем прокси-оболочка поверх него:
>>> wr=weakref.ref(ob)
>>> wr()==ob
True
Необходимость «вызова» ссылки для получения объекта (или None, если объект с тех пор исчез), к сожалению, делает его непрозрачным (поэтому модуль API БД не мог этого сделать, оставаясь совместимым с API). Я не понимаю, почему MySqlDb вообще хочет слабую ссылку на курсор -> соединение, но если они это делают, я понимаю, почему они чувствовали, что им нужно использовать прокси, а не ссылки. Однако за эту прозрачность платят очень высокую цену!
Кстати, «явный __eq__
» трюк (или эквивалентный с __cmp__
, в зависимости от типа базового объекта) может вам помочь, даже если он определенно не элегантен!