2番目のものは実際に機能します(intに強制できないものでエラーが発生しないため)が、実際に何をしたいかによって異なります。純粋な Python で作業している場合、最善の方法はダック型です。このような関数は、何かが整数値であるかどうかをチェックするためのわずかな微調整です (したがって、たとえば、2.0
およびでも動作します2
。しかし、そうではありません'2'
が、エラーは発生しません:
def check3(n):
"prints 'n is an int' if the value is integral"
try:
val = int(n)
if val == n:
print("n is an int")
except ValueError:
pass # return False would also work
print("n is not an int")
対照的に、 と の違いを知ることが重要な場合1.0
(1
たとえば、int64 ndarray がある場合) は、インスタンスのチェックを使用することをお勧めcheck2
します。
要するに、これは intでなければならないのか、それとも単に整数のように振る舞うべきなのかという質問です。int でなければならない場合は check2 を使用し、int のように動作する必要がある場合は check2 を使用します (ただし、上記のように try/except 内に収まるように変更する必要があります)。
もう 1 つのオプションは、抽象基本クラスを使用して、int ライク (たとえば、整数であるが実際には int のサブクラスではない numpy int dtype) を許可するために抽象基本クラスを利用することnumbers.Integral
です。
def check4(n):
if isinstance(n, (int, numbers.Integral)):
print("n is an int")
else:
print("n is not an int")
余談ですが、check4
抽象基底クラスのインスタンス チェックのルックアップにはいくつかの処理が含まれるため、check3よりもはるかに低速です。