classmethod lambda Python

时间:2014-10-17 13:45:22

标签: python lambda mocking class-method

我很难理解这段代码。 我知道我们正在使用一些模拟而不是API端点来节省测试时间。

我不理解的是classmethod(lambda cls:self.preapproval)结构。 如果在我不在所有cl中使用的代码中使用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")

2 个答案:

答案 0 :(得分: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)

这就是代码使用lambda的原因。

可能会有所改善:

classmethod(lambda _: self.preapproval)

这显然不需要参数。

答案 1 :(得分:0)

cls只是lambda的参数名称!而你根本不使用它! lambda cls: self.preapproval)classmethod生成一个函数对象! ,当lambda产生一个函数对象时,你需要将它用于传递self.preapproval,因为classmethod的第一个参数需要是一个函数对象!