当我遇到一些奇怪的一些陈述时,我正在阅读API的文档:
self.use_ssl = kwargs.get('use_ssl', True)
self.scheme = self.use_ssl and 'https://' or 'http://'
在进行一些个人测试后,我发现如果self.use_ssl
设置为True
,self.scheme
将设置为使用HTTPS,而self.use_ssl
为False
1}}。令人敬畏的pythonic,我肯定会偷这个。
有人可以解释一下这是如何工作的吗?
答案 0 :(得分:3)
在python中,空字符串相当于False,非空字符串相当于True
>>> bool('')
False
>>> bool('foo')
True
布尔表达式的行为描述为in the python 2 documentation,python 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"
。正确的方法是将b
和c
包装在一个列表中,以保证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,因为它再次是非空字符串,它是真的,并且使用的最后一个值是"返回"