Python 2 y 3, sin importaciones, filtrando objetos por su dirección
Soluciones en resumen:
Devuelve dict {attribute_name: attribute_value} , objetos filtrados. es decir{'a': 1, 'b': (2, 2), 'c': [3, 3]}
{k: val for k, val in self.__dict__.items() if not str(hex(id(val))) in str(val)}
Lista de devolución [nombre_atributo] , objetos filtrados. es decir['a', 'b', 'c', 'd']
[k for k, val in self.__dict__.items() if not str(hex(id(val))) in str(val)]
Lista de devolución [atributo_valores] , objetos filtrados. es decir[1, (2, 2), [3, 3], {4: 4}]
[val for k, val in self.__dict__.items() if not str(hex(id(val))) in str(val)]
Sin filtrar objetos
Eliminando la if
condición. Regreso{'a': 1, 'c': [3, 3], 'b': (2, 2), 'e': <function <lambda> at 0x7fc8a870fd70>, 'd': {4: 4}, 'f': <object object at 0x7fc8abe130e0>}
{k: val for k, val in self.__dict__.items()}
Solución en largo
Siempre que __repr__
no se anule la implementación predeterminada de, la if
declaración regresará True
si la representación hexadecimal de la ubicación en la memoria de val
está en la __repr__
cadena de retorno.
Con respecto a la implementación predeterminada de __repr__
, podría encontrar útil esta respuesta . En breve:
def __repr__(self):
return '<{0}.{1} object at {2}>'.format(
self.__module__, type(self).__name__, hex(id(self)))
Que devuelve una cadena como:
<__main__.Bar object at 0x7f3373be5998>
La ubicación en la memoria de cada elemento se obtiene mediante el id()
método.
Python Docs dice sobre id ():
Devuelve la "identidad" de un objeto. Este es un número entero que se garantiza que es único y constante para este objeto durante su vida útil. Dos objetos con vidas útiles que no se superponen pueden tener el mismo valor de id ().
Detalle de implementación de CPython: esta es la dirección del objeto en la memoria.
Pruébelo usted mismo
class Bar:
def __init__(self):
self.a = 1
self.b = (2, 2)
self.c = [3, 3]
self.d = {4: 4}
self.e = lambda: "5"
self.f = object()
#__str__ or __repr__ as you prefer
def __str__(self):
return "{}".format(
# Solution in Short Number 1
{k: val for k, val in self.__dict__.items() if not str(hex(id(val))) in str(val)}
)
# Main
print(Bar())
Salida:
{'a': 1, 'c': [3, 3], 'b': (2, 2), 'd': {4: 4}}
Nota :