Ответ
Нет, напрямую использовать список в качестве ключа словаря в Python нельзя. Ключом словаря может быть только хешируемый (immutable, неизменяемый) объект.
Причина: Словари в Python реализованы как хеш-таблицы. Ключ используется для вычисления хеша, который определяет положение значения в памяти. Если ключ (например, список) можно изменить после помещения в словарь, его хеш изменится, и найти соответствующее значение станет невозможно, что нарушит работу структуры данных.
Пример ошибки:
my_dict = {}
try:
my_dict[[1, 2, 3]] = "value" # Попытка использовать список как ключ
except TypeError as e:
print(e) # Вывод: unhashable type: 'list'
Обходные пути и решения для QA-сценариев:
-
Использовать кортеж (tuple): Если порядок элементов важен и элементы сами хешируемы.
# Вместо списка ["GET", "/api/users"] используем кортеж test_config = {("GET", "/api/users"): {"status": 200}, ("POST", "/api/users"): {"status": 201}} key = ("GET", "/api/users") print(test_config[key]) # {'status': 200} -
Использовать строковое представление (с осторожностью): Если нужна простая группировка.
# Для хранения параметров теста, где список — это набор тэгов test_cases = {str(["smoke", "api"]): "Test API health endpoint", ...} -
Использовать frozenset: Если порядок не важен, а нужен набор уникальных хешируемых элементов.
# Для хранения тестов по наборам тегов test_suites = {frozenset({"smoke", "regression"}): [test1, test2]}
Практический вывод для тестирования: При проектировании тестовых данных или конфигураций, где нужен составной ключ, следует сразу выбирать неизменяемые структуры (кортеж, frozenset) или их строковое представление.