2015년 11월 27일 금요일

파이썬 함수 주석 요약

파이썬 함수 주석에 대해서 다룬다.

변수 타입을 명시하지 않는 이유로 자유롭지만 혼란스러운 부분을 주석을 통해서 가이드 할 수 있다.
주석은 제약사항은 아니지만 3rd party 라이브러리에서 의미를 해석할 때 매우 유용하게 사용된다.

  • PEP 3107에서 함수에 주석을 추가하는 구문을 소개한다.
  • PEP 484에서는 PEP 3107의 데이터 타입에 대한 의미적인 부분을 소개한다.

본문은 핵심 요약을 통해서 함수 주석 사용에 도움이 되는 것을 목표로 한다.

PEP 3107 - Function Annotations

입력값 (Parameters) 리턴값(return values)을 옵션으로 명시 할 수 있다.
Syntax:
def f(*args: <expression>, **kwargs: <expression>) -> <expression>:
<statements>
* 명시된 표현(<expression>)은 데이터 타입에 대한 주석이다.

컴파일 시, 주석된 표현은 계산된 결과로 재 표현된다.
def f(a: 'x', b: 5 + 6, c: list) -> max(2, 9):
pass
help(f)
Output:
Help on function f in module __main__:
f(a:'x', b:11, c:list) -> 9

PEP 484 - Type Hints


명시된 표현(<expression>)이 없는 것(None)은 type(None)과 같은 의미다.

타입은 별칭 사용이 가능하다.

typing 라이브러리를 통해서 다양한 타입을 정의 할 수 있다.
( Any, Union, Tuple, Callable, TypeVar, and Generic )

복합 예제는 다음과 같다.
from typing import TypeVar, Generic
T = TypeVar('T',int,float)    # 'T'는 int or float type을 사용

def foo(x: T, y: T) -> T:

    return x + y
help(foo)
Output:
Help on function foo in module __main__:
foo(x:typing.T, y:typing.T) -> typing.S

class zoo(Generic[T]):    # Generic을 통해서 클래스에 포괄 적용
    def foo(x: T, y: T) -> T:
        return x + y
help(zoo)
Output:
Help on class zoo in module __main__:
class zoo(typing.Generic)
 |  Method resolution order:
 |      zoo
 |      typing.Generic
 |      builtins.object
 |  
 |  Methods defined hero:
 |  
 |  foo(x:typing.T, y:typing.T) -> typing.T


메모를 하듯이 주석을 하자.
주석할 수 없는 로직은 잔잔한 물결 앞에 모래성과 같다.

0 개의 댓글:

댓글 쓰기