2014-10-17 62 views
1

我很難理解這段代碼。 我知道我們正在使用一些模擬而不是API端點來節省測試時間。classmethod lambda Python

我不明白的是classmethod(lambda cls:self.preapproval)結構。 如果在我沒有使用的代碼中使用lambda cls,什麼意思?

我希望我足夠清楚,我會很高興,如果有人能在這一個閃耀光芒的人..

非常感謝。

@patch("paypaladaptive.api.endpoints.UrlRequest", 
     MockUrlRequestPreapproval) 
def test_preapproval(self): 
    # I don't understand this code, it is very confusing. Why do I need to use a lambda structure if in the code itself I don't use cls (self.preapproval) 
    MockUrlRequestPreapproval.preapproval = (
     classmethod(lambda cls: self.preapproval)) 
    self.assertTrue(self.preapproval.process()) 
    self.preapproval = Preapproval.objects.get(pk=self.preapproval.pk) 
    self.assertNotEqual(self.preapproval.preapproval_key, "") 
    self.assertEqual(self.preapproval.status, "created") 

回答

1

classmethod的第一個參數需要是一個函數,它需要一個參數或更多。調用任何這將導致一個錯誤:

classmethod(self.preapproval) # Not a function 
classmethod(lambda: self.preapproval) # Needs one argument 

這工作,但它太冗長:

def get_preapproval(cls): 
    return self.preapproval 

classmethod(get_preapproval) 

這就是爲什麼該代碼使用拉姆達。

大概可以提高一點點:

classmethod(lambda _: self.preapproval) 

這使得很明顯,不需要爭論。

+0

@ GP89嗯,對,它可以採取> = 1,因爲類需要通過。謝謝! – parchment 2014-10-17 14:06:27

+0

這使得它更清晰。 但是,爲什麼我們需要在第一個地方的classmethod因此。 難道我們不能只把lambda? 甚至更​​好,爲什麼不只是:MockUrlRequestPreapproval.preapproval = self.preapproval – cyberjoac 2014-10-18 08:09:02

+0

我認爲這是因爲其他代碼需要一個classmethod。做其他事情可能會改變班級的行爲。 @cyberjoac – parchment 2014-10-18 08:35:08

0

cls只是lambda的參數名!而你根本不使用它! lambda cls: self.preapproval)產生classmethod的功能對象! ,因爲lambda產生一個函數對象,你需要使用它來傳遞self.preapproval,因爲classmethod s第一個參數需要是一個函數對象!

+0

你會如何編寫這個代碼更具可讀性?爲什麼它應該是一個classmethod,並首先使用lambda? – cyberjoac 2014-10-17 13:49:19

+0

as lambda生成一個函數對象,因爲'classmethod'的第一個參數需要使用它作爲通過'self.preapproval'的函數對象! – Kasramvd 2014-10-17 14:00:28