Python - 有趣的布尔值和字符串行为

时间:2015-09-28 11:39:11

标签: python python-2.7 boolean

当我遇到一些奇怪的一些陈述时,我正在阅读API的文档:

self.use_ssl = kwargs.get('use_ssl', True)
self.scheme = self.use_ssl and 'https://' or 'http://'

在进行一些个人测试后,我发现如果self.use_ssl设置为Trueself.scheme将设置为使用HTTPS,而self.use_sslFalse 1}}。令人敬畏的pythonic,我肯定会偷这个。

有人可以解释一下这是如何工作的吗?

3 个答案:

答案 0 :(得分:3)

在python中,空字符串相当于False,非空字符串相当于True

>>> bool('')
False
>>> bool('foo')
True

布尔表达式的行为描述为in the python 2 documentationpython 3的行为相同。

  

表达式x和y首先计算x;如果x为false,则返回其值;否则,评估y并返回结果值。

     

表达式x或y首先计算x;如果x为真,则返回其值;否则,评估y并返回结果值。

这就是为什么你得到字符串'https://'或'http://'取决于'self.use_ssl'的价值

一些例子,来自python控制台:

>>> True or ''
True
>>> True or 'foo'
True
>>> False or ''
''
>>> False or 'foo'
'foo'
>>> '' or True
True
>>> '' or False
False
>>> 'bar' or True
'bar'
>>> 'bar' or False
'bar'
>>> True and ''
''
>>> True and 'foo'
'foo'
>>> False and ''
False
>>> False and 'foo'
False
>>> '' and True
''
>>> '' and False
''
>>> 'bar' and True
True
>>> 'bar' and False
False

您始终可以使用bool()

将布尔表达式转换为实际布尔值
>>> 1 and 'bar'
'bar'
>>> bool(1 and 'bar')
True

答案 1 :(得分:1)

此技巧a and b or c仅在b本身为“真实”值时才有效。考虑True and "" or "foo"。您可能希望它生成空字符串,但它会产生foo,因为True and ""会产生空字符串,在评估False时会被视为"" or "foo"。正确的方法是将bc包装在一个列表中,以保证and的第二个参数是真实的(并且在任何一种情况下整体结果都是一个列表),然后提取该列表的第一个值:

(a and [b] or [c])[0]

为了避免创建和索引临时列表的笨拙(和效率低下),Python引入了条件表达式:

b if a else c

不依赖b具有任何特定的布尔值。

答案 2 :(得分:0)

它的工作原理如下:

当python交互时,它首先检查self.use_ssl是否为True 它继续在AND链中查看下一个语句是否为True。 因为下一个语句是一个字符串(而不是一个空字符串),所以它是True 所以没有必要继续这个或因为这个陈述已经确定为真,所以使用的最后一个值是' https'

如果use_ssl为false,则无需评估条件和部分条件,因为第一部分已经为假,因此python" skip"然后继续or部分检查是否为True,因为它再次是非空字符串,它是真的,并且使用的最后一个值是"返回"