python优化之用辅助函数来取代复杂的表达式
抛出问题:
通常我们从URL中解码查询字符串:
test_values = parse_qs('parms_a=0&parms_b=2&parms_c=3&parms_d=', keep_blank_values=True)
print(test_values)
输出
{'parms_a': ['0'], 'parms_b': ['2'], 'parms_c': ['3'], 'parms_d': ['']}
这个时候我们拿到参数的方式一般是:
parms_a = test_values.get('parms_a')[0]
print(parms_a)
输出的是字符串的0
查询字符串中某些参数可能有多个值,某些参数可能只有一个值,某些参数可能是空白值,还有些参数可能没有出现在查询字符串中,如果待查询的参数没有出现在字符串中,或当该参数的值为空白的时候能够返回默认值0,那就更好了
接下来,我们改进一下
parms_q = test_values.get('parms_q', [''])[0] or 0
parms_a= test_values.get('parms_a', [''])[0] or 0
parms_b= test_values.get('parms_b', [''])[0] or 0
parms_c= test_values.get('parms_c', [''])[0] or 0
parms_d= test_values.get('parms_d', [''])[0] or 0
print(parms_q )
print(parms_a)
print(parms_b)
print(parms_c)
print(parms_d)
上述的意思是,如果字典里面有参数,我们就能拿到对应参数的值,如果没有,我们就拿到的是0
输出
0
0
2
3
0
注意:parms_a,parms_b,parms_c拿到的是str类型的0,因此我们需要转int
最终:
parms_q = test_values.get('parms_q', [''])[0] or 0
parms_a= int(test_values.get('parms_a', [''])[0]) or 0
parms_b= int(test_values.get('parms_b', [''])[0]) or 0
parms_c= int(test_values.get('parms_c', [''])[0]) or 0
parms_d= test_values.get('parms_d', [''])[0] or 0
print(parms_q, type(parms_q))
print(parms_a, type(parms_a))
print(parms_b, type(parms_b))
print(parms_c, type(parms_c))
print(parms_d, type(parms_d))
输出:
0 <class ‘int’>
0 <class ‘int’>
2 <class ‘int’>
3 <class ‘int’>
0 <class ‘int’>
我们可以看到这种写法读起来很困难,看上去很乱,这样的代码不容易被理解,初次拿到这种代码的人,可能需要花些时间拆解里面表达式,才能看懂作用,代码也不够简洁,你可以发现其中每一行的逻辑都基本相同,而且因此我们添加一个辅助函数来实现
def get_parms_int(values, key, default=0):
parms = values.get(key, [''])
if parms[0]:
parms = int(parms[0])
else:
parms = default
return parms
parms_q = get_parms_int(test_values, 'parms_q')
parms_a = get_parms_int(test_values, 'parms_a')
parms_b = get_parms_int(test_values, 'parms_b')
parms_c = get_parms_int(test_values, 'parms_c')
parms_d = get_parms_int(test_values, 'parms_d')
print(parms_q, type(parms_q))
print(parms_a, type(parms_a))
print(parms_b, type(parms_b))
print(parms_c, type(parms_c))
print(parms_d, type(parms_d))
输出:
0 <class ‘int’>
0 <class ‘int’>
2 <class ‘int’>
3 <class ‘int’>
0 <class ‘int’>
总结
- 以上只是一个举例,实际我们开发中,都可以将相同的逻辑封装成一个辅助函数去调用,这样一有问题,只需要改一下辅助函数,不影响其他地方的使用,这样也可以更好的维护代码及开发,要养成这样的思想
- 使用if/else表达式,要比用or 或者and 这样的Boolean操作符写成的表达式更加清晰