708

Python で無効な引数の組み合わせを示すためのベスト プラクティスについて疑問に思っていました。次のような機能があるいくつかの状況に遭遇しました。

def import_to_orm(name, save=False, recurse=False):
    """
    :param name: Name of some external entity to import.
    :param save: Save the ORM object before returning.
    :param recurse: Attempt to import associated objects as well. Because you
        need the original object to have a key to relate to, save must be
        `True` for recurse to be `True`.
    :raise BadValueError: If `recurse and not save`.
    :return: The ORM object.
    """
    pass

これに関する唯一の煩わしさは、すべてのパッケージに独自の、通常わずかに異なるBadValueError. Java に存在することは知っていjava.lang.IllegalArgumentExceptionます。誰もが Python で独自BadValueErrorの を作成することはよく理解されていますか、それとも別の推奨される方法はありますか?

4

8 に答える 8

785

より具体的な例外が必要でない限り、ValueErrorを上げるだけです..

def import_to_orm(name, save=False, recurse=False):
    if recurse and not save:
        raise ValueError("save must be True if recurse is True")

これを行う意味はまったくありませんclass BadValueError(ValueError):pass。カスタム クラスの使用法はValueErrorと同じなので、それを使用しない理由はありません。

于 2008-11-01T23:37:31.643 に答える
127

私はから継承しますValueError

class IllegalArgumentError(ValueError):
    pass

独自の例外を作成した方が良い場合もありますが、組み込みの例外を継承することで、必要なものにできるだけ近いものを作成できます。

その特定のエラーをキャッチする必要がある場合は、名前があると便利です。

于 2008-11-01T23:17:49.250 に答える
14

私はほとんどの場合ValueError、この状況でビルトインが使用されているのを見てきました。

于 2008-11-01T23:17:40.717 に答える
-1

からの継承に同意するかどうかはわかりませんValueError-ドキュメントの私の解釈は、組み込みValueErrorによってのみ発生するはずです...それから継承するか、自分で発生させるのは正しくないようです。

組み込み演算または関数が正しい型であるが不適切な値を持つ引数を受け取り、その状況が IndexError などのより正確な例外によって記述されていない場合に発生します。

-- ValueError ドキュメント

于 2008-11-01T23:21:54.920 に答える