我正在使用解析为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方法来减少代码行或使其更具可读性?
编辑:两个(顶部)答案都同样有用。我在不同情况下使用了两者
答案 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
defaults
和request
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'}