Python 2 & 3, без імпорту, фільтруючи об'єкти за їх адресою
Коротше рішення:
Повернення диктату {attribute_name: attribute_value} , об'єкти відфільтровані. тобто{'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)}
Повернення списку [атрибут_імена] , об'єкти відфільтровані. тобто['a', 'b', 'c', 'd']
[k for k, val in self.__dict__.items() if not str(hex(id(val))) in str(val)]
Повернення списку [attribute_values] , об'єкти відфільтровані. тобто[1, (2, 2), [3, 3], {4: 4}]
[val for k, val in self.__dict__.items() if not str(hex(id(val))) in str(val)]
Не фільтрує об’єкти
Усунення if
стану. Повернення{'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()}
Рішення довго
Поки реалізація за замовчуванням __repr__
не переважають в if
заяву буде повертати , True
якщо шістнадцяткове подання місця в пам'яті val
знаходиться в __repr__
зворотному рядку.
Щодо реалізації за замовчуванням, __repr__
то ця відповідь може бути корисною . Коротко:
def __repr__(self):
return '<{0}.{1} object at {2}>'.format(
self.__module__, type(self).__name__, hex(id(self)))
Який повертає рядок типу:
<__main__.Bar object at 0x7f3373be5998>
Місце в пам'яті кожного елемента отримується за допомогою id()
методу.
Python Docs говорить про id ():
Поверніть "ідентичність" об'єкта. Це ціле число, яке гарантовано є унікальним та постійним для цього об’єкта протягом його життя. Два об'єкти із строками, що не перекриваються, можуть мати однакове значення id ().
Деталі реалізації CPython: Це адреса об'єкта в пам'яті.
Спробуйте самі
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())
Вихід:
{'a': 1, 'c': [3, 3], 'b': (2, 2), 'd': {4: 4}}
Примітка :