AutoNetOps

Cover Image for Além do Dictionary get(): Um método mais simples

Além do Dictionary get(): Um método mais simples

·

5 min read

A Armadilha Sutil do dict.get()

Se você trabalha com automação de redes em Python, é provável que tenha usado o método dict.get() muitas vezes. Ele é extremamente útil para evitar exceções do tipo KeyError ao acessar configurações de dispositivos ou dados de rede:

network_config = {"ip": "192.168.1.1"}
port = network_config.get("port", 80)  # defaults 80 se "port" estiver faltando

Simples, né? Sem erros, sem travamentos, apenas um valor padrão.

Mas aqui está o problema: embora o dict.get() seja prático, ele é frequentemente superutilizado e, em alguns casos, não é a maneira mais clara ou legível de lidar com chaves ausentes em configurações de rede.

Neste artigo, vou mostrar abordagens mais limpas e Pythonicas que tornam seu código mais seguro, legível e fácil de manter.

Por que o dict.get() Nem Sempre é a Melhor Escolha

O dict.get() parece inofensivo à primeira vista, mas vamos analisar as desvantagens no contexto de automação de redes:

Lógica*: Quando o valor ‘default’ é dinâmico (como uma porta padrão calculada ou um endereço de gateway), a linha pode ficar poluída ou repetitiva.*

Flexibilidade limitada*: Muitas vezes você precisa retornar um valor padrão e também armazená-lo no dicionário para uso futuro — o* dict.get() não faz isso automaticamente.

Imagine que você está lidando com configurações de um roteador:

mtu = device.get("mtu", 1500)

Se você precisar armazenar esse valor padrão de volta no dicionário device, pode acabar escrevendo:

if "mtu" not in device:
    device["mtu"] = 1500
mtu = device["mtu"]

Isso é verboso e propenso a erros. O Python oferece uma ferramenta melhor para esses casos.

Conheça o setdefault()A Alternativa Mais Limpa

Em vez de usar get() e atribuições manuais, o método setdefault() é perfeito para automação de redes:

mtu = device.setdefault("mtu", 1500)

O que isso faz:

Se "mtu" existe no dicionário, retorna seu valor.

Se não existe, insere o valor padrão (1500) no dicionário e o retorna.

Simples, conciso e explícito.

Vamos comparar:

# Using get()
mtu = device.get("mtu", 1500)
if "mtu" not in device:
    device["mtu"] = 1500

# Using setdefault()
mtu = device.setdefault("mtu", 1500)

A versão com setdefault() é mais curta, clara e garante que o dicionário seja atualizado com o valor padrão.

Quando Preferir o setdefault() ao invés do get()

Use o setdefault() quando:

Você precisa buscar e inicializar um valor de configuração ausente, como portas, IPs ou MTUs.

Você trabalha com dicionários aninhados (como configurações de VLANs ou interfaces).

Você quer reduzir código repetitivo e manter a clareza em scripts de automação.

Por exemplo, ao processar configurações de interfaces de rede:

interfaces = ["eth0", "eth1", "eth0", "eth2", "eth1"]

interface_status = {}
for interface in interfaces:
    interface_status.setdefault(interface, {"status": "down", "vlans": []})["vlans"].append(10)

print(interface_status)
# {
# 'eth0': {'status': 'down', 'vlans': [10, 10]},
# 'eth1': {'status': 'down', 'vlans': [10, 10]},
# 'eth2': {'status': 'down', 'vlans': [10]}
#}

Sem o setdefault(), você precisaria verificar a existência de cada chave antes de atualizar, adicionando linhas desnecessárias.

Uma Abordagem Ainda Mais Limpa: O defaultdict

O módulo collections do Python oferece o defaultdict, que é ideal para automação de redes:

from collections import defaultdict

interface_status = defaultdict(lambda: {"status": "down", "vlans": []})
for interface in interfaces:
    interface_status[interface]["vlans"].append(10)

print(dict(interface_status))
#{
# 'eth0': {'status': 'down', 'vlans': [10, 10]},
# 'eth1': {'status': 'down', 'vlans': [10, 10]},
# 'eth2': {'status': 'down', 'vlans': [10]}
}

Por que o defaultdict muitas vezes supera tanto o get() quanto o setdefault():

Inicializa chaves ausentes automaticamente.

Mantém seu código mínimo.

Deixa a intenção cristalina: “Quero um dicionário que padrão para configurações de interface.”

Pense nele como um dicionário mais inteligente que elimina verificações repetitivas.

Comparando as Três Abordagens

Vamos resumir com uma tabela de referência rápida:

dict.get(key, default): Retorna um valor com segurança ou um padrão.

Use quando não precisa armazenar o padrão de volta no dicionário.

dict.setdefault(key, default): Retorna um valor se presente; caso contrário, define e retorna o padrão.

Use quando precisa buscar e inicializar.

collections.defaultdict: Inicializa padrões automaticamente para chaves ausentes.

Use quando trabalha com coleções de configurações ou quando chaves ausentes são frequentes.

Exemplo do Mundo Real: Gerenciamento de Configurações de Rede

Imagine que você está construindo um script para gerenciar configurações de rede:

device = {"hostname": "router1"}

mtu = device.get("mtu", 1500)  #  Funciona, mas nao atualiza o device

Mais tarde, alguém inspeciona device e não vê "mtu". Confuso, né?

Em vez disso:

mtu = device.setdefault("mtu", 1500)
# device = {"hostname": "router1", "mtu": 1500}

Ou, se você tem múltiplos padrões:

from collections import defaultdict

device = defaultdict(lambda: "N/A")
device.update({"hostname": "router1"})

print(device["mtu"])  # N/A

Agora seu dicionário lida com chaves ausentes de forma elegante, e seu código é mais previsível.

O Custo Oculto de Usar get() Demais

Depender muito do get() pode introduzir bugs sutis em scripts de automação:

Você pode esquecer de atualizar o dicionário com os padrões.

Seu código pode esconder o fato de que algumas configurações estão faltando.

Futuros mantenedores (ou o futuro você) podem se perguntar por que alguns padrões não foram persistidos.

Sim, o get() tem seu lugar. Mas, muitas vezes, o setdefault() ou o defaultdict comunicam sua intenção de forma mais clara — e código que comunica intenção é sempre mais limpo.

Conclusão: Escreva Código que seu Futuro Eu Agradecerá

O Python nos oferece várias ferramentas para lidar com chaves de dicionário ausentes em automação de redes. Embora o dict.get() seja conveniente, nem sempre é a melhor escolha a longo prazo.

Use o get() quando precisar apenas de um fallback rápido e somente leitura.

Use o setdefault() quando quiser buscar e inicializar em uma única operação.

Adote o defaultdict quando lidar com coleções de configurações e chaves ausentes frequentes.

Código mais limpo não é apenas sobre menos linhas. É sobre clareza, manutenibilidade e expressão de intenção. Na próxima vez que você instintivamente alcançar o get(), pare por um momento e pergunte a si mesmo: Existe uma maneira mais limpa?

;