2014-10-17 3 views
1

이 코드를 이해하는 데 어려움이 있습니다. 테스트에서 시간을 절약하기 위해 API 엔드 포인트 대신 모의 (mock)를 사용하는 것으로 알고 있습니다.classmethod 람다 파이썬

내가 이해하지 못하는 것은 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") 

답변

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

+0

그게 훨씬 명확합니다. 그러나 왜 우리는 첫 번째 방법으로 수업 방법이 필요한가? 람다 만 넣을 수는 없습니까? 또는 더 나은 이유는 무엇입니까? MockUrlRequestPreapproval.preapproval = self.preapproval – cyberjoac

+0

나머지 코드는 classmethod를 기대하기 때문에 생각합니다. 다른 것을하면 수업의 행동이 바뀔 수 있습니다. @cyberjoac – parchment

0

cls은 람다에 대한 인수 이름입니다. 그리고 당신은 그것을 전혀 사용하지 않습니다! lambda cls: self.preapproval)classmethod에 대한 함수 objec을 산출합니다! , 람다는 self.preapproval 때문에 classmethod 때문에 첫 번째 인자가 함수 객체 여야하므로 함수 객체를 얻습니다.

+0

이 코드를 더 읽기 쉽도록 작성 하시겠습니까? 왜 그것은 클래스 메쏘드가되어야하며, 처음에는 람다 (lambda)를 사용해야합니까? – cyberjoac

+0

으로 람다는'classmethod' 때문에 패스'self.preapproval'에 사용해야하는 함수 객체를 생성합니다. 첫 번째 인자는 함수 객체 여야합니다! – Kasramvd