Python 2 e 3, senza importazioni, filtrando gli oggetti in base al loro indirizzo
Soluzioni in breve:
Restituisce dict {nome_attributo: valore_attributo} , oggetti filtrati. vale a 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)}
Elenco di restituzione [nome_attributo] , oggetti filtrati. vale a dire['a', 'b', 'c', 'd']
[k for k, val in self.__dict__.items() if not str(hex(id(val))) in str(val)]
Elenco di restituzione [valori_attributo] , oggetti filtrati. vale a 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)]
Non filtra gli oggetti
Rimozione della if
condizione. Ritorno{'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()}
Soluzione a lungo
Fintanto che l'implementazione predefinita di __repr__
non è sovrascritta, l' if
istruzione restituirà True
se la rappresentazione esadecimale della posizione in memoria di val
è nella __repr__
stringa di ritorno.
Per quanto riguarda l'implementazione predefinita di __repr__
te potrebbe trovare utile questa risposta . In breve:
def __repr__(self):
return '<{0}.{1} object at {2}>'.format(
self.__module__, type(self).__name__, hex(id(self)))
Che restituisce una stringa come:
<__main__.Bar object at 0x7f3373be5998>
La posizione in memoria di ogni elemento viene ottenuta tramite il id()
metodo.
Python Docs dice di id ():
Restituisce l '“identità” di un oggetto. Questo è un numero intero che è garantito per essere unico e costante per questo oggetto durante la sua vita. Due oggetti con durate non sovrapposte possono avere lo stesso valore id ().
Dettagli sull'implementazione di CPython: questo è l'indirizzo dell'oggetto in memoria.
Prova da solo
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())
Produzione:
{'a': 1, 'c': [3, 3], 'b': (2, 2), 'd': {4: 4}}
Nota :