it-swarm.com.de

Ist es üblich, einen NotImplementedError für Methoden auszulösen, deren Implementierung aussteht, aber nicht als abstrakt geplant ist?

Ich möchte ein NotImplementedError für jede Methode auslösen, die ich implementieren möchte, aber wo ich noch nicht dazu gekommen bin. Möglicherweise habe ich bereits eine teilweise Implementierung, aber stellen Sie raise NotImplementedError() voran, da es mir noch nicht gefällt. Andererseits halte ich mich auch gerne an Konventionen, da dies anderen Menschen die Pflege meines Codes erleichtert und Konventionen möglicherweise aus gutem Grund existieren.

Jedoch Pythons Dokumentation für NotImplementedError besagt:

Diese Ausnahme wird von RuntimeError abgeleitet. In benutzerdefinierten Basisklassen sollten abstrakte Methoden diese Ausnahme auslösen, wenn abgeleitete Klassen zum Überschreiben der Methode erforderlich sind.

Das ist ein viel spezifischerer, formaler Anwendungsfall als der, den ich beschreibe. Ist es ein guter, konventioneller Stil, ein NotImplementedError zu erhöhen, nur um anzuzeigen, dass dieser Teil der API in Arbeit ist? Wenn nicht, gibt es eine andere standardisierte Art, dies anzuzeigen?

35
gerrit

Es ist erwähnenswert, dass die Python - Dokumentation einen Anwendungsfall (und wahrscheinlich den kanonischen) für diese Ausnahme enthält, die Verwendung in anderen Szenarien jedoch nicht ausdrücklich ausschließt.

Ich würde es für angemessen halten, eine NotImplementedError-Ausnahme auszulösen, wenn Sie eine Methode in einer Basisklasse noch nicht überschrieben haben (um die "Schnittstelle" zu erfüllen).

Eine flüchtige Überprüfung bei Google schlägt vor, dass die Leute werden verstehen, was Sie meinen wenn Sie die Ausnahme auf diese Weise verwenden. Es gibt keine Nebenwirkungen oder unbeabsichtigten Folgen, von denen ich weiß; Die Methode löst einfach eine Ausnahme aus, wenn sie aufgerufen wird, und löst eine Ausnahme aus, die von allen verstanden wird.


Das Dokumentation für Python 3 spiegelt genau diese Verwendung wider:

In benutzerdefinierten Basisklassen sollten abstrakte Methoden diese Ausnahme auslösen, wenn abgeleitete Klassen zum Überschreiben der Methode erforderlich sind oder während die Klasse entwickelt wird, um anzuzeigen, dass die tatsächliche Implementierung noch hinzugefügt werden muss . [Betonung hinzugefügt]

35
Robert Harvey

Dies wird verstanden, ob Sie es tun oder nicht, sollte von lokalen (Team- oder Firmen-) Konventionen abhängen. Beachten Sie, dass dies im Kontext von TDD weniger sinnvoll ist, da der TEST bestimmen sollte, dass die Methode nicht implementiert ist.

Die Kurzversion lautet: Verwenden Sie diese Option, wenn Sie und Ihr Team dies für angemessen halten.

8
jmoreno

Es scheint, dass NotImplementedError normalerweise für Python Feature-Entwicklungen selbst wie die folgenden ausgelöst wird:

@classmethod
def fromkeys(cls, iterable, v=None):
    # There is no equivalent method for counters because setting v=1
    # means that no element can have a count greater than one.
    raise NotImplementedError(
        'Counter.fromkeys() is undefined.  Use Counter(iterable) instead.')

Dokumentation

fromkeys (iterierbar)

Diese Klassenmethode ist für Zählerobjekte nicht implementiert.

Quelle

Collections.Counter.fromkeys

2
Emma