Python 2 및 3, whitout 가져 오기, 주소로 객체 필터링
요약 :
필터링 된 객체 인 dict {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)}
반환 목록 [attribute_names] , 개체가 필터링되었습니다. 즉['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
의 메모리 위치의 16 진수 표현이 경우 val
에 __repr__
반환 문자열.
기본 구현과 관련 하여이 답변이__repr__
유용 할 수 있습니다. 요컨대 :
def __repr__(self):
return '<{0}.{1} object at {2}>'.format(
self.__module__, type(self).__name__, hex(id(self)))
Wich는 다음과 같은 문자열을 반환합니다.
<__main__.Bar object at 0x7f3373be5998>
각 요소의 메모리 위치는 id()
메서드 를 통해 가져옵니다 .
Python 문서 는 id ()에 대해 말합니다.
객체의 "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}}
참고 :