実装が保留中のメソッドに対してNotImplementedErrorを送出するのは慣習的ですか?


34

私はNotImplementedError実装したい任意のメソッドに対してaを上げるのが好きですが、まだそれをやろうとしていません。私はすでに部分的な実装を持っているかもしれraise NotImplementedError()ませんが、まだ気に入らないのでそれを前に付けます。一方で、他の人が自分のコードを保守しやすくするので、慣習に固執するのも好きです。そして、慣習は正当な理由で存在するかもしれません。

ただし、NotImplementedErrorのPythonドキュメントには次のように記載されています。

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

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


「適切」とはどういう意味ですか?
ロバートハーヴェイ14年

1
@RobertHarvey私は、一般的な使用法に従って、従来のことを意味すると思います。私は今、質問を言い換えました。
ゲリット14年

1
ここでは主にC#を使用しますが、この種の例外のスローはここでは慣用的であり、他の場所で期待しています。潜在的な問題を迅速に特定するためのガイドラインとしては、早期に破り大声で破ることが適切です(読む:安価)。
テラスティン14年

一般に、クラスを作成する場合、機能の実装に取り​​かかるまで、未実装のメソッドにTODOコメントを入れるだけです。それが起こる前にクラスが本番環境にリリースされる場合、例外をスローすることを検討します。

5
価値のあることは、IDEを使用して「インターフェイスを実装する」ときにMicrosoft Visual Studioがデフォルトで行うことです。ロバート・ハーヴェイによると、結果はよく理解されています。
キャットフード14年

回答:


34

Pythonのドキュメントでは、この例外のユースケース(およびおそらく正規のもの)が提供されていますが、他のシナリオでの使用は特に除外されていません。

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

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


Python 3 のドキュメントには、この正確な使用法が反映されています。

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


+1ですが、この種の規則については、少しのドキュメントが役立つこともあります。開発ウィキの1行のメモ、レポREADME、またはスタイルガイドラインのようなもの-このようなもの-この例外の使用目的を説明します。
ベン・リー

8

これは、行うかどうかに関係なく、ローカル(チームまたは会社)の規則に依存する必要があります。TESTはメソッドが実装されていないことを決定するものでなければならないため、TDDのコンテキストではあまり意味がないことに注意してください。

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


5
FWIW、例外をスローすることは、何らかの理由でその動作を強制する必要がある場合にテストを失敗させる良い方法です。(たとえば、メソッド定義のインテリセンススタブの一部として役立ちます。)
DougM 14年

1

そのようで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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.