visual studio microsoft español descargar community python memory dereference

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í:

¿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.



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