Python 2 i 3, bez importu, filtrując obiekty według ich adresów
Rozwiązania w skrócie:
Zwróć dict {nazwa_atrybutu: wartość_atrybutu} , obiekty przefiltrowane. to znaczy{'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 zwrotów [nazwy_ atrybutów] , przefiltrowane obiekty. to znaczy['a', 'b', 'c', 'd']
[k for k, val in self.__dict__.items() if not str(hex(id(val))) in str(val)]
Lista zwrotów [atrybuty_wartości] , obiekty przefiltrowane. to znaczy[1, (2, 2), [3, 3], {4: 4}]
[val for k, val in self.__dict__.items() if not str(hex(id(val))) in str(val)]
Brak filtrowania obiektów
Usuwanie if
warunku. Powrót{'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()}
Rozwiązanie na długi czas
Dopóki realizacja domyślna __repr__
nie jest przesłonięta na if
oświadczenie powróci True
jeśli reprezentacja szesnastkowy umieszczeniem w pamięci val
znajduje się w __repr__
ciąg powrotnej.
Jeśli chodzi o domyślną implementację __repr__
, ta odpowiedź może się przydać . W skrócie:
def __repr__(self):
return '<{0}.{1} object at {2}>'.format(
self.__module__, type(self).__name__, hex(id(self)))
Który zwraca ciąg, taki jak:
<__main__.Bar object at 0x7f3373be5998>
Lokalizację w pamięci każdego elementu uzyskuje się za pomocą id()
metody.
Python Docs mówi o id ():
Zwróć „tożsamość” obiektu. Jest to liczba całkowita, która na pewno będzie niepowtarzalna i stała dla tego obiektu podczas jego życia. Dwa obiekty z nienakładającymi się okresami istnienia mogą mieć tę samą wartość id ().
Szczegóły implementacji CPythona: jest to adres obiektu w pamięci.
Spróbuj sam
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())
Wynik:
{'a': 1, 'c': [3, 3], 'b': (2, 2), 'd': {4: 4}}
Uwaga :