2011-10-07 77 views
5

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

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

由于没有其他人指出这一点的是,该行:**如果“行”在request.keys():**是相当于更简单:**如果请求中的“行”:**。 – MrWonderful

回答

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

+0

我喜欢这个作为dict.get()的替代方法,因为它允许你在一行上指定所有的默认值。如果您的默认值可能在将来发生变化,这可能很有用 - 那么您不必通过大量if语句来查找声明的位置。 – Kevin

+0

+1 - 提供一个中心位置来管理您的默认设置并且具有高度可维护性。好答案! –

+2

+1。这是一个很好的解决方案。我必须强调,这个方法必须和'defaults'一起使用,否则'defaults'会被修改。此外,逻辑不能翻转。执行'request.update(默认值)'会用默认值覆盖请求。 –

12

如果字典中没有值,可以使用字典方法get,其第二个参数是要返回的默认值。

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

+1此方法易读,易于理解。如果没有太多的默认值,我更喜欢它。 –

+1

希望我可以接受两个答案:-( – aitchnyu

2

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

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

等等。

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

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类型的字典的“链接”到ChainMap,不可复制。他们所做的任何更改将反映在result

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

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

为了防止这种情况,你可以转换一个ChainMap大功告成构建它时,快译通。这也帮助,如果你需要处理的傲慢代码,不会isinstance(result, dict)

print(dict(result)) 
# {'color': 'green', 'taste': 'sweet', 'size': 'small'} 
+0

不错,在http://code.activestate.com/recipes/305268/也有一个可用的2.x实现的ChainMap(拼写略有不同)(链接位于3.x文档,但我认为它也应该放在这里) – torek

+0

@torek真的,但在这种特殊情况下可能不值得麻烦。 –