0

許可を求めるのではなく、ただ実行して許しを求めるという基本的な哲学を理解しています。たとえば、 .read() メソッドを持つのにファイルである必要はありません。ファイルのようなオブジェクトを読みたいときに、「問題なく動作する」ことがわかったときは、後で感謝するでしょう。ただし、数値などの単純なオブジェクトよりも、ファイルなどの複雑なオブジェクトの方が理解しやすいです。

だから私は非常に単純なクラスを書こうとしています。詳細は関係ありませんが、内部カウンターがあり、カウンターが制限を超えたときに何かをする必要があります。制限は、オブジェクトの作成時に引数として提供されます。

今、防御的プログラミングを考えています。明らかに、制限を整数にするか、少なくとも整数のように比較できるものにしたいと思います。私が行う >= テストは、フロートの場合でも正しい動作を提供するため、それよりも弱い可能性があります。

クラスのユーザーは、この引数が整数でなければならないことを知っていますが、そうでない場合でも、オブジェクトが何か驚くべきことをしないようにしたいと思います。私の最初の考えは、実際に番号を持っていることを確認することでした

if isinstance(limit,(int,long,float)):

しかし、ここには「テストしないで、試してみてください」という答えがたくさんあるので、それが非Pythonicであることはわかっています。制限を使用して、例外がスローされるのを待つことをお勧めします。だから私はtry内でこれを試しました:さまざまな種類の制限を除いて

if counter >= limit:

limit が int または float の場合、これは正常に機能します。次に、文字列またはタプルを制限し、数値と比較するオブジェクトに明確または合理的な定義がなく、例外をキャッチするのを待ちました。しかし、それは実行され、ブール値を返し、黙っています。

そのため、RTFM を実行したところ、compare は混合型の例外を発生させないことがわかりました。これは、任意の型で等価性がテストされる「コンテナー内の x」の操作と関係があります。異なる型に対して常に not_equal を返しますが、大きさの比較は一貫していますが、任意です。混合型の大小比較が常に False を返す場合は、おそらくそれを使用できたかもしれませんが、喜んで True も返します。

数値以外で他の整数のような動作を使用しようとすると、予想される例外が発生します。たとえば、この文字列 + 数値は TypeError をスローします。

limit+0

だから私は言うことができました

if counter >= (limit+0)

limit が数値以外の場合、目的の例外がスローされます。しかし、それはほとんど難読化されているように感じます。バックドアで型テストを行うために、エクスプレッションに何か特別なことをしています。コードオプティマイザーまたは別のエディターは、明らかに冗長な算術演算を削除します。オブジェクトがアヒルと同じ重さであるかどうかを見て、それが木でできているかどうかを確認するようなもので、魔女のように燃やすことができます。

より明確な可能性は

if counter >= int(limit)

少なくとも説明の一部が組み込まれています。すべての状況で私が望んでいることを正確に行うわけではありませんが、現時点では十分であり、誰も驚かないでしょう.

それで、WWWD?大きさを比較するだけの場合、信頼できない引数を安全に使用するためのpythonicの方法は何ですか?

4

1 に答える 1

0

引数が適切な数値型であることを本当に確認したい場合は、それが適切な数値抽象基本クラスのインスタンスであるかどうかをテストします。たとえば、次のようになります。

    import numbers
    ...
    if not isinstance(limit, numbers.Real):
        ... # react to the bad argument type

おそらくその場合、TypeError例外をスローします。

クラスの__init__メソッドでこれを行い、問題が検出され、呼び出し元の元の間違いにできるだけ近い形で報告されるようにします。これは、不確定な時間を待って、プログラムがカウンターで遊んでいるときに最終的に爆発するよりもはるかに親切です。その時点で、例外のトレースバックは問題の原因を特定するのにはるかに役立ちません.

偏執的であると感じている場合は、この引数の値がゼロより大きいことをコンストラクターでチェックインし、ValueErrorそうでない場合は例外をスローすることもできます。

于 2012-06-26T02:12:55.857 に答える