これらは同じものではありません。次の 2 行を比較します。
if type(x) == int or float:
if type(x) == int or type(x) == float:
そして、それが違いです。
最初のものは をチェックtype(x) == int
し、結果を取得して でor
処理するため、 が である場合はfloat
を返し、それ以外の場合はを返します。とはどちらも真の値であるため、その部分は常に発生し、は決して発生しません。True
x
int
float
True
float
if
else
type(x) == int
2 つ目は、 、type(x) == float
、 をチェックして、or
それらをまとめて ing することです。したがって、True
if x
isint
または if x
is a float
、およびFalse
if it is a を返します。
in
演算子を使用してコードを簡略化できます。
if type(x) in (int, float)
しかし、それはまだあまり良い Python ではありません。本当にタイプを切り替えたい場合は、ほとんどの場合isinstance
、タイプを比較するのではなく、次のようにします。
if isinstance(x, (int, float)):
これは、たとえば のサブクラスが渡された場合にコードが機能することを意味しますint
。int
しかし、たとえば、 のラッパー、またはカスタム設計された整数型、さらには (Python 2.x では) aに対しては機能しませんlong
。したがって、より良いバージョンは次のとおりです。
if isinstance(x, numbers.Real)
float
これは、int
、long
、およびその他のさまざまな組み込み型、それらの型のサブクラス、およびnumbers.Real
ABCに自身を登録するものに対して True を返します。
しかし、実際には、通常、タイプの切り替えはまったく必要ありません。Python はダックタイピングを中心に設計されています。ここで気にすることは、それを に正常に渡すことができるということですabs
。それができる限り、それが実際にどのような特定のタイプであるかを誰が気にしますか? そう:
try:
return abs(x)
except TypeError:
return "Not a number!"
または、さらに良いことに、例外をキャッチして文字列を返すのではなく (これは、呼び出し元が数字と文字列の両方を処理する必要があることを意味します)、例外を伝播させます。
return abs(x)