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

Python 개선 제안 한국어 번역

PEP 232 – 함수 속성

Author:
Barry Warsaw <barry at python.org>
Status:
Final
Type:
Standards Track
Created:
02-Dec-2000
Python-Version:
2.1
Post-History:
20-Feb-2001

Table of Contents

번역·라이선스 안내

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

소개

이 PEP는 함수와 메서드에 속성 딕셔너리를 추가하는, 파이썬에 대한 확장을 설명합니다. 이 PEP는 이 기능의 상태와 소유권을 추적합니다. 이 PEP는 기능에 대한 설명을 담고 있으며, 이 기능을 지원하는 데 필요한 변경 사항을 개괄합니다. 이 PEP는 메일링 리스트 포럼에서 이루어진 논의를 요약하며, 적절한 경우 추가 정보를 위한 URL을 제공합니다. 이 파일의 CVS 리비전 기록에는 확정적인 이력 기록이 담겨 있습니다.

배경

함수는 이미 여러 속성을 가지고 있으며, 그중 일부는 쓰기 가능합니다. 예를 들어 func_doc이 그러하며, 이는 func.__doc__이라고도 합니다. func_doc은 함수(및 메서드) 정의에 이 속성을 암묵적으로 설정하기 위한 특별한 문법이 존재한다는 흥미로운 특성을 가지고 있습니다. 이러한 편의성은 반복적으로 활용되어 왔으며, docstring에 추가적인 의미를 덧씌우는 결과를 낳았습니다.

예를 들어, John Aycock은 docstring을 사용해 파싱 규칙을 정의하는 시스템을 작성했습니다. [1] Zope의 ZPublisher ORB [2] 는 docstring을 사용해 게시 가능한 메서드, 즉 웹을 통해 호출될 수 있는 메서드를 표시합니다.

이 접근 방식의 문제는 덧씌워진 의미들이 서로 충돌할 수 있다는 것입니다. 예를 들어, 웹을 통해 게시되어서는 안 되는 Zope 메서드에 doctest 단위 테스트를 추가하고자 하는 경우가 그렇습니다.

제안

이 제안은 함수 객체에 func_dict(이는 __dict__라고도 합니다)라는 새로운 딕셔너리를 추가합니다. 이 딕셔너리는 일반적인 속성 설정 및 조회 문법을 사용해 설정하고 조회할 수 있습니다.

메서드도 게터 문법을 갖게 되었으며, 현재는 하위의 함수 객체가 가진 딕셔너리를 통해 속성에 접근합니다. 바인딩된 메서드나 바인딩되지 않은 메서드에는, 하위의 함수 객체에 명시적으로 설정하는 경우를 제외하고는 속성을 설정할 수 없습니다. 이후 버전의 Python에서 취할 수 있는 접근 방식은 아래의 Future Directions절을 참조하십시오.

함수 객체의 __dict__도 설정할 수 있지만, 딕셔너리 객체로만 설정할 수 있습니다. 함수의 __dict__를 삭제하거나 구체적인 딕셔너리 객체가 아닌 다른 것으로 설정하면 TypeError가 발생합니다. 함수 속성이 한 번도 설정된 적이 없다면, 함수의 __dict__는 비어 있게 됩니다.

예제

이 기능으로 할 수 있는 몇 가지 예제를 소개합니다.

def a():
    pass

a.publish = 1
a.unittest = '''...'''

if a.publish:
    print a()

if hasattr(a, 'unittest'):
    testframework.execute(a.unittest)

class C:
    def a(self):
        'just a docstring'
        a.publish = 1

c = C()
if c.a.publish:
    publish(c.a())

그 밖의 용도

Paul Prescod는 python-dev thread에서 그 밖의 다양한 용도를 열거했습니다.

향후 방향

고려할 만한 향후 방향을 몇 가지 소개합니다. 이러한 아이디어를 채택하려면 이 PEP를 참조하는 새로운 PEP가 필요하며, Python 2.1 릴리스 이후 버전을 대상으로 해야 합니다.

  • 이 PEP의 이전 버전에서는 바인딩되지 않은 메서드의 속성에 대해서는 세터와 게터를 모두 허용하고, 바인딩된 메서드에 대해서는 게터만 허용했습니다. 이 정책에는 여러 문제가 있는 것으로 밝혀졌습니다.

    메서드 속성이 하위 함수에 저장되었기 때문에, 이는 잠재적으로 놀라운 여러 결과를 낳았습니다:

    class C:
        def a(self): pass
    
    c1 = C()
    c2 = C()
    c1.a.publish = 1
    # c2.a.publish would now be == 1 also!
    

    a에 바인딩된 c1을 변경하면 a에 바인딩된 c2도 변경되었기 때문에, 바인딩된 메서드에 속성을 설정하는 것은 허용되지 않았습니다. 하지만 언바운드 메서드에 속성을 설정하는 것을 허용하더라도 모호함이 있습니다:

    class D(C): pass
    class E(C): pass
    
    D.a.publish = 1
    # E.a.publish would now be == 1 also!
    

    이러한 이유로 현재 PEP는 바인딩된 메서드와 언바운드 메서드 모두에 대해 속성 설정을 허용하지 않지만, 둘 다에 대해 속성을 가져오는 것은 허용합니다 – 둘 다 내부 함수 객체의 속성 값을 반환합니다.

    향후 PEP에서는 특별한 명명 규칙을 사용하여 인스턴스나 클래스에 속성을 설정함으로써 (바인딩되거나 언바운드된) 메서드 속성 설정을 구현하는 것을 제안할 수 있습니다. 즉:

    class C:
        def a(self): pass
    
    C.a.publish = 1
    C.__a_publish__ == 1 # true
    
    c = C()
    c.a.publish = 2
    c.__a_publish__ == 2 # true
    
    d = C()
    d.__a_publish__ == 1 # true
    

    여기서 인스턴스에 대한 조회는 먼저 인스턴스의 딕셔너리를 찾은 다음, 클래스의 딕셔너리를 조회하고, 마지막으로 함수 객체의 딕셔너리를 조회합니다.

  • 현재 파이썬은 파이썬 함수(즉 내장 함수가 아니라 파이썬으로 작성된 함수)에 대해서만 함수 속성을 지원합니다. 그럴 만한 가치가 있다면, 내장 함수에 함수 속성을 추가하는 별도의 패치를 만들 수 있습니다.
  • __doc__은 현재 편리하게 설정할 수 있도록 구문적으로 지원되는 유일한 함수 속성입니다. 함수 속성을 쉽게 설정할 수 있도록 언어를 개선하는 것이 궁극적으로 가치 있을 수 있습니다. 다음은 PEP 검토자들이 제안한 몇 가지 구문입니다: [3]
    def a {
        'publish' : 1,
        'unittest': '''...''',
        }
        (args):
        # ...
    
    def a(args):
        """The usual docstring."""
        {'publish' : 1,
         'unittest': '''...''',
         # etc.
         }
    
    def a(args) having (publish = 1):
        # see reference [3]
        pass
    

    BDFL은 현재 임의의 함수 속성을 설정하기 위한 이러한 특별한 구문 지원에 반대하고 있습니다. 어떤 구문 제안이든 새로운 PEP에서 개괄되어야 할 것입니다.

반대 의견

2000년 4월 python-dev 메일링 리스트에서 이 문제가 논의되었을 때, 다수의 반대 의견이 제기되었습니다. 완전성을 위해, 그 논의 스레드는 python-dev에서 시작합니다.

반대 의견은 다음과 같은 범주로 나뉘는 것으로 보입니다:

  • 명확한 목적이 없음(이것으로 얻는 게 무엇인가?)
  • 이를 수행하는 다른 방법이 있음(예: 클래스 속성으로서의 매핑)
  • 구문적 지원이 포함되기 전까지는 쓸모가 없음

이러한 주장 중 일부에 반박하는 관찰로, 순정 Python 2.0에서도 __doc__은 실제로 어떤 타입의 객체로도 설정할 수 있으므로, 쓰기 가능한 함수 속성과 유사한 것이 이미 가능하다는 점이 있습니다. 하지만 이 접근 방식은 __doc__을 오염시키는 또 다른 방식일 뿐입니다.

그리고 클래스 객체에 매핑을 추가하는 것(또는 함수 속성의 경우 함수의 모듈에 추가하는 것)이 물론 가능하지만, 검사를 위해 속성 값을 추출하는 것은 더 어렵고 덜 명확합니다.

마지막으로, __doc__의 구문적 지원이 존재하는 것과 마찬가지로 구문적 지원을 추가하는 것이 바람직할 수 있습니다. 이는 실제로 함수 속성을 설정하고 가져오는 능력과는 별개로 고려될 수 있습니다.

참조 구현

이 PEP는 승인되었으며 구현이 Python 2.1에 통합되었습니다.

참고 문헌