大家写 Python 时,有使用过第二种 dict.get 吗

2018-04-19 19:20:33 +08:00
 u14e

刚在 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'
3944 次点击
所在节点    Python
27 条回复
chroming
2018-04-19 19:26:03 +08:00
get 可以指定默认值
chroming
2018-04-19 19:26:51 +08:00
看错了。加 or 的太不优雅了,没用过
doubleflower
2018-04-19 19:28:58 +08:00
就环境变量当然是后者了,万一给环境设置一个空值呢,前一个还是会得到空
SimbaPeng
2018-04-19 19:29:39 +08:00
第二种又不是 dict.get 特有的,是很普通的短路求值
SimbaPeng
2018-04-19 19:32:45 +08:00
看场景需求,第一个是不存在使用备用值,第二个是不为真使用备用值
orangeade
2018-04-19 19:36:50 +08:00
还有一种是 collections 里的 default dict,更方便一些
bobuick
2018-04-19 19:39:51 +08:00
没看出来第 2 种用法,可能会存在不一样的逻辑么。

if None or 2 可以得到 2, if '' or 2 也可以得到 2 的, py 里 False 有很多种数据零值都会是 False

第一种里面只有取不到 Key 的 val 的时候,才会用提供的 default 值。
u14e
2018-04-19 19:44:11 +08:00
@bobuick 区别作者已经说过了,我就是看看大家平时用的是哪种
u14e
2018-04-19 19:46:45 +08:00
@SimbaPeng @doubleflower 大佬好理性
shihira
2018-04-19 19:59:36 +08:00
当然是第一种。第二种太奇怪了,摆着好好的内建参数不用,另辟蹊径还多出点 bug。
kindjeff
2018-04-19 20:07:15 +08:00
当然是 os.environ['SECRET_KEY']
kindjeff
2018-04-19 20:07:50 +08:00
环境变量没设的,应该直接 crash
phithon
2018-04-19 20:10:42 +08:00
只在 django 里见过
lance6716
2018-04-19 22:32:44 +08:00
我是遵循 EAFP 原则,虽然 try except 多了有点丑
lolizeppelin
2018-04-19 23:37:21 +08:00
用啊 一定不能为 k 不允许为 none 的时候 肯定用第二种啊
lolizeppelin
2018-04-19 23:44:18 +08:00
一般用 1 有需求就用 2

常见的用在 json 校验之后

前端有时候并不是那么方便弹出多余 key
所以校验要允许 key 为 null
但是取值的时候又要禁止空值 这时候就要用上 2 了
est
2018-04-20 00:04:35 +08:00
{"key": null}

所以要用第二种。
maemual
2018-04-20 00:38:44 +08:00
上面很多人没看懂啊,这两种写法的意义是完全不一样的
u14e
2018-04-20 00:45:31 +08:00
@lolizeppelin 谢谢大佬的分享
reself
2018-04-20 01:08:45 +08:00
@shihira 两者逻辑是不一样的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/448228

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX