如何从字典中修复字典中的默认值?

时间:2011-10-07 14:11:47

标签: python

我正在使用解析为python字典的JSON库解析JSON请求。由于请求是用户生成的,我需要修复未提供的参数的默认值。其他语言有像三元运算符这样的东西,对重复的应用程序有意义。但是下面的代码每个参数需要4行。

if "search_term" in request.keys():
    search_term=request['search_term']
else:
    search_term=""
if "start" in request.keys():
    start=request['start']
else:
    start=0
if "rows" in request.keys():
    rows=request['rows']
else:
    rows=1000000

是否有Pythonic方法来减少代码行或使其更具可读性?


编辑:两个(顶部)答案都同样有用。我在不同情况下使用了两者

4 个答案:

答案 0 :(得分:15)

在默认值的副本上使用dict.update方法:

defaults = dict(a=1, b=2, c=3)

result = dict(defaults)  # Copy the defaults
result.update(request)  # Update with your values

这允许您将defaults保留为类属性或模块全局变量,您可能希望这样做。

您还可以将最后两行合并到:

result = dict(defaults, **request)

有关其他解决方案,请参阅Kevin's answer

答案 1 :(得分:12)

您可以使用字典方法get,如果字典中不存在任何值,则第二个参数是默认值。

start = request.get('start', 0)

答案 2 :(得分:2)

Python词典有一个get()函数,它接受一个默认参数(你可以检查here)。所以你可以这样做:

params.get('search_term', '')
params.get('some_other_field', 0)

等等。

编辑::你可能想要使用上面的Petr的update解决方案。

答案 3 :(得分:2)

如果你有幸使用Python 3.3+,你可以使用collections.ChainMap

from collections import ChainMap

defaults = {'color': 'red', 'taste': 'sweet'}
request = {'taste': 'sour', 'size': 'small'}

result = ChainMap(request, defaults)

print(result['taste'])  # sour  -- overridden
print(result['color'])  # red   -- from default
print(result['size'])   # small -- new value

defaultsrequest dicts都与ChainMap“链接”,而不是复制。对它们的任何更改都将反映在result

defaults['color'] = 'green'
print(result['color'])   # green

del result['taste']
print(result['taste'])  # sweet

为了防止这种情况,您可以在完成构建后将ChainMap转换为dict。如果您需要处理isinstance(result, dict)

的傲慢代码,这也会有所帮助
print(dict(result))
# {'color': 'green', 'taste': 'sweet', 'size': 'small'}