2015-09-28 16 views
0

我是通過一個API的文檔閱讀,當我遇到一個奇怪的小組語句傳來:Python的 - 有趣的布爾和字符串行爲

self.use_ssl = kwargs.get('use_ssl', True) 
self.scheme = self.use_ssl and 'https://' or 'http://' 

做一些個人測試後,我發現,如果self.use_ssl設置爲Trueself.scheme將被設置爲使用HTTPS,並且如果self.use_sslFalse則HTTP。非常pythonic,我一定會偷這個。

有人可以解釋這是如何工作的?

+2

如果self.use_ssl else'http://''imo –

+0

同意@TimCastelijns,我將它讀作self.use_ssl和('https://' //'或'http://'),這是沒有意義的。 – SuperBiasedMan

+0

'self.scheme ='https://'if kwargs.get('use_ssl',True)else'http://' – Ananth

回答

3

在python中,空字符串等於False,非空字符串等於真

>>> bool('') 
False 
>>> bool('foo') 
True 

布爾表達式的行爲描述爲in the python 2 documentation,對於python 3也是如此。

表達式x和y首先計算x;如果x爲假,則返回其值;否則,評估y並返回結果值。

表達式x或y首先計算x;如果x爲真,則返回其值;否則,評估y並返回結果值。

這就是爲什麼你得到字符串的 'https://' 或 'HTTP://' 根據 'self.use_ssl'

一些例子,從蟒蛇控制檯值:

>>> True or '' 
True 
>>> True or 'foo' 
True 
>>> False or '' 
'' 
>>> False or 'foo' 
'foo' 
>>> '' or True 
True 
>>> '' or False 
False 
>>> 'bar' or True 
'bar' 
>>> 'bar' or False 
'bar' 
>>> True and '' 
'' 
>>> True and 'foo' 
'foo' 
>>> False and '' 
False 
>>> False and 'foo' 
False 
>>> '' and True 
'' 
>>> '' and False 
'' 
>>> 'bar' and True 
True 
>>> 'bar' and False 
False 

您可以隨時使用布爾()

>>> 1 and 'bar' 
'bar' 
>>> bool(1 and 'bar') 
True 
0

它的工作原理是這樣的:

當Python interapt的self.use_ssl如果這是真的 繼續在AND鏈這一點,首先檢查,以查看是否下面的語句是真。 因爲下一個語句是一個字符串(而不是空的)它是真的 所以沒有必要繼續或因爲這個語句已經definetly真,所以最後一個值使用女巫是'https'

如果USE_SSL是假的則沒有必要評估和部分條件的,因爲第一部已經false,所以蟒蛇「跳過」,並繼續執行or部分來檢查,如果這是真實的,因爲它再次是非空字符串是真的,並且最後一個使用的值是「返回的」

+0

多數民衆贊成在python的工作原理,使一個更簡單的例子'x = 1或0'將使x = 1,因爲它不需要繼續或部分,但'x = 1和0'將使x = 0。如果你想到這一點,說'x = True或False'和'x = True和False'並沒有多大區別,我可以遵循同樣的邏輯 – DorElias

+0

,但在我看來,'x = True和False'會導致'x = False',因爲'True和False'的計算結果爲False' –

+0

yea'x = True和False'將會是False,這就會發生什麼,(python會檢查第一條語句,它是是真的,因爲它是一個'和'它會繼續下一個語句巫婆是假的,所以它會停止並返回False),'x = True或False'將是真的 – DorElias

1

這一招,a and b or c,只能WH一個布爾表達式轉換爲真正的布爾值en b本身就是一個「真理」值。考慮True and "" or "foo"。您可能期望它生成空字符串,但它將生成foo,因爲True and ""會生成空字符串,因此在評估"" or "foo"時將被視爲False。正確的方法是將包bc在列表中以保證第二個參數and是truthy(以及總的結果是在兩種情況下的列表),然後提取該列表中的第一個值:

(a and [b] or [c])[0] 

要避免創建和索引的臨時列表的clunkiness(和低效率),Python中引入的條件表達式:

b if a else c 

其不依賴於b具有任何特定的布爾值。