2014-10-17 60 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