Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python 개선 제안 한국어 번역

PEP 312 – 단순한 암묵적 람다

Author:
Roman Suzi <rnd at onego.ru>, Alex Martelli <aleaxit at gmail.com>
Status:
Deferred
Type:
Standards Track
Created:
11-Feb-2003
Python-Version:
2.4
Post-History:


Table of Contents

번역·라이선스 안내

이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판

초록

이 PEP는 문법적으로 모호하지 않은 일부 경우에 인자 없는 lambda 키워드를 선택 사항으로 만들 것을 제안합니다.

보류

BDFL은 단항 콜론 문법을 매우 싫어합니다. 이 PEP는 원점에서 다시 검토하여 더 Python다운 문법(아마도 다른 단항 연산자)을 찾아야 합니다. 2005년 6월 17일의 python-dev 논의를 참고하십시오 [1].

또한 채택될 가능성이 전혀 없는 대안 제안들은 제거하는 것이 좋을 것입니다. 예제 절은 훌륭하며 가독성 향상을 잘 보여 줍니다. 예제를 더 추가하고 (:A와 :B에 대한 추상화된 더미 호출 대신) 실제 사례를 들면 더 설득력이 있을 것입니다.

동기

람다는 익명 함수를 정의하는 데 유용하며, 예를 들어 콜백이나 (유사) 지연 평가 방식에 사용할 수 있습니다. 람다가 적절한 상황에서도 “lambda”라는 키워드가 코드를 복잡해 보이게 만든다는 이유만으로 사용되지 않는 경우가 많습니다. 문법을 조금만, 하위 호환성을 유지하면서 변경하면 일부 특수한 경우에 lambda를 생략할 수 있으며, 이는 이러한 “람다 공포증”에 대한 저렴한 치료책이 됩니다.

근거

사람들은 때때로 이론이 뒷받침된 용어를 도입하는 것이 두려워 람다를 사용하지 않습니다. 이 제안은 “lambda” 키워드 자체를 생략하여 인자 없는 람다를 더 쉽게 도입할 수 있도록 합니다. 구현은 잘 알려진 몇 가지 경우에 “lambda” 키워드가 암묵적으로 적용되도록 문법을 변경하는 것만으로 간단히 할 수 있습니다. 특히 주위에 괄호를 추가하면 어디에서든 인자 없는 람다를 지정할 수 있습니다.

문법

인자 없는 “lambda” 키워드는 다음과 같은 경우에 생략할 수 있습니다:

  • 이름 있는 매개변수 대입이나 기본값 대입에서 “=” 바로 뒤;
  • 모든 표현식에서 “(” 바로 뒤;
  • 함수 인자 목록에서 “,” 바로 뒤;
  • 딕셔너리 리터럴에서 “:” 바로 뒤; (구현되지 않음)
  • 대입문 안; (구현되지 않음)

사용 예

  1. 인라인 if:
    def ifelse(cond, true_part, false_part):
        if cond:
            return true_part()
        else:
            return false_part()
    
    # old syntax:
    print ifelse(a < b, lambda:A, lambda:B)
    
    # new syntax:
    print ifelse(a < b, :A, :B)
    
    # parts A and B may require extensive processing, as in:
    print ifelse(a < b, :ext_proc1(A), :ext_proc2(B))
    
  2. 잠금:
    def with(alock, acallable):
        alock.acquire()
        try:
            acallable()
        finally:
            alock.release()
    
    with(mylock, :x(y(), 23, z(), 'foo'))
    

구현

구현하려면 문법적 변경과 실용적 변경을 위해 Python 소스의 Grammar/Grammar 파일을 약간 수정하고 Modules/parsermodule.c를 일부 조정해야 합니다.

(완전한 구현을 위해서는 문법/파서 전문가가 필요합니다.)

다음은 암시적 람다를 허용하기 위해 Grammar에 필요한 변경 사항입니다:

varargslist: (fpdef ['=' imptest] ',')* ('*' NAME [',' '**'
NAME] | '**' NAME) | fpdef ['=' imptest] (',' fpdef ['='
imptest])* [',']

imptest: test | implambdef

atom: '(' [imptestlist] ')' | '[' [listmaker] ']' |
'{' [dictmaker] '}' | '`' testlist1 '`' | NAME | NUMBER | STRING+

implambdef: ':' test

imptestlist: imptest (',' imptest)* [',']

argument: [test '='] imptest

새로운 비단말 기호 세 개가 필요합니다. 암시적 람다가 나타날 수 있는 위치를 위한 imptest, 암시적 람다 정의 자체를 위한 implambdef, 그리고 imptest들이 나타날 수 있는 위치를 위한 imptestlist입니다.

이 구현은 완전하지 않습니다. 첫째, Parser 모듈의 일부 파일을 갱신해야 하기 때문입니다. 둘째, 일부 추가적인 부분이 구현되지 않았습니다. 위의 문법 절을 참조하십시오.

논의

이 기능은 눈에 크게 띄는 기능이 아닙니다(유일하게 새로운 부분은 lambda가 없다는 점입니다). 이 기능은 인자가 없는(null-ary) 람다를 구문상 더 매력적으로 만들어, 몇몇 단순한 경우에 표현식의 지연 평가를 제공하기 위한 것입니다. 이 제안은 더 고급 사례(람다에 인자가 필요한 경우)를 대상으로 하지 않습니다.

암시적 람다에 대한 대안 제안이 있습니다. 바로 사용되지 않는 인자를 가지는 암시적 람다입니다. 이 경우 그러한 람다로 정의된 함수는 어떤 매개변수든 받을 수 있습니다. 즉, lambda *args: expr 형태와 동등합니다. 이 형태가 더 강력할 것입니다. 표준 라이브러리를 grep으로 검색해 본 결과, 그러한 람다가 실제로 사용되고 있음이 드러났습니다.

또 다른 확장으로, 암시적 람다로 정의된 함수에 전달된 매개변수 목록을 얻는 방법을 제공할 수 있습니다. 그러나 그러한 매개변수에 접근하려면 특별한 이름이 필요하며, 언어에 포함될 가능성은 낮습니다. 그러한 매개변수에 사용할 수 있는 지역 이름으로는 _, __args__, __가 있습니다. 예를 들면 다음과 같습니다:

reduce(:_[0] + _[1], [1,2,3], 0)
reduce(:__[0] + __[1], [1,2,3], 0)
reduce(:__args__[0] + __args__[1], [1,2,3], 0)

이러한 형태는 보기에 그다지 좋지 않으며, PEP 작성자의 의견으로는 이러한 경우에 lambda 키워드를 제거할 정당한 이유가 되지 못합니다.

감사의 말

lambda를 없애자는 아이디어는 Paul Rubin이 2003년 2월 8일 16:39:30 -0800에 comp.lang.python에서 “For review: PEP 308 - If-then-else expression” [2] 스레드를 논의하던 중 처음 제시했습니다.

참고 문헌