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