我是新手,我正在阅读这样一段代码:
...
proto = ('http', 'https')[bool(self.https)]
...
看来这一行让proto
在'http'
和'https'
之间切换。
但( , )[ .. ]
是什么意思?我怎样才能利用这种风格?
答案 0 :(得分:10)
第二个元素(括号中)是将在第一个元素上使用的索引。所以在这种情况下,你有一个元组:
('http', 'https')
然后是一个布尔值,表示是否设置了self.https
。如果是,则值为1
,进行调用:
('http', 'https')[1]
这将从元组中选择https
值。这利用了bool
是int
的子类这一事实,可能被视为滥用:)
In [1]: t = ('http', 'https')
In [2]: t[0]
Out[2]: 'http'
In [3]: t[1]
Out[3]: 'https'
In [4]: https_setting = True
In [5]: int(https_setting)
Out[5]: 1
In [6]: t[bool(https_setting)]
Out[6]: 'https'
In [7]: True.__class__.__bases__
Out[7]: (int,)
对于这项技术的一个很酷的用法,请查看this视频中的2:14(这也恰好是一个很棒的视频!)。它索引一个字符串('^ '
)而不是一个元组,但概念是相同的。
答案 1 :(得分:1)
这是一个“切换器”。这只是一个简短的形式:
proto = 'https' if self.https else 'http'
或
if self.https:
proto = 'https'
else:
proto = 'http'
此外,请注意您可以按True
和False
(与1
和0
相同)从元组中获取项目:
>>> print ('http', 'https')[True]
https
>>> print ('http', 'https')[False]
http
>>> print ('http', 'https')[1]
https
>>> print ('http', 'https')[0]
http
答案 2 :(得分:1)
这是一种密集的风格(并不太受欢迎),使用这样的事实,布尔值只能是0(False)或1(True),它们恰好是零索引的两个元素列表或元组的索引
可能有点令人困惑,索引是bool
,但是:
>>> int(bool(False))
0
>>> int(bool(True))
1
另外
......布尔值是普通整数的子类型。
来自:http://docs.python.org/2/library/stdtypes.html#numeric-types-int-float-long-complex
答案 3 :(得分:0)
('http','https')
是一个元组。作为所有元组,其元素可以通过索引(在这种情况下为0和1)来解决。
bool(self.https)
将self.https
转换为布尔值。但是,在Python中,布尔值表示为整数0(表示假)和1(表示真)。所以,
('http','https')[bool(self.https)]
相当于:
('http','https')[0] # ('http') when self.https is false, or
('http','https')[1] # ('https') when self.https is true
或
'https' if self.https else 'http'
可以大致理解为
if self.https :
'https'
else:
'http'
使用Python 2.5引入了表单'https' if self.https else 'http'
。以前,您展示的几种表单在Python程序员中非常常见。