È convenzionale sollevare un NotImplementedError per i metodi la cui implementazione è in sospeso, ma non pianificata per essere astratta?

29

Mi piace aumentare un NotImplementedError per qualsiasi metodo che voglio implementare, ma dove non sono ancora riuscito a farlo. Potrei già avere un'implementazione parziale, ma aggiungerla con raise NotImplementedError() perché non mi piace ancora. D'altra parte, mi piace anche attenermi alle convenzioni, perché questo renderà più semplice per gli altri il mantenimento del mio codice e le convenzioni potrebbero esistere per una buona ragione.

Tuttavia documentazione di Pythons per NotImplementedError afferma:

This exception is derived from RuntimeError. In user defined base classes, abstract methods should raise this exception when they require derived classes to override the method.

Questo è un caso d'uso formale molto più specifico di quello che descrivo. È uno stile buono e convenzionale alzare un NotImplementedError semplicemente per indicare che questa parte dell'API è un work in progress? In caso contrario, esiste un modo standardizzato diverso per indicarlo?

    
posta gerrit 05.03.2014 - 21:48
fonte

2 risposte

31

Vale la pena notare che, sebbene la documentazione di Python fornisca un caso d'uso (e probabilmente quello canonico) per questa eccezione, non ne esclude espressamente l'uso in altri scenari.

Ritenerei opportuno sollevare un'eccezione NotImplementedError se non hai ancora scavalcato un metodo in una classe base (per soddisfare "l'interfaccia").

Un controllo superficiale su Google suggerisce che le persone capiranno cosa intendi se utilizzi l'eccezione in questo modo. Non ci sono effetti collaterali o conseguenze indesiderate che io conosca; il metodo genererà semplicemente un'eccezione se viene chiamato e genererà un'eccezione che è ben compresa da tutti.

La documentazione per Python 3 riflette questo uso esatto:

In user defined base classes, abstract methods should raise this exception when they require derived classes to override the method, or while the class is being developed to indicate that the real implementation still needs to be added. [Emphasis added]

    
risposta data 05.03.2014 - 22:00
fonte
8

Questo sarà compreso, che tu lo faccia o no dovrebbe dipendere da convenzioni locali (di squadra o di società). Si noti che ha meno senso nel contesto di TDD poiché il TEST dovrebbe essere ciò che determina che il metodo non è implementato.

La versione breve è: usa se tu e il tuo team ritenete appropriato.

    
risposta data 05.03.2014 - 22:39
fonte

Leggi altre domande sui tag