Python 2 & 3, sans importations, filtrage des objets par leur adresse
Solutions en bref:
Renvoie dict {nom_attribut: valeur_attribut} , objets filtrés. c'est à dire{'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)}
Liste de retour [nom_attribut] , objets filtrés. c'est à dire['a', 'b', 'c', 'd']
[k for k, val in self.__dict__.items() if not str(hex(id(val))) in str(val)]
Liste de retour [valeur_attribut] , objets filtrés. c'est à dire[1, (2, 2), [3, 3], {4: 4}]
[val for k, val in self.__dict__.items() if not str(hex(id(val))) in str(val)]
Ne pas filtrer les objets
Suppression de la if
condition. Revenir{'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()}
Solution en long
Tant que l'implémentation par défaut de __repr__
n'est pas remplacée, l' if
instruction retournera True
si la représentation hexadécimale de l'emplacement en mémoire de val
est dans la __repr__
chaîne de retour.
Concernant l'implémentation par défaut de, __repr__
vous pourriez trouver utile cette réponse . En bref:
def __repr__(self):
return '<{0}.{1} object at {2}>'.format(
self.__module__, type(self).__name__, hex(id(self)))
Qui renvoie une chaîne comme:
<__main__.Bar object at 0x7f3373be5998>
L'emplacement en mémoire de chaque élément est obtenu via la id()
méthode.
Python Docs dit à propos de id ():
Renvoie «l'identité» d'un objet. Il s'agit d'un entier garanti unique et constant pour cet objet pendant sa durée de vie. Deux objets dont les durées de vie ne se chevauchent pas peuvent avoir la même valeur id ().
Détail de l'implémentation CPython: il s'agit de l'adresse de l'objet en mémoire.
Essayez par vous-même
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())
Production:
{'a': 1, 'c': [3, 3], 'b': (2, 2), 'd': {4: 4}}
Remarque :