è perché __lt__()
e relativi metodi di confronto sono abbastanza comunemente utilizzati indirettamente sorta di elenco e così via. A volte l'algoritmo sceglierà di provare un altro modo o scegliere un vincitore predefinito. Alzare un'eccezione si interromperà a meno che non venga catturato, mentre lo NotImplemented
non viene generato e può essere utilizzato in ulteriori test.
http://jcalderone.livejournal.com/32837.html
In sintesi che puntano:.
"NotImplemented
segnali al runtime che si dovrebbe chiedere a qualcun altro di soddisfare l'operazione Nell'espressione a == b
, se a.__eq__(b)
restituisce NotImplemented
, poi Python cerca b.__eq__(a)
. Se b
conosce abbastanza per restituire True
o False
, l'espressione può avere esito positivo, in caso contrario, il runtime ricadrà sul comportamento predefinito (basato su iden per ==
e !=
). "
Farei attenzione a usarlo, poiché questo link indica la fine del documento. –
Quando l'interprete Python controlla se 'a .__ eq __ (b)' ha restituito NotImplemented, non potrebbe invece catturare facilmente NotImplementedError (e chiamare 'b .__ eq __ (a)' o qualsiasi altra cosa allora)? – Veky
@Veky. Alzare un'eccezione probabilmente ha un sovraccarico maggiore. Qualsiasi overhead in un'operazione di ordinamento verrà ingrandito dalla dimensione dell'elenco, quindi anche se la differenza fosse molto piccola, avrebbe comunque senso trovare un'implementazione più veloce. Inoltre, non vuoi che tu stia uscendo dai tuoi loop e rientrando in essi che richiederebbe un'implementazione try/catch. – SpliFF