quinta-feira, 30 de março de 2017

Melhorando a legibilidade de código Python usando namedtuple

Legibilidade é um dos pontos fortes da linguagem Python e também um dos pontos fracos de scripts e programas científicos. Apesar de todo esforço (ou da falta dele), depois de muitos ajustes e testes os códigos usados em trabalhos científicos raramente são bonitos. Neste texto apresentamos o módulo namedtuple, que pode ser usado para melhorar muito a legibilidade de códigos que usam tuplas.

Uma namedtuple é uma tupla "normal" que também pode ser indexada usando nomes de atributos. Um uso interessante poderia ser o armazenamento de resultados de experimentos. Ao invés de simplesmente construir uma tupla com os parâmetros usados e o resultado obtido poderíamos criar uma namedtuple como abaixo. Os nomes dos elementos são passados em uma string separados por um espaço.

from collections import namedtuple

Resultados = namedtuple('Resultados', 'param1 param2 erro')
r = Resultados(param1=2, param2=1, erro=0.1)
print(r)
Resultados(param1=2, param2=1, erro=0.1)

Ao invés de devolver uma tuple podemos devolver uma instância de Resultado. Como podemos ver abaixo, uma namedtuple se comporta exatamente como uma tupla. Portanto, poderíamos simplesmente substituir tuplas "regulares" por namedtuple e o programa funciona exatamente como antes.

p1, p2, err = r # desempacotamento
print('Acesso por índice', r[0], r[1], r[2])
print('Acesso por nome', r.param1, r.param2, r.erro)
Acesso por índice 2 1 0.1
Acesso por nome 2 1 0.1

Usar namedtuple também facilita a utilização do código por terceiros, já que a tupla vem anotada com o significado de cada um de seus elementos. Enfim, esta dica rápida pode facilitar muito a compreensão do seu código por outras pessoas (ou por você mesmo dentro de alguns meses/anos) e tem um impacto muito pequeno no código. Vale a pena começar a usar!