我是新手,我正在阅读这样的代码片段:
...
proto = ('http', 'https')[bool(self.https)]
...
看起来这条线正在和proto
之间切换。'http'
'https'
但这是什么( , )[ .. ]
意思?我怎样才能利用这种风格?
我是新手,我正在阅读这样的代码片段:
...
proto = ('http', 'https')[bool(self.https)]
...
看起来这条线正在和proto
之间切换。'http'
'https'
但这是什么( , )[ .. ]
意思?我怎样才能利用这种风格?
第二个元素(在括号中)是将在第一个元素上使用的索引。所以在这种情况下,你有一个元组:
('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,)
要了解这项技术的酷炫用法,请查看此视频中的 2:14(这也恰好是一个很棒的视频!)。它索引一个字符串 ( '^ '
) 而不是一个元组,但概念是相同的。
它是一个“切换器”。这只是一个简短的形式:
proto = 'https' if self.https else 'http'
或者
if self.https:
proto = 'https'
else:
proto = 'http'
另外,请注意您可以通过True
and (与False
by 相同)从元组中获取项目:1
0
>>> print ('http', 'https')[True]
https
>>> print ('http', 'https')[False]
http
>>> print ('http', 'https')[1]
https
>>> print ('http', 'https')[0]
http
这是一种密集的风格(并且不太流行),使用布尔值只能是 0(假)或 1(真)的事实,它们正是零索引的两个元素列表或元组的索引。
也许有点令人困惑,索引是作为 a 给出的bool
,但是:
>>> int(bool(False))
0
>>> int(bool(True))
1
还
...布尔值是普通整数的子类型。
来自:http ://docs.python.org/2/library/stdtypes.html#numeric-types-int-float-long-complex
('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'
表单'https' if self.https else 'http'
是在 Python 2.5 中引入的。以前,您展示的几种形式在 Python 程序员中很常见。