Immutable vs Hashable

  1. В една от първите лекции видяхме, че класовете и функциите в Python са mutable.
    Защо тогава и двете могат да се ключ в dict <=> са hashable? Например:

    >>> {dict, "constructs a dict"}
    {<class 'dict'>, 'constructs a dict'}
    
    >>> {len: "returns the `length` of an object"}
    {<built-in function len>: 'returns the `length` of an object'}
    

    Същото става и с не-вградена функция.
    Аз си мисля, че за всеки клас C , обектът <class 'C'> е единствен
    и аналогично за функция. Така и да има collision в dict не е възможно обектът,
    с който е станал collision-а да се сравни равен с нашият ключ(бил той клас или фунция).
    Така стават невъзможни неразрешими сблъсъци, а hash функцията на този обект
    (от тип type или function) няма нужда да зависи от "съдържанието" му (методите на класът например).

    Какво мислите по въпроса?

  2. Хешимостта на един обект зависи от съществуването на функцията __hash__. Дали обект е immutable или не, питона няма как да знае. Нека имаме следния клас:

    class Hashable:
        def __init__(self, baba, dyado, chicho):
            self.__baba = baba
            self.dyado = dyado
            self.chicho = chicho
    
        def __hash__(self):
            return hash(self.__baba)
    

    Ако приемем, че само baba ни интересува, а другите 2 член-данни са маловажни, тоя клас е perfectly hashable, защото функцията му е добре дефинирана (стига тази на baba да е добре дефинирана), макар и да не е immutable (промените на dyado / chicho няма да променят хеша).

    Според мен, класовете и функциите са инстанции на някой специален клас (Class/Funcion, нещо такова) и в тия два класа __hash__ е добре дефиниран, така че да не зависи от съдържимото в класа или магиите, които можем да правим над функции.

  3. Прав си донякъде, но има потенциал да ти стане много бавен dict/set-a
    ако наслагаш много такива обекти с една и съща baba. Моята идея е,
    че в случая на class/function няма(поне според мен) как да има втори такъв
    обект и можеш да го хешираш и по името на класът/функцията.

Трябва да сте влезли в системата, за да може да отговаряте на теми.