Python: разыменование слабого прокси

Есть ли способ получить исходный объект из слабого прокси, указывающего на него? например, есть ли обратная сторона weakref.proxy()?

Упрощенный пример (python2.7):
import weakref

class C(object):
    def __init__(self, other):
        self.other = weakref.proxy(other)

class Other(object):
    pass

others = [Other() for i in xrange(3)]

my_list = [C(others[i % len(others)]) for i in xrange(10)]

Мне нужно получить список уникальных другихчленов из my_list. Способ, который я предпочитаю для таких задач использовать set:

unique_others = {x.other for x in my_list}

К сожалению, это выдает TypeError: unhashable type: 'weakproxy'

Мне удалось решить конкретную проблему императивным способом (медленно и грязно):
unique_others = []
for x in my_list:
    if x.other in unique_others:
        continue
    unique_others.append(x.other)

, но общая проблема, отмеченная в заголовке, все еще активна. Что делать, если у меня под контролем только my_list, а другиезарыты в какую-то либу и кто-то может удалить их в любой момент, а я хочу предотвратить удаление, собрав nonweakссылок в списке?

Или я могу захотеть получить repr()самого объекта, а не <weakproxy at xx to Other at xx> Думаю, должно быть что-то вроде weakref.unproxy, о котором я не знаю.
11
задан robyschek 20 April 2012 в 12:19
поделиться