刚在 https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-iii-web-forms 评论下面看到作者说起下面这两种写法的区别,想问问 v 友用的是哪种
# case1
SECRET_KEY = os.environ.get('SECRET_KEY', 'Your Majesty')
# case2
SECRET_KEY = os.environ.get('SECRET_KEY') or 'Your Majesty'
1
chroming 2018-04-19 19:26:03 +08:00 via Android
get 可以指定默认值
|
2
chroming 2018-04-19 19:26:51 +08:00 via Android
看错了。加 or 的太不优雅了,没用过
|
3
doubleflower 2018-04-19 19:28:58 +08:00
就环境变量当然是后者了,万一给环境设置一个空值呢,前一个还是会得到空
|
4
SimbaPeng 2018-04-19 19:29:39 +08:00
第二种又不是 dict.get 特有的,是很普通的短路求值
|
5
SimbaPeng 2018-04-19 19:32:45 +08:00
看场景需求,第一个是不存在使用备用值,第二个是不为真使用备用值
|
6
orangeade 2018-04-19 19:36:50 +08:00 via Android
还有一种是 collections 里的 default dict,更方便一些
|
7
bobuick 2018-04-19 19:39:51 +08:00 1
没看出来第 2 种用法,可能会存在不一样的逻辑么。
if None or 2 可以得到 2, if '' or 2 也可以得到 2 的, py 里 False 有很多种数据零值都会是 False 第一种里面只有取不到 Key 的 val 的时候,才会用提供的 default 值。 |
9
u14e OP @SimbaPeng @doubleflower 大佬好理性
|
10
shihira 2018-04-19 19:59:36 +08:00
当然是第一种。第二种太奇怪了,摆着好好的内建参数不用,另辟蹊径还多出点 bug。
|
11
kindjeff 2018-04-19 20:07:15 +08:00
当然是 os.environ['SECRET_KEY']
|
12
kindjeff 2018-04-19 20:07:50 +08:00
环境变量没设的,应该直接 crash
|
13
phithon 2018-04-19 20:10:42 +08:00
只在 django 里见过
|
14
lance6716 2018-04-19 22:32:44 +08:00 via Android
我是遵循 EAFP 原则,虽然 try except 多了有点丑
|
15
lolizeppelin 2018-04-19 23:37:21 +08:00 via Android
用啊 一定不能为 k 不允许为 none 的时候 肯定用第二种啊
|
16
lolizeppelin 2018-04-19 23:44:18 +08:00 via Android
一般用 1 有需求就用 2
常见的用在 json 校验之后 前端有时候并不是那么方便弹出多余 key 所以校验要允许 key 为 null 但是取值的时候又要禁止空值 这时候就要用上 2 了 |
17
est 2018-04-20 00:04:35 +08:00
{"key": null}
所以要用第二种。 |
18
maemual 2018-04-20 00:38:44 +08:00 via iPhone 1
上面很多人没看懂啊,这两种写法的意义是完全不一样的
|
19
u14e OP @lolizeppelin 谢谢大佬的分享
|
21
vakara 2018-04-20 10:15:36 +08:00
有用过啊,
第一个是处理没有这个环境变量,返回后面的默认值。 第二个是指定环境变量默认值(可以没有,可以为空),返回默认值。 |
22
vipppppp 2018-04-20 11:27:07 +08:00
这个链接是 flask
。。之前中途接手了一个 flask 项目,由于前后端没有沟通好,很无奈采取了一个很蛋疼的操作。 举个简单的例子: index = request.value.get('index', 0) 可是这个我的 index 要是一个整数!! 然后 get 请求的参数一般是 string 类型。。 于是我: index = int(request.value.get('index', 0)) 可是无奈的是,有时 url 是?index=&... index 来了个 None 值。。 于是: index = int(request.value.get('index') or 0) T_T |
23
di94sh 2018-04-20 11:39:28 +08:00 via Android
@vipppppp 我记得可以这样写
index= request.value. get('index', 0, type= int) |
24
OldPanda 2018-04-20 14:13:29 +08:00
一般都是写成 SECRET_KEY = os.getenv('SECRET_KEY', 'Your Majesty')
|
25
aliao0019 2018-04-20 16:35:53 +08:00
```python
In [1]: di = {'a': 0} In [2]: di.get('a') or 1 Out[2]: 1 In [3]: di.get('a', 1) Out[3]: 0 ``` |
26
Kylin30 2018-04-25 01:25:37 +08:00
又学一招,感谢。
|
27
smdbh 2018-05-02 14:32:56 +08:00
感谢,正好用到,会看复习下。
|