不能读这个python格式(,)[。 。 ]

时间:2013-08-26 23:14:47

标签: python

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

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

看来这一行让proto'http''https'之间切换。

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

4 个答案:

答案 0 :(得分:10)

第二个元素(括号中)是将在第一个元素上使用的索引。所以在这种情况下,你有一个元组:

('http', 'https')

然后是一个布尔值,表示是否设置了self.https。如果是,则值为1,进行调用:

('http', 'https')[1]

这将从元组中选择https值。这利用了boolint的子类这一事实,可能被视为滥用:)

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'

此外,请注意您可以按TrueFalse(与10相同)从元组中获取项目:

>>> 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程序员中非常常见。