2013-08-26 45 views
4

我是新手,我讀的代碼片段是這樣的:不能讀取這個python格式(,)[。 。 ]

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

它看起來像這條線讓proto'http''https'之間切換。

但是(,)[ .. ]是什麼意思?我怎樣才能使用這種風格?

+4

請注意,在風格上,我寧願看到''https'如果self.https else'http'' - 這可能是Python之前的舊代碼有三元運算符。 –

回答

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(這也恰好成爲一部非常棒的視頻!)。它索引一個字符串('^ ')而不是一個元組,但概念是相同的。

+0

所以它看起來像一個enum.thanks你的解釋,我也測試這個工作是否爲好奇名單也工作,它的工作原理! –

+0

@ user2166063沒問題,很高興幫助。既然你提到你只是在學習,你可以看看[this](http://effbot.org/zone/python-list.htm),它着重於列表,但是包含索引(使用'[]'在這種情況下,將該項目放在索引位置)。祝你好運! – RocketDonkey

+0

生病了看看吧!再次感謝。 –

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 
+3

不短得多,內聯if/else比強制索引提供更多的可讀性...... –

+0

@JoranBeasley是的,內聯風格更加pythonic我認爲。 – alecxe

+0

事實上,沒有舊的和多餘的那麼短。 –

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程序員中,你展示的幾種形式非常普遍。