일상적 이야기들.

[TIL] lambda, TeypVar 본문

프로그래밍/PYTHON

[TIL] lambda, TeypVar

noveljava 2020. 9. 10. 23:59

Lambda

Lambda는 AWS에서 자주보던 용어였고, 일부 언어에서 Lambda식을 지원하는 것으로 알고 있다. python 또한 Lambda식을 지원하고 있으며, 이를 활용하면 함수형 프로그래밍 방식에 맞춰서 개발할 것이 가능하리라고 보여진다.
Python에서 Lambda의 정의를 보면 다음과 같이 기재가 되어있다. ( w3school정의 )

A lambda function is a small anonymous function.
A lambda function can take any number of arguments, but can only have one expression.

작은 익명의 함수라고 정의가 되어있으며, Parameter(arguments)는 여러개가 될 수 있지만, 하나의 표현식만 만들 수 있습니다.
문법은 다음과 같습니다.

x = lambda a : a + 10

여기서 x는 변수처럼 보이지만, 실질적으로는 함수가 할당이 되었고 다음과 같이 사용될 수 있습니다.

  • x(5)

이렇게 호출이 되면, lambda 식에 의하여 a는 5로 치환이 이뤄지고, expression에 의하여 5+10(a+10)으로 15를 return하게 됩니다.
여기서 정의에 따르면 parameter는 여러개가 가능하다고 합니다.

lammbda parameter자리 이므로, 해당 자리에 원하는만큼의 parameter를 지정할 수 있습니다. 하지만 앞서 말했다시피 표현식은 하나만이 가능하기때문에, 해당 자리를 별도의 함수로 정의하여 빼는 것도 가능합니다.


    def add(a, b):
        return a+b
    x = lambda a, b: add(a, b)

위와 같이 코드를 짜게 되면, x(5, 10)과 같이 호출이 되면, 내부적으로는 a = 5, b = 10이 할당이 되고, add함수를 수행하여 결과를 반환하게 됩니다.

일반적으로 사용하는 함수의 사용법과 크게 다를바가 없는데 Lambda함수를 왜 사용해야하는지에 의문이 듭니다. 보편적으로는 익명의 함수이기때문에 실행시 언제나 같은 값을 돌려줄 것을 보장하게 됩니다.
이는 함수형 언어에서 지향하는 바와 같으며, 필요시에 Lambda식을 한번쯤은 고려해보는 것이 좋을 것이라는 생각이 들었다.

TypeVar

Type hint

TypeVar에 앞서서, Type hint라는 기능을 알고 있어야할 것 같다. python은 자유분방한 언어여서 변수에 대해서 강하게 type을 지정해두지 않는다. C와 C++/Java와 같은 compile이 필요한 언어들은 메모리의 할당을 위해서 변수의 type이 매우 중요하게 여겨진다.
그렇기에 소스코드를 읽을 때, 변수가 어떤 값을 가지고 있는지에 대해서 유추가 가능해진다.
하지만 interpreter언어에서는 변수의 type이 크게 중요하지 않다. Javascript의 경우에는 var형으로 모든 것을 해결하고 있고, python의 경우에는 애초에 type명을 지정해주지도 않는다. 값을 넣으면 내부적으로 알맞은 type을 지정해서 사용하게 된다.
이것은 파이썬의 내부적으로 잘 일을 하는 것이지, 프로그래머 입장에서는 코드를 볼 때 참으로 헷갈리는 일이 아닐 수가 없다.
그렇기에 type을 지정하는 것은 아니지만, 해당 변수가 어떤 type을 다룰 것인가에 대해서 알려주는 것이 type hint 기능이다.

The Python runtime does not enforce function and variable type annotations. They can be used by third party tools such as type checkers, IDEs, linters, etc.
(Python Document)

a: str = None과 같은 방식으로 a의 변수가 string type을 다룰 것이다라는 것을 알려줄 수 있고, 다른 프로그래머도 해당 코드를 작성한 프로그래머의 의도를 확인하고, 해당 변수 값으로 string이 할 수 없는 일을 작성하지 않을 것이다.
그렇다고 해서, 해당 값에 string 값 외에 못 넣느냐? 그것은 또 아니다. 앞써 python document에 기재가 되어있듯이, 프로그래머가 보기 좋으라고 작성하는 기능일 뿐이다. 그러므로 프로그래머가 조심히 쓰는 버릇을 들여야한다

TypeVar

TypeVar는 Generic에서 비록된 것이고, Generic의 개념은 C++언어를 하면서 들어본적이 있다. 어떠한 type이 들어올지 모르는 상황에서 범용적으로 사용하고 싶기에 추상화된 템플릿을 이용하여 여러가지의 값들을 처리할 수 있도록 하는 방식이다.
이는 Python에서 이야기하는 Generic과 조금은 다른 것 같지만 비슷한 맥락으로 개발이 된 것으로 보여진다.

Generics can be parameterized by using a new factory available in typing called TypeVar.

사용자가 Type Hint를 위하여, 변수 type의 그룹을 새로이 정의한다 정도로 이해를 하면 될 것 같다.
예를 들어서, Dictation을 하나 구성해서 사용하고 있는데, key값은 string으로 고정이 되나, 할당되는 값들이 int와 string 두개를 허용한다고 하였을 때, 프로그래머는 어떻게 Hint를 줘야할지에 대해서 의문스러워진다.

a: Dict[str, ...?] = {}

우리가 아는 한 해당 자리에는 하나의 값만을 적어야할 것 같은데, 어떻게 int와 string을 포용할 수 있을까? 이때 사용되는 것이 TypeVar를 통하는 방법이라고 생각이 든다.


    T = TypeVar('T', int, str)
    a: Dict[str, T] = {}

위와 같이 정의가 된다면, 프로그래머는 Dict의 값으로 int, str이 들어올 것이라고 예상할 것이다.
아직까지 TypeVar에서는 많은 사용을 하지 않아 사용예가 풍부하지 않은데, 차차 사용해가면서 더 많은 사용방법과 잘못된 점이 있으면 고치도록 해야겠다.

Comments