Nem tudo é perfeito

Recentemente, durante o trabalho de escrever o meu livro sobre Python (não, não está pronto e ainda falta muito), me deparei com uma característica que achei superlegal em Python. Essa característica provêm da idéia de que uma string também é uma seqüência tal como listas ou tuplas. Essa característica permite que eu faça coisas como:

>>> a = [1,2,3]
>>> a += "spam"
>>> a
[1, 2, 3, 's', 'p', 'a', 'm']

Quando estava jantando com o pessoal da PyConBrasil (que aliás foi muito massa) fui mostrar pra eles essa característica, mas como não lembrava exatamente o exemplo anterior eu demonstrei conforme abaixo:

>>> a = [1,2,3]
>>> a = a + "spam"

Qual não foi meu espanto quando o resultado obtido foi um:

>>> a = [1,2,3]
>>> a = a + "spam"
Traceback (most recent call last):
 File "", line 1, in ?
TypeError: can only concatenate list (not "str") to list

Quando vi isso entendi que o ‘problema’ ocorre porque o operador “+=” é mapeado para o método __iadd__() enquanto que o operador “+ é mapeado para o método __add__”.

Até aí tudo certo. O problema da tal ‘inconsistência’ é que no caso específico dos objetos de listas (list) o método __iadd__() nada mais é do que um apelido para o método extend().

Após algumas discussões com outros pythonistas de alto nível não foi possível chegar a nenhuma conclusão sobre se iss é ou não é um erro de design da linguagem.