Python tem um singleton chamado NotImplemented
.
Por que alguém iria querer voltar em NotImplemented
vez de criar a NotImplementedError
exceção? Não apenas tornará mais difícil encontrar erros, como código que executa métodos inválidos?
Python tem um singleton chamado NotImplemented
.
Por que alguém iria querer voltar em NotImplemented
vez de criar a NotImplementedError
exceção? Não apenas tornará mais difícil encontrar erros, como código que executa métodos inválidos?
Respostas:
É porque __lt__()
métodos de comparação relacionados são comumente usados indiretamente em tipos de lista e coisas do tipo. Às vezes, o algoritmo decide tentar de outra maneira ou escolher um vencedor padrão. Gerar uma exceção seria diferente, a menos que detectado, enquanto NotImplemented
não é gerado e pode ser usado em outros testes.
http://jcalderone.livejournal.com/32837.html
Para resumir esse link:
"
NotImplemented
sinaliza ao tempo de execução que ele deve solicitar a outra pessoa que satisfaça a operação. Na expressãoa == b
, sea.__eq__(b)
retornaNotImplemented
, o Python tentab.__eq__(a)
. Seb
souber o suficiente para retornarTrue
ouFalse
, a expressão poderá ser bem-sucedida. Se não, o tempo de execução será voltar ao comportamento interno (que é baseado na identidade para==
e!=
). "
a.__eq__(b)
NotImplemented retornado, ele não poderia facilmente capturar o NotImplementedError (e chamar b.__eq__(a)
ou o que quer que seja)?
Porque eles têm diferentes casos de uso.
Citando os documentos (Python 3.6):
devem ser devolvidos pelos métodos especiais binários (por exemplo
__eq__()
,__lt__()
,__add__()
,__rsub__()
, etc.) para indicar que a operação não é implementado em relação ao outro tipo
[...] Nas classes base definidas pelo usuário, os métodos abstratos devem gerar essa exceção quando exigem que as classes derivadas substituam o método ou enquanto a classe está sendo desenvolvida para indicar que a implementação real ainda precisa ser adicionada.
Veja os links para detalhes.
Um dos motivos é o desempenho. Em uma situação como comparações ricas, em que você pode realizar muitas operações em pouco tempo, configurar e manipular muitas exceções pode levar muito mais tempo do que simplesmente retornar um NotImplemented
valor.