Docstring

python에서 함수, 클래스, 모듈에 대한 문서화를 위해 사용되는 문자열.
이는 코드의 가독성을 높이고 다른 개발자들이 코드를 이해하는 데 도움을 준다.

주요 특징

  1. 큰따옴표 세 개(""") 또는 작은따옴표 세 개(’’’)로 둘러싸인 문자열이다.
  2. 함수, 클래스, 모듈의 첫 번째 문장으로 위치한다.
  3. __doc__ 속성을 통해 프로그램 실행 중에 접근할 수 있다.
  4. 내장 함수 help()를 통해 문서를 볼 수 있다.

기능

  1. 코드의 목적과 동작을 설명한다.
  2. 함수의 매개변수, 반환값, 예외 등을 문서화한다.
  3. 모듈이나 클래스의 전반적인 기능을 설명한다.
  4. 자동 문서 생성 도구(예: Sphinx)를 통해 API 문서를 생성할 수 있다.

고려해야 할 중요한 점들

  1. 일관성: 프로젝트 전체에서 동일한 스타일을 사용해야 한다.
  2. 명확성: 설명은 간단하고 명확해야 하며, 예시가 있으면 더 좋다.
  3. 완전성: 모든 매개변수, 반환값, 예외 상황을 문서화해야 한다.
  4. 최신성: 코드가 변경될 때 Docstring도 함께 업데이트해야 한다.

활용 방법

1
2
3
4
5
6
# Docstring 확인하기
help(google_style)  # help() 함수 사용
print(google_style.__doc__)  # __doc__ 속성 직접 접근

# 대화형 셸에서 사용
>>> google_style?  # IPython/Jupyter에서

자동 문서 생성을 위한 도구들

  1. Sphinx: Python 프로젝트의 표준 문서화 도구.
  2. pdoc: 간단한 API 문서를 자동으로 생성한다.
  3. MkDocs: Markdown 기반의 문서 생성 도구이다.

각 스타일은 프로젝트의 성격이나 팀의 선호도에 따라 선택할 수 있다.
중요한 것은 프로젝트 내에서 일관성 있게 사용하는 것.
또한, IDE나 문서 생성 도구와의 호환성을 고려하여 선택하는 것이 좋다.

Docstring 포맷

주요 Docstring 포맷에는 Google 스타일, reStructuredText(Sphinx) 스타일, NumPy 스타일이 있다.

Google 스타일

특징:

  • 가장 읽기 쉽고 직관적인 포맷.
  • 특별한 도구 없이도 이해하기 쉽다.
  • 많은 개발자들이 선호하며 널리 사용된다.
  • Args, Returns, Raises 등의 섹션을 명확하게 구분한다.

예시:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def google_style(param1: str, param2: int) -> dict:
    """Google 스타일의 docstring 예시입니다.
    
    이 함수는 Google 스타일의 문서화 방식을 보여줍니다.
    여러 줄의 설명을 작성할 수 있습니다.
    
    Args:
        param1: 첫 번째 매개변수에 대한 설명
        param2: 두 번째 매개변수에 대한 설명
    
    Returns:
        결과를 담은 사전을 반환합니다.
        
    Raises:
        ValueError: 잘못된 입력이 주어질 경우
        
    Examples:
        >>> google_style("test", 123)
        {'test': 123}
    """
    if not isinstance(param2, int):
        raise ValueError("param2 must be an integer")
    return {param1: param2}    

reStructuredText(Sphinx) 스타일

특징:

  • Python 공식 문서에서 사용되는 형식
  • Sphinx 문서 생성 도구와 가장 잘 호환된다.
  • 매우 상세한 문서화가 가능하다.
  • 다양한 지시어(directive)를 사용할 수 있다.
  • 문법이 다소 복잡할 수 있다.

예시:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
def sphinx_style(param1: str, param2: int) -> dict:
    """
    Sphinx 스타일의 docstring 예시입니다.
    
    :param param1: 첫 번째 매개변수에 대한 설명
    :type param1: str
    :param param2: 두 번째 매개변수에 대한 설명
    :type param2: int
    :returns: 결과를 담은 사전
    :rtype: dict
    :raises ValueError: 잘못된 입력이 주어질 경우
    
    .. note::
        이것은 부가적인 노트입니다.
    
    .. warning::
        이것은 경고 메시지입니다.
    """
    if not isinstance(param2, int):
        raise ValueError("param2 must be an integer")
    return {param1: param2}

NumPy 스타일

특징:

  • 과학 계산 커뮤니티에서 널리 사용된다.
  • 매개변수와 반환값을 명확하게 구조화한다.
  • 수학적 표현이나 복잡한 매개변수를 설명하기에 적합하다.
  • Google 스타일보다 더 형식적인 구조를 가진다.

예시:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
def numpy_style(param1: str, param2: int) -> dict:
    """
    NumPy 스타일의 docstring 예시입니다.
    
    이 함수는 NumPy 스타일의 문서화 방식을 보여줍니다.
    
    Parameters
    ----------
    param1 : str
        첫 번째 매개변수에 대한 설명
    param2 : int
        두 번째 매개변수에 대한 설명
        
    Returns
    -------
    dict
        결과를 담은 사전
        
    Raises
    ------
    ValueError
        잘못된 입력이 주어질 경우
        
    See Also
    --------
    google_style : 관련된 함수에 대한 참조
    sphinx_style : 다른 관련 함수에 대한 참조
    
    Notes
    -----
    추가적인 노트를 작성할 수 있습니다.
    수식도 포함할 수 있습니다.
    
    Examples
    --------
    >>> numpy_style("test", 123)
    {'test': 123}
    """
    if not isinstance(param2, int):
        raise ValueError("param2 must be an integer")
    return {param1: param2}

클래스 Docstring 예시

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class ExampleClass:
    """예시 클래스입니다.
    
    이 클래스는 다양한 docstring 스타일을 보여주기 위한 예시입니다.
    
    Attributes:
        attr1 (str): 첫 번째 속성에 대한 설명
        attr2 (int): 두 번째 속성에 대한 설명
    """
    
    def __init__(self, attr1: str, attr2: int):
        """
        클래스 생성자입니다.
        
        Args:
            attr1: 첫 번째 속성값
            attr2: 두 번째 속성값
        """
        self.attr1 = attr1
        self.attr2 = attr2
    
    @property
    def combined(self) -> str:
        """속성 값들을 결합합니다.
        
        Returns:
            str: 결합된 문자열
        """
        return f"{self.attr1}{self.attr2}"

참고 및 출처