次の場合にisinstance()
がTrueを返す理由を誰かに説明してもらえますか?コードを書くときに、Falseを期待していました。
_print isinstance(True, (float, int))
True
_
私の推測では、Pythonの内部サブクラスは、0と1-floatまたはint-ブール値として使用すると評価されますが、正確な理由はわかりません。
そのような状況を解決するための最もPython的な方法は何でしょうか? type()
を使用できますが、ほとんどの場合、これはPythonicではないと見なされます。
歴史的な理由から、bool
はint
のサブクラスであるため、True
はint
のインスタンスです。 (元々、Pythonはブール型を持たず、真理値を返すものは1または0を返しました。 bool
、TrueとFalseは、下位互換性のために可能な限り1と0のドロップイン置換である必要がありました。したがって、サブクラス化です。
これを「解決」する正しい方法は、問題が何であると考えるかによって異なります。
True
がint
であるのをやめたい場合は、それは非常に悪いことです。それは起こりません。ブール値を検出し、他のintとは異なる方法で処理する場合は、次のようにできます。
if isinstance(whatever, bool):
# special handling
Elif isinstance(whatever, (float, int)):
# other handling
特定のクラスが正確にfloat
またはint
であり、サブクラスを拒否するオブジェクトを検出する場合は、次のようにできます。
if type(whatever) in (float, int):
# Do stuff.
はい、これは正しいです。intのサブクラスです。インタープリターを使用して確認できます。
>>> int.__subclasses__()
[<type 'bool'>]
int
のみを確認する場合:
if type(some_var) is int:
return True
else:
return False
Boolおよびintでのpythonの動作(それほど奇妙ではない)を参照してください。
>>> 1 == True
True
>>> 0 == False
True
>>> True*5 == 0
False
>>> True*5 == 5
True
>>>
それらはどのように使用できますか...!
Boolobject.h(win py 2.7)から、bool objのintのtypedefを確認できます。したがって、boolがintの顔の特徴をほとんど継承していないことは明らかです。
#ifndef Py_BOOLOBJECT_H
#define Py_BOOLOBJECT_H
#ifdef __cplusplus
extern "C" {
#endif
typedef PyIntObject PyBoolObject;