ええ、エヴァンが言ったように、チェックを入力しないでください。値を使用してみてください:
def myintfunction(value):
""" Please pass an integer """
return 2 + value
それにはタイプチェックがありません。それははるかに優れています!試してみるとどうなるか見てみましょう。
>>> myintfunction(5)
7
整数であるため、これは機能します。うーん。テキストを試してみましょう。
>>> myintfunction('text')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in myintfunction
TypeError: unsupported operand type(s) for +: 'int' and 'str'
とにかくすべきことである TypeError というエラーが表示されます。呼び出し元がそれをキャッチしたい場合、それは可能です。
タイプチェックをしたらどうしますか?エラーを表示しますよね?エラーはすでに自動的に表示されているため、型チェックを行う必要はありません。
さらに、型チェックを行っていないため、関数は他の型で動作します。
フロート:
>>> print myintfunction(2.2)
4.2
複素数:
>>> print myintfunction(5j)
(2+5j)
小数:
>>> import decimal
>>> myintfunction(decimal.Decimal('15'))
Decimal("17")
数字を追加できる完全に任意のオブジェクトでも!
>>> class MyAdderClass(object):
... def __radd__(self, value):
... print 'got some value: ', value
... return 25
...
>>> m = MyAdderClass()
>>> print myintfunction(m)
got some value: 2
25
したがって、型チェックでは明らかに何も得られません。そして、たくさん失う。
アップデート:
質問を編集したので、アプリケーションが int でのみ意味のあるアップストリーム ルーチンを呼び出していることは明らかです。
その場合は、受信したパラメーターを上流の関数に渡す必要があると思います。アップストリーム関数は、必要に応じてエラーを発生させるなど、正しく処理します。floatを渡すと、IP を処理する関数が奇妙に動作することはないと思います。図書館の名前を教えていただければ、それを確認できます。
しかし...アップストリーム関数が正しく動作せず、floatを渡すと一部の子供が殺される場合(私はまだそれを非常に疑っています)、それを呼び出すだけですint()
:
def myintfunction(value):
""" Please pass an integer """
return upstreamfunction(int(value))
あなたはまだ型チェックをしていないので、型チェックをしないことのほとんどの利点を得ることができます。
それでもなお、アプリケーションの可読性とパフォーマンスを低下させてまったくメリットがないにもかかわらず、本当に型チェックを行いたい場合は、 を使用しassert
てください。
assert isinstance(...)
assert type() is xxxx
そうすれば、 s をオフにして、この機能を次のように呼び出すことでプログラムからassert
削除できます。<sarcasm>
</sarcasm>
python -OO program.py