1
resposta

Duvida adição de elemento ao buscar um não existente em um defaultdict()

No seguinte código:

from collections import defaultdict

test_dict = defaultdict(int)
test_dict.update({
    "Husky": 1,
    "Siberian": 3,
    "Jasmine": 7,
    "Poodle": 2,
    "Yorkshire": 4,
    "Mel": 2
})

print(test_dict["Teste"])

for key, value in test_dict.items():
    print(key, value)

Ao final onde irá printar os elementos ele printar "Teste" 0, porém não tentei adicionar um elemento e sim pegar um.

Fora isso ao usar o get em um defaultdict buscando um elemento não existente ele não retorna 0 mas sim None.

Acho q faltou algumas explicações em relação a isso.

1 resposta

Oi Kevin.

Esse é mesmo o objetivo do defaultdict. Quando você tenta acessar um item que não existe, ele vai usar a função passada como parâmetro (default_factory) para criar ele. A função do defaultdict não é retornar um valor se não tiver chave, mas sim criar a chave com o valor "default".

Sobre o .get, olhando na documentação do defaultdict você pode ver que é explicada a diferença disso e do dict. No defaultdcit é criado o método dunder __missing__ e modificam o __getitem__ para usar isso, mas o método get continua igual antes.

Você pode estender o dict e sobrescrever esses métodos para tentar entender eles melhores:

class Get(dict):
    def get(self, key):
        value = 'new get dict'

        try:
            value = self.__dict__[key]
        except:
            pass

        return value


class GetItem(dict):
    def __getitem__(self, key):
        value = self.get(key)
        return value if value else 'new __getitem__ dict'


hey = Get()
print(hey.get('doc'))
# print(hey['doc']) # vai levantar um erro

wow = GetItem()
print(wow.get('doc'))
print(wow['doc'])