为了账号安全,请及时绑定邮箱和手机立即绑定

字典和默认值

字典和默认值

慕妹3146593 2019-09-21 14:34:22
假设connectionDetails是Python字典,那么像这样的重构代码的最佳,最优雅,最“ pythonic”的方法是什么?if "host" in connectionDetails:    host = connectionDetails["host"]else:    host = someDefaultValue
查看完整描述

3 回答

?
慕神8447489

TA贡献1780条经验 获得超1个赞

像这样:


host = connectionDetails.get('host', someDefaultValue)


查看完整回答
反对 回复 2019-09-21
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

您也可以这样使用defaultdict:


from collections import defaultdict

a = defaultdict(lambda: "default", key="some_value")

a["blabla"] => "default"

a["key"] => "some_value"

您可以传递任何普通函数而不是lambda:


from collections import defaultdict

def a():

  return 4


b = defaultdict(a, key="some_value")

b['absent'] => 4

b['key'] => "some_value"


查看完整回答
反对 回复 2019-09-21
?
慕标琳琳

TA贡献1830条经验 获得超9个赞

虽然这.get()是一个很好的习惯用法,但是它比if/else(比try/except大多数情况下可以预期字典中键的存在要慢):


>>> timeit.timeit(setup="d={1:2, 3:4, 5:6, 7:8, 9:0}", 

... stmt="try:\n a=d[1]\nexcept KeyError:\n a=10")

0.07691968797894333

>>> timeit.timeit(setup="d={1:2, 3:4, 5:6, 7:8, 9:0}", 

... stmt="try:\n a=d[2]\nexcept KeyError:\n a=10")

0.4583777282275605

>>> timeit.timeit(setup="d={1:2, 3:4, 5:6, 7:8, 9:0}", 

... stmt="a=d.get(1, 10)")

0.17784020746671558

>>> timeit.timeit(setup="d={1:2, 3:4, 5:6, 7:8, 9:0}", 

... stmt="a=d.get(2, 10)")

0.17952161730158878

>>> timeit.timeit(setup="d={1:2, 3:4, 5:6, 7:8, 9:0}", 

... stmt="if 1 in d:\n a=d[1]\nelse:\n a=10")

0.10071221458065338

>>> timeit.timeit(setup="d={1:2, 3:4, 5:6, 7:8, 9:0}", 

... stmt="if 2 in d:\n a=d[2]\nelse:\n a=10")

0.06966537335119938


查看完整回答
反对 回复 2019-09-21
  • 3 回答
  • 0 关注
  • 469 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信