Python程式碼閱讀(第38篇):根據謂詞函式和屬性字串構造判斷函式

Felix發表於2021-11-23
Python 程式碼閱讀合集介紹:為什麼不推薦Python初學者直接看專案原始碼

本篇閱讀的程式碼實現了根據給定的謂詞函式和屬性字串,來構造一個判別函式,用來判斷字典物件中相應的屬性是否滿足謂詞函式中的條件。

本篇閱讀的程式碼片段來自於30-seconds-of-python

check_prop

def check_prop(fn, prop):
  return lambda obj: fn(obj[prop])

# EXAMPLES
check_age = check_prop(lambda x: x >= 18, 'age')
user = {'name': 'Mark', 'age': 18}

check_age(user) # True

check_prop函式接收一個謂詞函式fn和屬性字串prop,返回一個判別函式。使用該判別函式,可以對字典物件的屬性進行判斷。

check_prop接收一個謂詞函式fn,在check_prop內部構造了一個匿名函式。該匿名函式的入參是obj(待判別的字典物件)。該匿名函式使用obj[prop]呼叫謂詞函式fn,判斷obj物件的屬性prop是否滿足特定的條件。最後check_prop函式返回這個匿名函式。

lambda表示式

形如lambda parameters: expression這樣的lambda表示式,會產生一個函式物件 。 該未命名物件的行為類似於用以下方式定義的函式:

def <lambda>(parameters):
  return expression

因此check_prop函式可以改寫成如下的形式:

def check_prop(fn, prop):
  def anonymous1(obj):
    return fn(obj[prop])
  return anonymous1

lambda x: x >= 18, 'age'可以寫成如下的匿名函式:

def anonymous2(x):
  return x >= 18

因此從check_prop(lambda x: x >= 18, 'age')返回的匿名函式如下:

def anonymous3(obj):
  return obj['age'] >= 18

check_age指向該匿名函式。check_age(user)將判斷user物件中的age屬性是否大於等於18

相關文章