这个python语法是什么意思?

时间:2014-02-27 18:11:36

标签: python

我正在查看一些名为django-cas的库的代码,并发现了这一行:

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

这条线究竟是什么意思/做什么?

7 个答案:

答案 0 :(得分:8)

它根据布尔结果选择两个值中的一个。

  • ('http://', 'https://')是一个元组
  • request.is_secure()生成布尔结果TrueFalse
  • 布尔值是intTrue == 1False == 0的子类。

因此,如果请求是安全的(使用SSL加密,超过https),protocol也将设置为https://

更新版本的Python(2.5及更高版本)允许conditional expression,它更具可读性:

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

答案 1 :(得分:2)

这只是从元组中选择01索引元素,如 True等于1False等于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)

如果连接是安全的(HTTPS:HTTP over TLS),则

request.is_secure()将评估为True;如果是非安全的(标准HTTP),则False评估为request.is_secure()

因此,如果Trueprotocol = ('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()

或者,如果Falseprotocol = ('http://', 'https://')[request.is_secure()] # Will resolve as: protocol = ('http://', 'https://')[False] # Which is: protocol = ('http://', 'https://')[0] # And results in. protocol == 'http://' ,那么:

True

这样做的目的是确定用于链接的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()会返回TrueFalse。 因此,如果它是True,它从列表中选择索引1中的项目(True等于1),否则它从列表中选择索引0中的项目。

因此,httphttps分别指出不安全和不安全。