测试通过函数传递到 if 语句中的 Truthy 或 Falsy 参数

Testing Truthy or Falsy arguments passed through a function into an if statement

我也在画这个空白。如果有人能帮助我理解为什么我的代码没有打印出预期的输出,我将不胜感激:

def bool_to_str(bval):
    if bval is True:
        mytest = 'Yes'
    else:
        mytest = 'No'
    return mytest

预期输出:

>>>bool_to_str([1, 2, 3])
'Yes'
>>>bool_to_str(abcdef)
'Yes'

实际输出的是什么:

>>>bool_to_str([1, 2, 3])
'No'
>>>bool_to_str(abcdef)
'No'

请帮助我理解我做错了什么。我认为该函数需要测试参数的实际真值,但我不明白我遗漏了什么。

bval is True 检查 [1, 2, 3] 是否真的是 True 对象。您需要 bool() 之类的东西来评估对象是否为真值但与 True 对象不相同。

[1,2,3] 不等于 True,但是,如果您输入类似 1 的内容,则 1 == True 会通过,但是当您使用 is它永远是 False 除非它是 True

is 检查引用相等性,而不是真实性。现在显然 [1,2,3](这是一个 list 对象)确实 不指向 True 对象(这是 bool 对象)。很难说这里没有定义的abcdef是否指向True。但是因为你没有提供,我假设它指向不同的东西。

只有 bool_to_str(True)bool_to_str(<expr>) 其中 <expr> 计算结果为 boolTrue'Yes' 中(bool 是单例,所以所有 True 都是同一个对象)。

关键是为了检查<expr>的真实性,只需写if <expr>:。所以在你的情况下应该是:

if <b>bval</b>:

你也可以——虽然我建议反对它,用bool(..)明确检查真实性并检查引用相等性,如:

if <b>bool(</b>bval<b>) is True</b>:

通常写is不是一个好主意。仅当您想检查两个变量是否指向 same(即 not equivalent)对象时,或者对于像 TrueNone() 等一些单例对象,它真的很有意义。