`if x:`完全等同于`如果bool(x)为True:`?

时间:2016-07-21 17:44:02

标签: python

对于我们正在编写的小型测试框架,我正在尝试提供一些实用程序功能。

其中一个应该等同于if x:但如果完全等同于if bool(x) is True:那么我只能提供一个函数来检查if x is True:if x:

这种否定也是等同的吗? if bool(x) is False:等于if not x:

3 个答案:

答案 0 :(得分:6)

if x: 完全等同于测试布尔值真值,是的。

来自if statement documentation

  

它通过逐个评估表达式来选择其中一个套件,直到找到一个为真(请参阅Boolean operations部分了解true和false的定义)

Boolean operations section详细说明了如何定义真相。 bool() function遵循完全相同的规则:

  

返回一个布尔值,即True或False之一。 x使用标准真值测试程序进行转换。

标准类型文档有Truth Value Testing section

  

可以测试任何对象的真值,以便在ifwhile条件下使用,或者作为下面布尔运算的操作数。

not只是反转相同的真值;因此,如果x被上述规则视为真,则not x会返回False,否则会返回True

注意:在Python 2中,通过设置全局,内置名称FalseTrue可以屏蔽

>>> True = False
>>> True
False

因此is身份测试也可能被重新分配所欺骗。 Python 3会生成FalseTrue个关键字。

您的效用函数不需要使用bool(x) is Truebool(x) is False。您只需要bool(x)not bool(x),因为这些已经生成TrueFalse个对象。 bool()not无法返回任何其他内容,在is True上使用is Falseunittest非常多余。

最后但同样重要的是,尽量不要重新发明测试轮。 Python标准库附带一个assertTrue库;它有assertFalseif个函数,implementation of these functions只使用if notsc.getPersistentRDDs

答案 1 :(得分:2)

是。这些是等价的。 bool使用的规则与not使用的规则相同。 category = c(rep(c("a","b","c"),100)) x = (rep(1:5,60)) y = rnorm(300,10,3) # I made these positive values df = data.frame(category,x,y) 只是在不改变确定真实性或虚假性的逻辑的情况下反转这些值。

答案 2 :(得分:1)

除了@Martijn的答案之外,如果您正在构建的是某个类,您可以通过定义ìf x函数来定义您希望它在__bool__这样的真值测试用例中具有的行为。

>>> class A:
        pass

>>> a=A()
>>> if a:
        print("this instance class is truthish")

this instance class is truthish
>>> a is True
False
>>> bool(a) is True
True
>>> 

用户定义类的默认行为在真值测试中始终为true,要更改它只是在python 2中定义__bool____nonzero__),因此它会根据语义调整类,例如:

>>> class Switch:
        def __init__(self, state="off"):
            self.state = state
        def __bool__(self):
            if self.state == "on":
                return True
            return False


>>> x=Switch()
>>> if x:
        print("this instance class is truthish")


>>> x is True
False
>>> bool(x) is True
False
>>> x.state="on"
>>> if x:
        print("this instance class is truthish")

this instance class is truthish
>>> x is True
False
>>> bool(x) is True
True
>>>