Valores de retorno do procedimento Python [closed]
No Python, é possível criar um procedimento que não tenha retorno explícito. ou seja:
def test(val):
if 0 == val:
return 8
Além disso, é possívelatribuir os resultados dessa função para uma variável:
>>> a = test(7)
>>> print `a`
'None'
Por que diabos é isso? Que lógica de linguagem está por trás dessa desconcertante decisão de design? Por que isso simplesmente não gera um erro no compilador?
EDIT: Sim, eu percebo que funciona dessa maneira. Obrigado. Minha pergunta é por que? Parece uma maneira tão segura de introduzir bugs sutis em seu código. E parece, como foi mencionado abaixo por e-satis, ir contra o muito sábio ditado pítónico de que "explícito é melhor que implícito".
Então, o que há com isso? É apenas uma supervisão de projeto ou uma suposição simplificadora ou uma decisão deliberada e ponderada?
EDIT: Será que todos concordam que expressar a intenção desta forma é muito melhor:
def test(val):
if 0 == val:
return 8
else:
return None
Em caso afirmativo, por que o Python preferiria o estilo antigo para criar uma exceção de tempo de compilação?
EDIT: S.Lott traz o ponto explicitamente (e outros também, ele apenas parece mais claro para mim) que esse comportamento é um resultado do fato de que o Python é uma linguagem dinâmica e, portanto, não pode verificar em tempo de compilação, o comportamento do tempo de execução do sistema.
Como não há distinção entre procedimentos (aquelas funções que não retornam nenhum valor) e funções (aquelas que o fazem), não há nada a ser aplicado em tempo de compilação. O que significa que quando chegamos ao comportamento em tempo de execução, ou temos uma falha catastrófica em alguns casos (lançamos uma exceção) ou falhamos silenciosamente assumindo que o programador sabia o que estava fazendo e entendeu o comportamento padrão.
A maneira pythonic é fazer o último, a maneira do estilo C é fazer o primeiro.
Isso parece fazer sentido como uma boa razão para fazê-lo dessa maneira.
A justificativa clara de S.Lott está enterrada nos comentários para a resposta aceita, então achei melhor resumir aqui.
Eu vou adiar a aceitação da resposta um pouco para ver se S.Lott faz uma resposta oficial. Caso contrário, darei os pontos ao SilentGhost.