Могут ли "мягкие ссылки" существовать в Python? - PullRequest
9 голосов
/ 07 сентября 2011

В других языках (например, Java) ссылки на объекты могут быть сильными, слабыми, мягкими или фантомными (http://weblogs.java.net/blog/enicholas/archive/2006/05/understanding_w.html).

)

В Python ссылки являются сильными по умолчанию, а модуль WeakRef допускает слабые ссылки.

Возможно ли иметь "мягкие ссылки" в Python?

В моем конкретном случае у меня есть кеш объектов, создание которых занимает много времени. Иногда не может быть никаких ссылок на кэшированный объект, но я не хочу выбрасывать кэшированный объект, если мне не нужно (то есть, если памяти много).

Ответы [ 2 ]

6 голосов
/ 07 сентября 2011

Python изначально не предлагает никаких разновидностей ссылок, кроме жестких (или сильных) и слабых.

Тем не менее, здесь - это реализация softref, которую я выкинул год назад или около того, которую я использовал в нескольких местах, где мне это было нужно.То, что он предоставляет, не является вполне реальными программными ссылками, но оно подходит для большинства случаев использования.Это немного грубо по краям, но полностью функционально ... хотя оно полагается на внутренний подсчет ссылок, что означает, что он, вероятно, сломается на чем угодно, кроме CPython.

В частности, я написал это точно длякеш дорогих в создании долгоживущих объектов ... SoftValueDictionary должен быть именно тем, что вы ищете.

0 голосов
/ 19 сентября 2011

Другой вариант - использовать кеш, который поддерживает определенное количество объектов (например, 100), а не явно вычислять их потребление памяти.Когда к объекту обращаются, он помещается в верхнюю часть кэша, если он существует, или объект в нижней части кэша заменяется новым объектом.

Не проверено, но это должно работать теоретически.

...