每日10行程式碼52:編寫高質量python程式碼方法4——用輔助函式來取代複雜的表示式

天天卡丁發表於2020-10-15

今天看了effective python第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)

要點:

  1. 開發者很容易過度運用python的語法特性,從而寫出那種特別複雜並且難以理解的單行表示式。
  2. 請把複雜的表示式移入輔助函式之中,如果要反覆使用相同的邏輯,那就更應該這麼做。
  3. 使用if/else表示式(三元操作符),要比用or或and 這樣的boolean操作符寫成的表示式更加清晰。

相關文章