Digamos que você não verifique os argumentos de entrada de antemão e apenas deixe a função seguir seu curso. Considere isto: o que é pior para acontecer? (Esta não é uma pergunta retórica.) Está dando uma entrada ruim para:
- faz a função falhar com outra exceção em algum lugar no fundo do código?
- desperdiça muito tempo e falha no meio do caminho?
- fazer algo potencialmente prejudicial (por exemplo, excluir seus dados importantes ...)?
- devolve um resultado falso?
- causa uma mensagem de erro confusa?
Leve isso em consideração com cuidado. Nos cenários mais , onde o desempenho não é da maior importância, você realmente quer que ele falhe cedo e tão alto quanto possível , portanto, verificar argumentos inválidos geralmente é uma boa ideia ( esperamos que responda a sua primeira pergunta).
Isso ajuda a depurar e reduz o risco de seu código fazer algo horrível. Claro, isso pode ser tedioso às vezes, então se você quiser uma abordagem rápida (útil para protótipos), use assert
:
assert 0 <= cluster_distribution <= 1
No entanto, não adianta fazê-lo duas vezes se for óbvio que outra função fará isso por você, pois levará à duplicação de código desnecessária (esperamos que responda à sua segunda pergunta).
Por exemplo, digamos que você tenha uma função (um tanto inútil) assim:
def square_root(s);
return math.sqrt(s)
Não é necessário verificar se s
não é negativo porque sqrt
já faz isso. Na maioria das funções "pequenas" como essa, você não precisará fazer muita verificação de entrada. Normalmente, apenas as funções "grandes" exigem uma verificação de entrada explícita como essas. Em alguns casos, você pode reestruturar o código sem verificações explícitas, de modo que, se as entradas forem inválidas, elas falharão automaticamente.