4-Pythonic-用辅助函数来替代复杂式
在处理网页,或者说处理字符串时,我们经常获得到一个字典,对于字典里的键值对的处理挺关键的。然而有些朋友过度使用 Python 的语法特性,为了炫技,写成很复杂的难以理解的单行表达式,就有点小题大做了。
- 比如这样一个栗子。
from urllib.parse import parse_qs
# 解析字符串,返回字典
my_value = parse_qs('red=5&blue=0&green=', keep_blank_values=True)
print(my_value)
# {'red': ['5'], 'blue': ['0'], 'green': ['']}
- 对于上面待处理的字典,我们对其值感兴趣。
- 也就是我们想查询我们需要的值。
- 现在一个目标是,若待查询的参数没有出现在字符串中,我们希望返回默认值 0,而不返回 None 等。该如何处理呢?
- 也许我们会考虑 dic.get(key, defalt=None)
- key 指代键,如果查不到对应值,返回第二个参数 None
- 对于想要的目标,我们做出以下一步步调试。
4.1 复杂方式_1
- 空字符串、空列表及零值,都会评估为 False。
# For query string 'red=5&blue=0&green='
red = my_value.get('red', [''])[0] or 0 # or 操作符
green = my_value.get('green', [''])[0] or 0 # 如果 or 前判断 False
opacity = my_value.get('opacity', [''])[0] or 0 # 赋值 or 后语句
print('Red: %r' %red) # %r 用 rper()方法处理对象
print('green: %r' %green) # 打印时能够重现它所代表的对象
print('opacity: %r' %opacity)
# Red: '5'
# green: 0
# opacity: 0
4.2 炫技方式_2
red_1 = my_value.get('red', [''])
red_1 = int(red_1[0]) if red_1[0] else 0
print(red_1)
# 5
4.3 简单方式_3
green_1 = my_value.get('green', [''])
if green_1[0]: # 如果有值
green_1 = int(green_1[0])
else:
green_1 = 0
print(green_1)
# 0
4.4 范式_4
- 用简单函数的表示来取代复杂的表达式。
def get_int_value(dic_kv, key, default=0):
value = dic_kv.get(key, [''])
if value[0]:
return int(value[0])
else:
return default
print(get_int_value(my_value, 'opacity'))
print(get_int_value(my_value, 'red'))
# 0
# 5