今天看了effective python(中文名:编写高质量python代码的59个有效方法)第4条,有所启发,具体代码是:
from urllib.parse import parse_qs
# 要从url中解码查询字符串,在下例中,每个参数表示一个整数值:
my_values = parse_qs('red=5&blue=0&green=',keep_blank_values=True)
print(my_values)
print(repr(my_values))
print('Red: ',my_values.get('red'))
print('Green: ',my_values.get('green'))
print('Opacity:',my_values.get('opacity'))
#如果有一个需求要实现,当参数返回空白时或者没有传此参数时能够返回默认值0,那么可以如下实现
#实现原理: 如果or操作符左侧的子表达式估值为False,那么整个表达式的值就是or操作右侧那个子表达式的值
red = my_values.get('red', [''])[0] or 0
green = my_values.get('green', [''])[0] or 0
opacity = my_values.get('opacity', [''])[0] or 0
print('Red: %r' % red)
print('Green: %r' % green)
print('Opacity: %r' % opacity)
#假如所需的参数值是数字,上面的的表达式还要换一下
red = int(my_values.get('red', [''])[0] or 0) # 这个表达式就很复杂了
# 如果用上三元操作符,可以如下写:
red = my_values.get('red', [''])
red = int(red[0]) if red[0] else 0 # 还是不够简单
# 更好的方法是使用函数,如果需要频繁使用这种逻辑,那么更应该用函数
def get_first_int(values, key, default=0):
found = values.get(key, [''])
if found[0]:
found = int(found[0])
else:
found = default
return found
red = get_first_int(my_values, 'red')
print(red)
要点:
- 开发者很容易过度运用python的语法特性,从而写出那种特别复杂并且难以理解的单行表达式。
- 请把复杂的表达式移入辅助函数之中,如果要反复使用相同的逻辑,那就更应该这么做。
- 使用if/else表达式(三元操作符),要比用or或and 这样的boolean操作符写成的表达式更加清晰。