Como usuário, e não designer, do Python, há três razões pelas quais estou feliz com essas decisões:
Principalmente, ele lê melhor. É claro que tenho que decidir conscientemente introduzir uma nova variável ao escrever , mas o código é lido com muito mais frequência do que está escrito. Muito código é simples no sentido de que o controle do fluxo e do aninhamento não tem influência no significado e na existência de variáveis. Quando eu li
it = Snark()
message = "A letter, not signed"
if random.random() > 0.5:
hunt(it)
message += " (by the Knave)"
return [it, message]
então geralmente não me importo com qual (se houver) menção de um nome o introduz pela primeira vez, apenas me importo que ele esteja lá e o que acontece com ele.
Observe que um corpo significativo de pseudo-código usa a mesma convenção (sem declaração, introdução implícita por atribuição), e o Python é frequentemente descrito como pseudo-código executável, apenas de brincadeira. Quatro personagens extras para cada variável local que, aos meus olhos mimadas, sentir como desordem significativa no contexto do Python, especialmente quando não se sentir como ele adiciona qualquer valor (ver abaixo); isso seria diminuído por um :=
operador como em Go.
Segundo, ainda não encontrei um erro de digitação (devido a esse recurso específico) que também não se mostrou de outra maneira clara. Talvez eu mude de idéia daqui a alguns anos, quando encontrar alguns erros desse tipo, mas até agora está bem na minha lista de coisas que causam erros. Há um número razoável de perguntas UnboundLocalError
e é um pouco complicado de explicar para iniciantes, mas a frequência e a popularidade dessas perguntas, em comparação com outras dicas (parâmetros padrão mutáveis, semântica de referência, classe versus variáveis de instância) indicam que é um problema raro.
Finalmente, a intenção ... desculpe, mas eu realmente não consigo entender essa. Ao ler e escrever Python, é sempre perfeitamente claro: o que você atribui se destina como local, a menos que seja declarado em voz alta e explicitamente o contrário. Nenhuma pergunta sobre isso. Além disso, como (pelo menos em Python) uma variável é local para toda a função ou não existe , você não pode ter um código complicado que use uma variável local em um ramo e uma global em outro. Você vê um nome sendo atribuído? Você sabe instantaneamente que sempre foi local desde o início. Bem, a menos que o código seja quebrado de uma maneira muito especial (e jogará o temido UnboundLocalError
em tempo de execução, ao entrar nesses casos).