我想测试一个值是True
还是None
,并认为编写此条件的pythonic方式是val in (True, None)
。
事实证明,如果val = 1
,则计算结果为 True。
我能找到的唯一方法是笨拙的val is True or val is None
。
1 in (True, None)
评估True
的更深层次原因是什么?有没有更紧凑的方式来编写上述条件?
True
是bool
继承自整数并且等于1
(但与1
不完全相同(。
help(bool)
输出:
class bool(int)
| bool(x) -> bool
|
| Returns True when the argument x is true, False otherwise.
| The builtins True and False are the only two instances of the class bool.
| The class bool is a subclass of the class int, and cannot be subclassed.
|
| Method resolution order:
| bool
| int
| object
但是因为True
继承自int
,我们应该能够用bool
做任何事情,就像我们用int
一样!
print(5 + True) # > 6
print(17 - False) # > 17
print(15//True) # > 15
print(10/False) # > raises ZeroDivisionError since False "=" 0
然而,要回答您的主要问题,即解释为什么1 in (True, None)
的计算结果为True
是因为in
运算符通过检查equality
(使用==
(而不是对象标识(使用is
(来工作。你发言中的None
与此无关;它可以是任何对象,您的语句仍将计算为True
.
print(1 == True) # > True
print(1 is True) # > False
True
1
,但从bool
方法中添加了一些额外的绒毛
我认为实现您所追求的pythonic方法是检查对象的身份是否包含在列表中(这是您建议的,但我们可以对其进行一些概括(
id(1) in [id(x) for x in [True, None]] # > False
从本质上讲,这只是in
运算符的更强版本。我们可以将其编写为函数:
def stronger_in(val, it):
return id(val) in [id(_) for _ in it]
print(stronger_in(1, (True, None)) # > False