Code Metaphor

Programming, Writing, Reading, Thoughts…

키워드 인자 (keyword arguments)

요즘 Python을 해오다가 RoR을 하면서 느끼는 것은, 키워드 인자가 개발자의 확신을 주는데 중요한 문법적 요소라는 것이다. Ruby에서는 언어적으로 키워드 인자를 제공하지 않는다. 그래서 아래와 같이 해시에 심볼을 키로 해서 인자를 넘기는 문화가 존재한다.

method :keyword => value, :keyword => value

위 코드는 아래와 동일하다.

method {:keyword => value, :keyword => value}

요즘엔 PHP에서도 그걸 흉내내곤 한다(똑같은데 더 지저분하다).

function(array('keyword' => value, 'keyword' => value))

저렇게 해주면 Smalltalk나 Python에서 가능한 키워드 인자와 같은 효과를 지닐 것 같다.

method: value keyword: value
function(keyword=value, keyword=value)

하지만 내 생각에 둘은 분명한 차이를 보인다. 내가 지금까지 보아온 방식의 키워드 인자에는 세 종류가 존재한다.

가장 처음 접했던 것은 Smalltalk의 방식이다. 이 메세지 구문은 너무 특이해서 사람들에게 잘 알려져 있는데, 메서드 이름이 키워드다. 인자를 메서드 끝에 순서대로 나열하는 것이 아니라, 메서드 중간에 삽입한다.

Python은 함수의 인자 이름을 정성스럽게 적어야 한다. 그것은 순서대로 대입될 수도 있지만, 키워드로 대입될 수도 있기 때문이다. 노출되므로 인자 이름까지도 인터페이스가 된다.

def function(a, b, c=3):
    return c, b, a

위 함수는 아래의 어떤 방식으로든 원하는 대로 호출된다. (Python에서 대입문은 표현식이 아니다.)

function(1, 2, 3)
function(a=1, b=2, c=3)
function(b=2, a=1)
function(c=3, a=1, b=2)

그리고 마지막으로는 그것을 구문적으로 지원하지 않아서, 연관 배열이나 해시 등으로 흉내내는 Ruby, PHP와 같은 경우가 있다.

가장 좋은 방식은 Python이라고 생각한다. 만약 자신이 함수의 인자 순서에 대해 정확히 숙지한다면, 그것을 사용할 수 있다. 인자에 기본값을 주기도 수월하고, 함수 시그니쳐만 보고도 인터페이스를 추측하기 쉽다.

Smalltalk는 메서드 이름 자체를 외우기 때문에 키워드나 인자 순서에 대해 고민하지 않아도 되지만, 메서드 자체가 길어진다는 단점이 있다. 순서를 바꾸는 것도 힘들다.

Ruby, PHP와 같은 방식은 문제가 좀 있다고 생각한다. 사용하는 입장에서 그 해시 안의 키들이 과연 정말 적당한지에 대해서 확신하기 힘들다. 나는 해시 인자를 받는 메서드를 만날 때마다 RoR 문서를 참조해야 했다. 확신할 수 없었기 때문이다. 게다가 아무 메서드에서나 해시 인자를 받을 것이라고 확신할 수도 없다. 패턴이 언어나 패러다임의 한계를 극복하기 위한 편법이라고 본다면, 난 이것 역시 하나의 패턴이라고 본다.

Metaphor에서는 이 문제를 어떻게 처리할까? 원래는 Smalltalk와 같은 방식이였다.

object method: value method: value

하지만 키워드의 순서를 바꾸지 못한다는 점 때문에 구문 스펙을 크게 뒤집고 있다. 중요한 것은, 키워드 인자를 제공하면서도, 그 인자 순서들을 마음대로 할 수 있으며, 그것이 언어적으로 지원되어 모든 메서드에 대해 같은 방식을 기대할 수 있어야 한다는 것이다. 좋은 아이디어가 있다면 의견 주시라.

덧. 이 글은 2006년 12월 20일에 작성되었고, 2007년 5월 16일 현재 Metaphor의 호출 구문은 크게 바뀌었다. 자세한 것은 메서드와 연산자라는 포스팅을 참고하면 된다.

This entry was posted on December 20, 2006 at 11:34 AM. You can follow any responses to this entry through the RSS 2.0 feed. Both comments and pings are currently closed.

One Response to “키워드 인자 (keyword arguments)”

  1. 재식 Says:

    올해 초즈음인가부터 예시의 php 처럼 간간히 작성을 하고 있는데.. 확실히 편하다. 쓸때 순서 기억도 안해도 되고, 특히 우선순위 때문에 초기값 그대로 가도 될걸 어거지로 써줘야하는 부조리한 경우를 몇번 겪다보니..

Powered by WordPress. Styled by Hong, MinHee. XML Feed, Comments XML Feed.