2016년 3월 29일 화요일

Python lambda function 과 unittest

수학식이 좀 많이 나오는 것 같은 문제를 풀다보니 아래와 같은 함수를 만들 일이 생겼습니다.

    def getFunction(self, c1, c2):
        x1 = c1[0]; y1 = c1[1]
        x2 = c2[0]; y2 = c2[1]
        if x1 == x2:
            return (lambda x,y: x1)
        if y1 == y2:
            return (lambda x,y: y1)
        return (lambda x,y: (y1-y2)/(x1-x2)*x + y1 - (y1-y2) / (x1-x2)*x1)

두 점을 지나는 직선을 구하는 함수로 함수 자체를 리턴시키기 위해 lambda를 사용했습니다.

보통 TDD를 하기에 TestCase를 만들긴 했는데, 생각보다 고민이 되더군요-

"기대값을 뭘해야 하지?"

종이에 쓰는경우면 쉽습니다.

가령 (0,0), (1,1)을 지나는 함수 f(x)는 이렇게 되겠죠.

f(x) = x

unittest에 넣는다고 치면(당연히 안되지만)

assertEquals(f(x) = x, getFunction((0,0), (1,1)))

과 같은 포멧이 될텐데 기대값에 f(x) = x 와 같은 형태는 둘 수 없습니다.

String 으로 뽑아도 당연히 저렇게 나타나지 않구요-

일단 대안으로는 기대함수(편의상)에 값을 넣었을 때 올바르게 나오는지 검사하도록 했습니다.

다음과 같네요.

        # y = 2*x function
        F = Treasure().getFunction((0,0), (1,2))
        self.assertEquals(0, F(0,2))
        self.assertEquals(2, F(1,2))
        self.assertEquals(10, F(5,10))

대략 적으로 검출은 되는데, 영 찝찝합니다.

뭔가 lambda function 을 unittest에서 적절하게 검출하는 방법이 있으면 좋을 것 같습니다.

검색을 좀 해보니 eval을 만들어 string으로 비교하는 방법도 있는 것 같은데, 이정도가 최선일까요? 고민해봐야겠네요 ㅎ

2016년 3월 17일 목요일

정리

정리를 그렇게 잘하지는 못하는 것 같습니다.

블로그도 그렇고 메모도 그렇고.

그래도 일단 쓰는게 안쓰는 것보단 좋겠져.