2014-02-27 139 views
1

我一直在尋找通過一些代碼名爲Django的CAS庫,並看準了這一行:這個python語法是什麼意思?

protocol = ('http://', 'https://')[request.is_secure()] 

究竟這條線意味着什麼/怎麼辦?

+0

這個問題的重複,http://stackoverflow.com/questions/1947030/how-does-the-python-conditional-operator-workaround-work。這只是理解重寫的if-else的問題。 – RacerNerd

回答

2

這只是選擇從元組01指數元素,如 True等於1,並且False等於0

>>> secure = True 
>>> ('http','https')[0] 
'http' 
>>> ('http','https')[1] 
'https' 
>>> ('http','https')[secure] 
'https' 
>>> ('http','https')[False] 
'http' 

然而,這樣做的清潔方法是:

protocol = "http" if request.is_secure() else "https" 
8

它根據布爾結果選擇兩個值中的一個。

  • ('http://', 'https://')是一個元組
  • request.is_secure()產生一個布爾結果,TrueFalse
  • 布爾值是intTrue == 1False == 0的子類。

因此,如果請求是安全的(使用SSL加密,經https)的將被設置爲https://太。

更多的Python最新版本(2.5及以上)允許一個conditional expression,這將是更易讀:如果連接是安全的

protocol = 'https://' if request.is_secure() else 'http://' 
+0

+1是第一個添加更傳統的方法來做到這一點。 (我打開了頁面,並且編輯在各處都在發生) – Josay

1

request.is_secure()將評估爲TrueHTTPS:HTTP基於TLS)或者如果不安全(標準HTTP),則爲False

所以,如果request.is_secure()True,則:

protocol = ('http://', 'https://')[request.is_secure()] 
# Will resolve as: 
protocol = ('http://', 'https://')[True] 
# Which is: 
protocol = ('http://', 'https://')[1] 
# And results in. 
protocol == 'https://' 

或者,如果request.is_secure()False,則:

protocol = ('http://', 'https://')[request.is_secure()] 
# Will resolve as: 
protocol = ('http://', 'https://')[False] 
# Which is: 
protocol = ('http://', 'https://')[0] 
# And results in. 
protocol == 'http://' 

這樣做的目的是確定用於鏈接的HTTP方案(安全或非安全)。

1

這是一個聰明的三元運算符在python中。根據布爾結果,它將選擇這兩個字符串中的一個。

如果False(0)會選第一個,如果是True(1)第二個。

看它像這樣:

>>>('http://', 'https://')[False] 
'http://' 

>>>('http://', 'https://')[True] 
'https://' 

它也可以實現這樣的:

protocol = 'https://' if request.is_secure() else 'http://' 
1
protocols = ('http://', 'https://') 

這將創建兩個可能的協議,兩項目的元組

secure = request.is_secure() 

這將返回True或假,相當於0或1

protocols[secure] 

此挑選符合安全

2

這等同於以下

protocol = 'https://' if request.is_secure() else 'http://' 

我喜歡這種巧妙的索引技巧正確的元素。

0

request.is_secure()返回TrueFalse。 因此如果它是True,它從列表中選擇索引1中的項目(True等於1),否則它從列表中選擇索引0中的項目。

因此,httphttps分別指向不安全和安全。