2

説明

Pythonで値型をチェックすることについて多くの意見を読みましたが、ほとんどの場合、型をチェックするのではなく、tryとexceptを使用する必要があると言われています。いくつか明確にしておきたいことがあります。

質問

私がこのような方法を持っているとき:

def set_age(self, age):
    self._age = age

コードの後半でバグのデバッグが難しくなる可能性があるため、ユーザーにint以外の型を渡させることはできません。そして、Pythonの方法論によれば、タイプをチェックすることはできません。では、適切な方法で試してみるとどうすればよいでしょうか。

def set_age(self, age):
    try:
        age = int(age)
    except TypeError:
        raise TypeError('First parameter must be of int type.')
    self._age = age

あるいは単に

def set_age(self, age):
    self._age = int(age)

Pythonにそれ自体でエラーを発生させます。

私はそれがばかげた質問かもしれないことを知っています、私はただ確かめたいです。

4

2 に答える 2

2

Pythonは整数でない場合に適切なエラーを発生させるため、Pythonに独自のエラーを追加する必要はありません。

ここには他にも問題があるので、少し後退しましょう。ゲッターとセッターは実際には非Pythonであり、属性を使用するか、プロパティを使用します。

この場合、あなたはまだ間違った方法で考えていると思います。Pythonでタイプチェックを行わない理由は、特定の状況で機能する場合でも、何かがどのタイプであるかを気にする必要がないためです。すべてをあなたがそれを手に入れたらすぐにあなたがそうあるべきだと思うタイプにすることは本質的にタイプチェックです。

デバッグが難しくなるとおっしゃっていますが、それはほとんどの人が実際に経験していることではありません。ダックタイピングは、仕事をすることができるすべてのものが仕事をすることを可能にするように設計されています。すべてをに変換すると、intプログラムが制限されます。問題はここにはありません。問題は、クラスに意味のないものを渡すコードにあります。私の経験では、これは実際には非常にまれなことです。クラスでランダムなものを投げて、何がうまくいくかを確認する傾向はありません。

したがって、ここでの私の提案は、属性を使用することです。使用するx.age = ...代わりに、set_age()またはそのようなものを使用してください。本当に必要な場合int(のように、整数のみが意味をなします)、プロパティを使用int()してセッターを呼び出し、エラーが発生した場合は呼び出し元に伝播するエラーを残します。

于 2013-01-26T14:41:49.267 に答える
1

Pythonの信条の1つは、「許可よりも許しを求める方がよい」ということです。多くの場合、関数が呼び出す関数によって生成される例外は、関数の呼び出し元に何が悪かったのかを伝えるのに十分です。

そうは言っても、場合によっては、呼び出し元へのセマンティクスが完全に一致しない、より具体的な例外をスローします。私が考えることができる1つの例は、json応答を調べているときに、辞書の1つの要素で「キーエラー」が発生する場合です。これは通常、送信したリクエストが失敗したことを意味するため、必要なデータが見つかりません。次に、「QueryFailed」のような関数に沿ってより意味的に何かをスローします。

ほとんどの場合、呼び出された関数「typeerror」または「ioerror」によってスローされる例外は、関数の呼び出し元にとって完全に理にかなっているはずなので、キャッチして再スローする必要はありません。

于 2013-01-26T14:43:57.893 に答える