Python tem um singleton chamado NotImplemented.
Por que alguém iria querer voltar em NotImplementedvez de criar a NotImplementedErrorexceçã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 NotImplementedvez de criar a NotImplementedErrorexceçã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 NotImplementednão é gerado e pode ser usado em outros testes.
http://jcalderone.livejournal.com/32837.html
Para resumir esse link:
"
NotImplementedsinaliza 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). Sebsouber o suficiente para retornarTrueouFalse, 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 NotImplementedvalor.