web-dev-qa-db-ja.com

実装が保留されているが、抽象化する予定がないメソッドに対してNotImplementedErrorを発生させるのは通常のことですか?

実装したいメソッドのNotImplementedErrorをレイズしたいのですが、まだ実装していません。私はすでに部分的な実装をしているかもしれませんが、それがまだ好きではないので、raise NotImplementedError()を前に付けます。一方、他の人が私のコードを保守しやすくなるため、規則にもこだわるのが好きです。また、規則には正当な理由があるかもしれません。

ただし NotImplementedErrorのPythonドキュメント の状態:

この例外は、RuntimeErrorから派生しています。ユーザー定義の基本クラスでは、派生クラスがメソッドをオーバーライドする必要がある場合、抽象メソッドはこの例外を発生させる必要があります。

これは、私が説明するものよりもはるかに具体的で正式なユースケースです。 APIのこの部分が進行中の作業であることを単に示すためにNotImplementedErrorをレイズすることは、良い従来のスタイルですか?そうでない場合、これを示す別の標準化された方法はありますか?

35
gerrit

Pythonドキュメンテーションはこの例外のユースケース(そしておそらく標準的なもの)を提供しますが、他のシナリオでの使用を明確に除外するものではないことは注目に値します。

(「インターフェース」を満たすために)基本クラスのメソッドをまだオーバーライドしていない場合は、NotImplementedError例外を発生させるのが適切だと思います。

Googleでの大まかなチェック は、この方法で例外を使用する場合、 人々があなたの意味を理解できる であることを示唆しています。私が知っている副作用や意図しない結果はありません。このメソッドは、呼び出されると単に例外をスローし、誰もが理解している例外をスローします。


documentation for Python 3は、この正確な使用法を反映しています。

ユーザー定義の基本クラスでは、メソッドをオーバーライドするために派生クラスが必要な場合、または実際の実装を追加する必要があることを示すためにクラスを開発しているときに、抽象メソッドはこの例外を発生させる必要があります。 【エンファシス追加】

35
Robert Harvey

これは、あなたがそれを行うかどうかに関係なく、ローカル(チームまたは会社)の規則に依存する必要があることが理解されます。メソッドが実装されていないとテストが判断する必要があるため、TDDのコンテキストではあまり意味がありません。

短いバージョンは次のとおりです。あなたとあなたのチームが適切と考える場合に使用します。

8
jmoreno

NotImplementedErrorは通常、次のようにPython機能開発自体のために発生しています。

@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.')

文書化

fromkeys(反復可能)

このクラスメソッドはCounterオブジェクトには実装されていません。

ソース

Collections.Counter.fromkeys

2
Emma