我正在查看一些名为django-cas的库的代码,并发现了这一行:
protocol = ('http://', 'https://')[request.is_secure()]
这条线究竟是什么意思/做什么?
答案 0 :(得分:8)
它根据布尔结果选择两个值中的一个。
('http://', 'https://')
是一个元组request.is_secure()
生成布尔结果True
或False
。int
和True == 1
,False == 0
的子类。因此,如果请求是安全的(使用SSL加密,超过https
),protocol
也将设置为https://
。
更新版本的Python(2.5及更高版本)允许conditional expression,它更具可读性:
protocol = 'https://' if request.is_secure() else 'http://'
答案 1 :(得分:2)
这只是从元组中选择0
或1
索引元素,如
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"
答案 2 :(得分:2)
这相当于以下
protocol = 'https://' if request.is_secure() else 'http://'
我更喜欢这个聪明的索引技巧。
答案 3 :(得分:1)
request.is_secure()
将评估为True
;如果是非安全的(标准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://'
,那么:
True
False
和1
分别解析为整数0
和{{1}},因为bool
is a sub-class of int
。这样做的目的是确定用于链接的HTTP方案(安全或非安全)。
答案 4 :(得分:1)
这是python中一个聪明的三元运算符。根据布尔结果,它将选择这两个字符串中的一个。
如果False
(0)选择第一个,而True
(1)选择第二个。
看起来像这样:
>>>('http://', 'https://')[False]
'http://'
>>>('http://', 'https://')[True]
'https://'
也可以这样实现:
protocol = 'https://' if request.is_secure() else 'http://'
答案 5 :(得分:1)
protocols = ('http://', 'https://')
这会创建两个可能协议的两项元组
secure = request.is_secure()
返回True或False,相当于0或1
protocols[secure]
这会选择与安全性相匹配的正确元素
答案 6 :(得分:0)
request.is_secure()
会返回True
或False
。
因此,如果它是True
,它从列表中选择索引1中的项目(True
等于1),否则它从列表中选择索引0中的项目。
因此,http
和https
分别指出不安全和不安全。