jak*_*e77 28 python int comparison boolean isinstance
有人可以给我一个解释,为什么isinstance()在下列情况下返回True?编写代码时,我期待False.
print isinstance(True, (float, int))
True
Run Code Online (Sandbox Code Playgroud)
我的猜测是它的python的内部子类,如0和1 - wheter float或int - 在用作布尔值时都会计算,但不知道确切的原因.
什么是解决这种情况的最pythonic方式?我可以使用,type()但在大多数情况下,这被认为是较少pythonic.
use*_*ica 46
由于历史原因,bool是一个子类int,所以True是一个实例int.(最初,Python没有bool类型,返回真值的东西返回1或0. 当它们添加时bool,True和False必须尽可能地为1和0替换为向后兼容,因此子类化. )
"解决"这个问题的正确方法取决于您认为问题的确切原因.
True停止int,好,太糟糕了.这不会发生.如果您想检测布尔值并以不同于其他整数的方式处理它们,您可以这样做:
if isinstance(whatever, bool):
# special handling
elif isinstance(whatever, (float, int)):
# other handling
Run Code Online (Sandbox Code Playgroud)如果要检测特定类完全相同的对象,float或者int拒绝子类,则可以执行以下操作:
if type(whatever) in (float, int):
# Do stuff.
Run Code Online (Sandbox Code Playgroud)Vic*_*bot 11
您可以查看方法解析顺序,并从那里找到所有超类:
>>> bool.__mro__
(<class 'bool'>, <class 'int'>, <class 'object'>)
Run Code Online (Sandbox Code Playgroud)
是的,没错,它是 int 的子类,您可以使用解释器进行验证:
>>> int.__subclasses__()
[<type 'bool'>]
Run Code Online (Sandbox Code Playgroud)
如果您只想检查int:
if type(some_var) is int:
return True
else:
return False
Run Code Online (Sandbox Code Playgroud)