許可を求めるのではなく、ただ実行して許しを求めるという基本的な哲学を理解しています。たとえば、 .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の方法は何ですか?