2009-05-18 11 views

risposta

184

è 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 !=). "

+4

Farei attenzione a usarlo, poiché questo link indica la fine del documento. –

+8

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

+11

@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

9

Una ragione è la prestazione. In una situazione come un confronto ricco, in cui si potrebbero eseguire molte operazioni in breve tempo, la configurazione e la gestione di molte eccezioni potrebbe richiedere molto più tempo rispetto alla semplice restituzione di un valore NotImplemented.

-4

Ci sono funzioni che generano eccezioni e funzioni che non lo sono, return NotImplemented potrebbe essere per quest'ultimo .... dipende molto dal programmatore/design. Ecco perché sono entrambi lì per l'uso.

+14

Si prega di rivedere lo Zen di Python ('>>> importa questo). Prestare particolare attenzione alla riga 13: "Ci dovrebbe essere uno - e preferibilmente solo un modo - ovvio per farlo". Python non è Ruby o Perl o qualsiasi altra lingua dove ci sono dozzine di modi ugualmente validi per fare qualcosa. La risposta non è mai che sia il gusto del programmatore. – ArtOfWarfare

18

Perché hanno diversi casi d'uso.

citare i documenti (Python 3.6):

NotImplemented

devono essere inviati dagli metodi speciali binari (es __eq__(), __lt__(), __add__(), __rsub__(), ecc) per indicare che l'operazione non è implementata rispetto all'altro tipo

exception NotImplementedError

[...] In definiti dall'utente di base classi, metodi astratti dovrebbero sollevare questa eccezione quando richiedono classi derivate di override del metodo, o mentre la classe è stato sviluppato per indicare che la reale implementazione necessita ancora di da aggiungere.

Vedere i collegamenti per i dettagli.

Problemi correlati