PEP 542 – 함수 헤더에서의 점 표기법 할당
- Author:
- Markus Meskanen <markusmeskanen at gmail.com>
- Status:
- Rejected
- Type:
- Standards Track
- Created:
- 10-Feb-2017
- Resolution:
- Python-Dev message
번역·라이선스 안내
이 비공식 한국어 번역은 원문 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는 완전히 하위 호환됩니다.
Copyright
This document has been placed in the public domain.