web-dev-qa-db-ja.com

isinstanceを使用してbooleanとintを比較する

次の場合にisinstance()がTrueを返す理由を誰かに説明してもらえますか?コードを書くときに、Falseを期待していました。

_print isinstance(True, (float, int))
True
_

私の推測では、Pythonの内部サブクラスは、0と1-floatまたはint-ブール値として使用すると評価されますが、正確な理由はわかりません。

そのような状況を解決するための最もPython的な方法は何でしょうか? type()を使用できますが、ほとんどの場合、これはPythonicではないと見なされます。

21
jake77

歴史的な理由から、boolintのサブクラスであるため、Trueintのインスタンスです。 (元々、Pythonはブール型を持たず、真理値を返すものは1または0を返しました。 bool 、TrueとFalseは、下位互換性のために可能な限り1と0のドロップイン置換である必要がありました。したがって、サブクラス化です。

これを「解決」する正しい方法は、問題が何であると考えるかによって異なります。

  • Trueintであるのをやめたい場合は、それは非常に悪いことです。それは起こりません。
  • ブール値を検出し、他のintとは異なる方法で処理する場合は、次のようにできます。

    if isinstance(whatever, bool):
        # special handling
    Elif isinstance(whatever, (float, int)):
        # other handling
    
  • 特定のクラスが正確にfloatまたはintであり、サブクラスを拒否するオブジェクトを検出する場合は、次のようにできます。

    if type(whatever) in (float, int):
        # Do stuff.
    
  • すべてのfloatとintを検出したい場合は、すでにそれを行っています。
38
user2357112

はい、これは正しいです。intのサブクラスです。インタープリターを使用して確認できます。

>>> int.__subclasses__()
[<type 'bool'>]
3
sbz

intのみを確認する場合:

if type(some_var) is int:
    return True

else:
    return False
1
Eyal Levin

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;
0
Venfah Nazir