PEP309 Partial 구현

업동씨 결혼식갔다가 와서 시간이 좀 남아서 [PEP]PEP309에 제출된 다른 언어의 “curry” 함수를 훔쳐온 아이디어, partial을 한번 구현해 봤습니다. :) 요즘 회사에서 HTML그리기 등등 잡무만 했더니 집에서 생산력이 아주 높아져서.. 언젠가 Ken Thompson씨던가가 말씀하셨듯, 역시 회사에서 잡무가 늘어날 때가 오히려 창의적 성취는 늘어나는 묘한 관계가 있는건지도요 -.-a

partial은 nohmad님의 말씀에 따르면 C#에도 partial이란게 있는데, 여기의 partial과는 좀 다른 버추어 메쏘드 만으로 이뤄지는 클래스 비스무리한 것을 뜻하는 키워드라는군요.. PEP309의 partial은 함수 호출의 일부만을 미리 정의해서 callable object로 만들어주는, anonfunc나 operator.itemgetter랑 약간 비슷한 류의 도구입니다. 예를 들면

>>> import functional 
>>> revsorted = functional.partial(sorted, reverse=True)
>>> revsorted([1,3,2,4])
[4, 3, 2, 1]

요런 식으로, partial의 첫번째 인자는 함수이고, 두번째부터는 인자랑, 키워드 인자들이 들어갑니다. 그러면, 그 인자들이 함수에 나중에 적용되게 되는데, sorted의 원래 reverse 키워드의 기본 값이 False인데, 요렇게 True로 바꾼 것을 쉽게 만들 수 있겠죠~

partial은 타입 인자가 fn, args, kw 세개가 있는데, 셋을 만들고 나서 바꿀 수도 있습니다. 예를 들면,

>>> import operator, functional 
>>> calc = functional.partial(operator.add, 10)
>>> calc(5)
15
>>> calc.args = (20,)
>>> calc(5)
25
>>> calc.fn = operator.mul
>>> calc(5)
100

믓흥믓흥. 뒷 인자를 못 바꾸는 약간 불편한 것은 있지만, 그래도 anonfunc에 비하면 논리적, 설게적으로 아주 깔끔하고 좋은 느낌입니다. +_+

패치는 [WWW]요기에 제출했습니다.

15 thoughts on “PEP309 Partial 구현”

Comments are closed.