4

我是新手,我正在阅读这样的代码片段:

...
proto = ('http', 'https')[bool(self.https)]
...

看起来这条线正在和proto之间切换。'http''https'

但这是什么( , )[ .. ]意思?我怎样才能利用这种风格?

4

4 回答 4

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,)

要了解这项技术的酷炫用法,请查看视频中的 2:14(这也恰好是一个很棒的视频!)。它索引一个字符串 ( '^ ') 而不是一个元组,但概念是相同的。

于 2013-08-26T23:17:26.537 回答
1

它是一个“切换器”。这只是一个简短的形式:

proto = 'https' if self.https else 'http'

或者

if self.https:
    proto = 'https'
else:
    proto = 'http'

另外,请注意您可以通过Trueand (与Falseby 相同)从元组中获取项目:10

>>> print ('http', 'https')[True]
https
>>> print ('http', 'https')[False]
http
>>> print ('http', 'https')[1]
https
>>> print ('http', 'https')[0]
http
于 2013-08-26T23:17:18.577 回答
1

这是一种密集的风格(并且不太流行),使用布尔值只能是 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

于 2013-08-26T23:17:30.440 回答
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'

表单'https' if self.https else 'http'是在 Python 2.5 中引入的。以前,您展示的几种形式在 Python 程序员中很常见。

于 2013-08-26T23:24:33.260 回答