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

Python 개선 제안 한국어 번역

PEP 542 – 함수 헤더에서의 점 표기법 할당

Author:
Markus Meskanen <markusmeskanen at gmail.com>
Status:
Rejected
Type:
Standards Track
Created:
10-Feb-2017
Resolution:
Python-Dev message

Table of Contents

번역·라이선스 안내

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

초록

함수는 할당 가능한 일급 객체인데도, 함수 정의에는 단순한 함수 이름만 사용할 수 있습니다.

이 PEP는 점 표기법으로 객체와 함수 이름을 구분하여, 함수 정의의 헤더에서 함수를 클래스 속성이나 인스턴스 속성에 직접 할당하는 기능을 추가할 것을 제안합니다.

비슷한 기능이기는 하지만, 이 PEP는 딕셔너리 키나 리스트 인덱스처럼 할당을 지원하는 모든 대상에 대한 일반적인 할당은 다루지 않습니다.

근거

현재는 함수를 클래스 속성이나 인스턴스 속성에 할당해야 하면 할당문을 추가로 작성해야 합니다:

class MyClass:
    ...

my_instance = MyClass()

def my_function(self):
    ...

# Assign to class attribute
MyClass.my_function = my_function

# Or assign to instance attribute
my_instance.my_function = my_function

보통 이것이 불편하지는 않지만, 점 표기법으로 함수 헤더에서 직접 할당하면 이 작업이 크게 간단해집니다:

class MyClass:
    ...

my_instance = MyClass()

# Assign to class attribute
def MyClass.my_function(self):
    ...

# Or assign to instance attribute
def my_instance.my_function(self):
    ...

표준 클래스 메서드 대신 이 기능을 사용할 이유는 여러 가지가 있습니다. 예를 들어 함수 헤더 안에서 클래스를 참조하는 경우(데코레이터나 타이핑을 사용할 때 등)가 있습니다. 인스턴스에 콜백 속성이 필요할 때도 유용합니다:

class Menu:
    def __init__(self, items=None, select_callback=None):
        self.items = items if items is not None else []
        self.select_callback = select_callback

my_menu = Menu([item1, item2])

def my_menu.select_callback(item_index, menu):
    print(menu.items[item_index])

다음과 같은 방식 대신:

my_menu = Menu([item1, item2])

def select_callback(item_index, menu):
    print(menu.items[item_index])
my_menu.select_callback = select_callback

또는 “부자연스러운” 순서로 정의하는 방식 대신:

def select_callback(item_index, menu):
    print(menu.items[item_index])

my_menu = Menu([item1, item2], select_callback)

함수 정의 시점에 그 함수가 무엇에 쓰일지 이미 알고 있으므로, “부자연스러운” 방식보다 더 잘 읽힙니다. 또한 시각적 복잡성을 없애면서 코드 한 줄을 줄여 줍니다.

이 기능을 사용하면 함수 이름이 전역 네임스페이스에 남지 않습니다:

eggs = 'something'

def Spam.eggs(self):
    ...

def Cheese.eggs(self):
    ...

assert eggs == 'something'

이상적으로는 이것이 단지 문법적 설탕(syntactic sugar)일 것입니다:

def x.y():
    ...

# Equals to

def y():
    ...
x.y = y

데코레이터가 문법적 설탕인 것과 비슷합니다:

@decorate
def f():
    ...

# Equals to

def f():
    ...
f = decorate(f)

구현

__name__은 일반 함수의 원칙을 따릅니다:

class MyClass:
    def my_function1(self):
        ...

def MyClass.my_function2(self):
    ...

assert my_function1.__name__ == 'my_function1'
assert my_function2.__name__ == 'my_function2'

문법은 속성 연쇄를 지원하기 위해 dotted_name을 사용합니다:

def Person.name.fset(self, value):
    self._name = value

하위 호환성

이 PEP는 하위 호환성을 완전히 유지합니다.