Python中大家有使用过dict.get方法的第二种用法吗?

刚在 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’


Python中大家有使用过dict.get方法的第二种用法吗?

28 回复

get 可以指定默认值


dict.get(key, default) 的第二种用法就是那个 default 参数。这玩意儿贼好用,当你拿不准字典里有没有某个键的时候,用它就不会报 KeyError

比如你有个用户字典,想取用户的年龄,但有些用户可能没填年龄信息:

user = {'name': '张三', 'city': '北京'}
age = user.get('age', '未知')  # 返回 '未知'
print(f"年龄: {age}")

或者处理配置项的时候特别方便:

config = {'host': 'localhost', 'port': 8080}
timeout = config.get('timeout', 30)  # 默认30秒
debug = config.get('debug', False)   # 默认关闭调试

再举个实际点的例子,统计单词频率:

text = "hello world hello python world"
word_count = {}

for word in text.split():
    word_count[word] = word_count.get(word, 0) + 1

print(word_count)  # {'hello': 2, 'world': 2, 'python': 1}

这比先用 if key in dict 判断再取值要简洁多了。get() 方法就是让你用一行代码搞定“有就用,没有就用默认值”这种常见场景。

总结:get() 的默认值参数是处理缺失键的利器。

看错了。加 or 的太不优雅了,没用过

就环境变量当然是后者了,万一给环境设置一个空值呢,前一个还是会得到空

第二种又不是 dict.get 特有的,是很普通的短路求值

看场景需求,第一个是不存在使用备用值,第二个是不为真使用备用值

还有一种是 collections 里的 default dict,更方便一些

没看出来第 2 种用法,可能会存在不一样的逻辑么。

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

第一种里面只有取不到 Key 的 val 的时候,才会用提供的 default 值。

区别作者已经说过了,我就是看看大家平时用的是哪种

大佬好理性

当然是第一种。第二种太奇怪了,摆着好好的内建参数不用,另辟蹊径还多出点 bug。

当然是 os.environ[‘SECRET_KEY’]

环境变量没设的,应该直接 crash

只在 django 里见过

我是遵循 EAFP 原则,虽然 try except 多了有点丑

用啊 一定不能为 k 不允许为 none 的时候 肯定用第二种啊

一般用 1 有需求就用 2

常见的用在 json 校验之后

前端有时候并不是那么方便弹出多余 key
所以校验要允许 key 为 null
但是取值的时候又要禁止空值 这时候就要用上 2 了

{“key”: null}

所以要用第二种。

上面很多人没看懂啊,这两种写法的意义是完全不一样的

谢谢大佬的分享

两者逻辑是不一样的

有用过啊,
第一个是处理没有这个环境变量,返回后面的默认值。
第二个是指定环境变量默认值(可以没有,可以为空),返回默认值。

这个链接是 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

我记得可以这样写
index= request.value. get(‘index’, 0, type= int)

一般都是写成 SECRET_KEY = os.getenv(‘SECRET_KEY’, ‘Your Majesty’)

python<br><br>In [1]: di = {'a': 0}<br><br>In [2]: di.get('a') or 1<br>Out[2]: 1<br><br>In [3]: di.get('a', 1)<br>Out[3]: 0<br>

又学一招,感谢。

感谢,正好用到,会看复习下。

回到顶部