2014-02-27 143 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分别指向不安全和安全。