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

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

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

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

常见的用在 json 校验之后

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

所以要用第二种。
maemual
2018 年 4 月 20 日
上面很多人没看懂啊,这两种写法的意义是完全不一样的
u14e
2018 年 4 月 20 日
@lolizeppelin 谢谢大佬的分享
reself
2018 年 4 月 20 日
@shihira 两者逻辑是不一样的

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

https://study.congcong.us/t/448228

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

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

© 2021 V2EX