【Effective Python】4-Pythonic-用辅助函数来替代复杂式

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章