👓 Отслеживаем, какие ключи словаря в Python вы не использовали
Иногда полезно знать, какие поля данных вы вообще не задействовали — например, чтобы убедиться, что все данные из базы реально применяются в отчёте или покрыты тестами.
Представьте, что у вас SQL-запрос вида:
SELECT fieldX, fieldY, fieldZ FROM ...
Но в итоговом CSV-экспорте вы используете только
fieldX
и fieldY
. Как понять, что fieldZ
остался неиспользованным?class TrackingDict(dict):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._accessed_keys = set()
def __getitem__(self, key):
self._accessed_keys.add(key)
return super().__getitem__(key)
@property
def accessed_keys(self):
return self._accessed_keys
@property
def never_accessed_keys(self):
return set(self.keys()) - self._accessed_keys
Пример использования:
user = {
"name": "John Doe",
"age": 30,
"email": "[email protected]",
}
user = TrackingDict(user)
assert user["name"] == "John Doe"
print("Использованные ключи:", user.accessed_keys)
print("Неиспользованные ключи:", user.never_accessed_keys)
Выведет:
Использованные ключи: {'name'}
Неиспользованные ключи: {'email', 'age'}
— Убедиться, что все важные данные действительно используются в отчётах.
— Проверить покрытие тестами — например, в
pytest
:assert not user.never_accessed_keys, f"Вы не проверили {user.never_accessed_keys}"
from typing import TypeVar, Any
K = TypeVar('K')
V = TypeVar('V')
class TrackingDict(dict[K, V]):
"""
Словарь с отслеживанием использованных ключей.
"""
def __init__(self, *args: Any, **kwargs: Any) -> None:
super().__init__(*args, **kwargs)
self._accessed_keys: set[K] = set()
def __getitem__(self, key: K) -> V:
self._accessed_keys.add(key)
return super().__getitem__(key)
@property
def accessed_keys(self) -> set[K]:
return self._accessed_keys
@property
def never_accessed_keys(self) -> set[K]:
return set(self.keys()) - self._accessed_keys
Библиотека питониста #буст