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()について述べています:
オブジェクトの「アイデンティティ」を返します。これは、オブジェクトの存続期間中、このオブジェクトに対して一意で一定であることが保証されている整数です。重複しない存続期間を持つ2つのオブジェクトは、同じ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}}
注: