python - microsoft - visual studio installer
¿Es posible desreferenciar las identificaciones variables? (5)
Aquí hay otra respuesta adaptada de otro comentario , este de "Peter Fein", en la discusión que Hophat Abc mencionó en su propia respuesta a su propia pregunta.
Aunque no es una respuesta general, pero podría ser útil en casos en que sepa algo sobre la clase de objetos cuyos identificadores desea buscar, en lugar de ser los identificadores de cualquier cosa . La idea básica es crear una clase que realice un seguimiento de instancias y subclases de sí mismo. Sentí que esta podría ser una técnica que vale la pena incluso con esa limitación.
import weakref
class InstanceTracker(object):
""" base class that tracks instances of its subclasses using weakreferences """
class __metaclass__(type):
""" Metaclass for InstanceTracker """
def __new__(cls, name, bases, dic):
cls = super(cls, cls).__new__(cls, name, bases, dic)
cls.__instances__ = weakref.WeakValueDictionary()
return cls
def __init__(self, *args, **kwargs):
self.__instances__[id(self)]=self
super(InstanceTracker, self).__init__(*args, **kwargs)
@classmethod
def find_instance(cls, obj_id):
return cls.__instances__.get(obj_id, None)
if __name__ == ''__main__'':
class MyClass(InstanceTracker):
def __init__(self, name):
super(MyClass, self).__init__()
self.name = name
def __repr__(self):
return ''{}({!r})''.format(self.__class__.__name__, self.name)
obj1 = MyClass(''Bob'')
obj2 = MyClass(''Sue'')
print MyClass.find_instance(id(obj1))
print MyClass.find_instance(id(obj2))
print MyClass.find_instance(42)
Salida:
MyClass(''Bob'')
MyClass(''Sue'')
None
Esta pregunta ya tiene una respuesta aquí:
- Obtener objeto por id ()? 7 respuestas
¿Puede desreferenciar una identificación de variable recuperada de la función de id
en Python? Por ejemplo:
dereference(id(a)) == a
Quiero saber desde un punto de vista académico; Entiendo que hay más métodos prácticos.
El módulo di tiene una función C que le permite hacer esto siempre que el objeto no haya sido recolectado basura: http://www.friday.com/bbum/2007/08/24/python-di/
No es fácil.
Podría recurse a través de la lista gc.get_objects()
, probando todos y cada uno de los objetos si tiene el mismo id()
pero eso no es muy práctico.
La función id()
no está destinada a ser eliminada. el hecho de que se basa en la dirección de memoria es un detalle de implementación de CPython, que otras implementaciones de Python no siguen.
Hay varias formas y no es difícil de hacer:
En O (n)
In [1]: def deref(id_):
....: f = {id(x):x for x in gc.get_objects()}
....: return f[id_]
In [2]: foo = [1,2,3]
In [3]: bar = id(foo)
In [4]: deref(bar)
Out[4]: [1, 2, 3]
Una manera más rápida en promedio, a partir de los comentarios (gracias @Martijn Pieters):
def deref_fast(id_):
return next(ob for ob in gc.get_objects() if id(ob) == id_)
La solución más rápida está en la respuesta de @martineau, pero requiere exponer las partes internas de Python. Las soluciones anteriores usan construcciones python estándar.
Aquí hay una función de utilidad basada en un comentario hecho por "Tiran" en la discusión referenciada por Hophat Abc que funcionará tanto en Python 2 como en 3:
import _ctypes
def di(obj_id):
""" Inverse of id() function. """
return _ctypes.PyObj_FromPtr(obj_id)
if __name__ == ''__main__'':
a = 42
b = ''answer''
print(di(id(a))) # -> 42
print(di(id(b))) # -> answer