Я пытаюсь выяснить, какие методы вызываются при распаковке dict, чтобы я мог настроить процесс?
Полагаю, что следующий хак показал бы методы, вызываемые при любом доступе к методу Dict
экземпляров:
class Dict(dict):
def __getattribute__(self, name):
print(name)
return super().__getattribute__(name)
Но следующий сеанс показывает, что не вызывается метод для выполнения распаковки dict?
In [1]: d = Dict(a=1)
__class__
__class__
In [2]: {**d}
Out[2]: {'a': 1}
Так что на самом деле здесь происходит? Как мне настроить процесс распаковки?
Редактировать
Не думаю, что вопрос является дубликатом другого . Даже при реализации всех специальных методов, упомянутых в ответах на этот вопрос, ни один из них не вызывается во время распаковки.
In [66]: class Dict(dict):
...: def __getattribute__(self, name):
...: print(name)
...: return super().__getattribute__(name)
...: def keys(self):
...: print("hello")
...: return super().keys()
...: def __getitem__(self, key):
...: print("hello")
...: return super().__getitem__(key)
...: def __len__(self):
...: print("hello")
...: return super().__len__()
...: def __iter__(self):
...: print("hello")
...: return super().__iter__()
...:
In [67]: d = Dict(a=1)
__class__
__class__
In [68]: {**d}
Out[68]: {'a': 1}
Вы можете видеть, что никакая строка print
не называется вообще. Поэтому мой вопрос остается без ответа.
FWIW, версия python - Python 3.6.5.