Неизменяемый хэш-список с правильными типами

Мне нужно использовать последовательность элементов в качестве ключа dict и использовать тип List[...]. Если я использую tuple, то это не соответствует типу List[...], и я не могу использовать тип Tuple[...], потому что длина кортежа неизвестна.

Есть ли какой-нибудь класс (возможно, из стороннего пакета), похожий на хешируемый замороженный список?


person Yaroslav Kishchenko    schedule 02.10.2020    source источник
comment
Отвечает ли это на ваш вопрос? Хеширование массивов в Python   -  person Yannick Funk    schedule 03.10.2020
comment
@YannickFunk, значит, мне нужно создать подкласс list и предоставить метод __hash__ вручную? Есть ли какой-нибудь пакет, который я мог бы установить для этого, который также может заморозить список? К сожалению, пакет frozenlist не обеспечивает хэширование из коробки(   -  person Yaroslav Kishchenko    schedule 03.10.2020


Ответы (2)


Неизменяемым эквивалентом List[T] является Tuple[T, ...].

Из документации Python:

Чтобы указать кортеж переменной длины однородного типа, используйте буквальное многоточие, например. Tuple[int, ...]. Обычный Tuple эквивалентен Tuple[Any, ...] и, в свою очередь, tuple.

person Jasmijn    schedule 02.10.2020

Оказалось, что пакет frozenlist обладает необходимой функциональностью.

    def __hash__(self):
        if self._frozen:
            return hash(tuple(self))
        else:
            raise RuntimeError("Cannot hash unfrozen list.")

Но этот код не входит ни в один релиз (1.0.0 и 1.0.0a0 на тот момент). Проверьте, улучшится ли ситуация. Вот проблема, которую я создал.

person Yaroslav Kishchenko    schedule 02.10.2020