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

데코레이터가 문법적 설탕(syntactic sugar)인 것과 유사하게:

@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는 완전히 하위 호환됩니다.