Python 2 & 3, ohne Importe, filtern Objekte nach ihrer Adresse
Kurz gesagt: Lösungen:
Rückgabe dict {Attributname: Attributwert} , gefilterte Objekte. dh{'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)}
Rückgabeliste [Attributnamen] , gefilterte Objekte. dh['a', 'b', 'c', 'd']
[k for k, val in self.__dict__.items() if not str(hex(id(val))) in str(val)]
Rückgabeliste [attribute_values] , gefilterte Objekte. dh[1, (2, 2), [3, 3], {4: 4}]
[val for k, val in self.__dict__.items() if not str(hex(id(val))) in str(val)]
Objekte nicht filtern
ifZustand entfernen . Rückkehr{'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()}
Lösung in langer Zeit
Solange die Standardimplementierung von __repr__nicht überschrieben wird, wird die ifAnweisung zurückgegeben, Truewenn sich die hexadezimale Darstellung der Position im Speicher von valin der __repr__Rückgabezeichenfolge befindet.
In Bezug auf die Standardimplementierung von __repr__könnten Sie diese Antwort nützlich finden . Zusamenfassend:
def __repr__(self):
return '<{0}.{1} object at {2}>'.format(
self.__module__, type(self).__name__, hex(id(self)))
Wich gibt einen String zurück wie:
<__main__.Bar object at 0x7f3373be5998>
Der Speicherort jedes Elements wird über die id()Methode ermittelt.
Python Docs sagt über id ():
Geben Sie die "Identität" eines Objekts zurück. Dies ist eine Ganzzahl, die für dieses Objekt während seiner Lebensdauer garantiert eindeutig und konstant ist. Zwei Objekte mit nicht überlappenden Lebensdauern können denselben id () -Wert haben.
CPython-Implementierungsdetail: Dies ist die Adresse des Objekts im Speicher.
Versuchen Sie es selbst
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())
Ausgabe:
{'a': 1, 'c': [3, 3], 'b': (2, 2), 'd': {4: 4}}
Hinweis :