파이썬 독스트링 완벽 가이드: 작성법, 스타일, 모범 사례

1. Python의docstring란?

Python에서의docstring은 함수, 클래스, 모듈 등의 코드에 설명을 추가하기 위한 특별한 문자열입니다. docstring은 코드의 유지보수성을 높이고, 다른 개발자가 코드를 이해하기 쉽게 해 주는 데 매우 중요한 역할을 합니다. 또한, 아래에서 설명할 자동 문서 생성 도구(예: Sphinx)를 사용하면, docstring을 활용한 문서를 만들 수 있습니다.

docstring의 위치와 서식

docstring은 대상이 되는 함수나 클래스, 모듈의 정의 바로 다음에 위치하며, 트리플 더블 쿼트로 감싸는 것이 기본 서식입니다. 다음과 같은 구문이 일반적입니다.
def 함수명(인수):
    """
    여기에 함수에 대한 간단한 설명을 작성합니다.

    인수:
        인수명 (타입): 인수에 관한 자세한 설명
    반환값:
        타입: 반환값에 관한 설명
    """
    pass
docstring은 Python의 내장 함수help()나, 에디터 내의 보조 표시에도 사용되어, 코드 문서로서 큰 역할을 합니다.

2. docstring의 기본적인 작성법

Python의docstring은 함수나 클래스의 사양을 간결하고 명확하게 설명하는 데 사용됩니다. 서식으로는 먼저 함수의 목적을 간단히 설명하고, 이어서 인수와 반환값, 오류 등에 대해 기술합니다. Python의 공식 스타일 가이드인 PEP 257을 따름으로써 일관성을 유지하고, 다른 개발자도 이해하기 쉬운 코드를 작성할 수 있습니다。

기본적인 docstring의 구조

한 줄짜리docstring은 매우 짧은 설명을 제공할 때 사용됩니다. 보통 함수의 기능을 한마디로 설명하는 데 쓰이며, 다음과 같이 작성합니다。
def add(a, b):
    """두 수를 더해 반환합니다."""
    return a + b
여러 줄의docstring은 보다 자세한 설명이 필요할 때 사용됩니다. 함수의 동작과 인수, 반환값에 대해 구체적으로 기술하고, 줄바꿈을 활용하여 가독성을 높입니다。
def add(a, b):
    """
    두 수를 더해 그 결과를 반환합니다。

    인수:
        a (int): 더할 첫 번째 수
        b (int): 더할 두 번째 수

    반환값:
        int: 두 수의 합
    """
    return a + b
侍エンジニア塾

3. docstring의 스타일(Google 스타일、NumPy 스타일、reStructuredText 스타일)

docstring의 스타일은, 프로젝트나 사용하는 도구에 따라 다양한 형식이 존재합니다. 주로 Google 스타일、NumPy 스타일、reStructuredText 스타일의 세 가지가 널리 사용됩니다。

Google 스타일

Google 스타일은 간결하고 시각적으로 이해하기 쉬운 서술이 특징입니다. 인자와 반환값은 ArgsReturns라는 섹션 이름 아래에 작성되며, Python 함수의 설명을 원활히 이해할 수 있도록 고안되어 있습니다。
def add(a, b):
    """
    두 수를 더해 반환합니다.

    Args:
        a (int): 더할 첫 번째 수
        b (int): 더할 두 번째 수

    Returns:
        int: 두 수의 합
    """
    return a + b

NumPy 스타일

NumPy 스타일은 보다 상세한 설명을 제공하기 위한 포맷으로, 특히 과학 계산이나 데이터 분석에서 사용되는 라이브러리의 문서에서 널리 채택되고 있습니다。ParametersReturns와 같은 섹션명을 사용해 인자와 반환값을 자세히 기술합니다。
def add(a, b):
    """
    두 수를 더해 반환합니다。

    Parameters
    ----------
    a : int
        더할 첫 번째 수
    b : int
        더할 두 번째 수

    Returns
    -------
    int
        두 수의 합
    """
    return a + b

reStructuredText 스타일

reStructuredText 스타일은 문서 생성 도구 Sphinx에서 사용되는 형식으로, 복잡한 프로젝트에서 자주 쓰입니다。Sphinx는 이 스타일을 사용하여 코드에서 자동으로 HTML이나 PDF 형식의 문서를 생성합니다。
def add(a, b):
    """
    두 수를 더합니다。

    :param a: 더할 첫 번째 수
    :type a: int
    :param b: 더할 두 번째 수
    :type b: int
    :return: 두 수의 합
    :rtype: int
    """
    return a + b

4. PEP 257와 모범 사례

Python의 docstring에 관한 공식 스타일 가이드인 PEP 257에서는, docstring의 작성 방법에 대한 명확한 지침이 제시되어 있습니다. 이를 따르면 코드의 가독성이 향상되고, 다른 개발자와 본인 모두가 코드를 보다 쉽게 이해할 수 있습니다。

PEP 257의 주요 포인트

  1. 한 줄 docstring 간단한 함수나 메서드에는 한 줄로 간결하게 설명을 작성하는 것이 권장됩니다。
  2. 여러 줄 docstring 보다 상세한 설명이 필요할 경우에는 여러 줄의 docstring을 사용합니다。 이때 첫 줄은 간단한 요약으로 하고, 이어서 빈 줄을 하나 둔 뒤 자세한 설명을 작성합니다。
  3. 들여쓰기와 빈 줄의 활용 docstring 안에서는 줄바꿈과 들여쓰기를 사용해 가독성을 높입니다。 또한 함수의 매개변수와 반환값에 대한 정보는 명확히 구분하여 읽기 쉽도록 정리합니다。

모범 사례

  • 간결하고 명확한 설명 docstring은 간결하면서도 함수나 클래스가 무엇을 하는지 정확히 전달해야 합니다。 불필요한 정보는 줄이되, 중요한 부분은 자세히 기술하세요。
  • 일관된 스타일 유지 프로젝트 전반에서 docstring의 스타일을 통일하면 가독성이 향상됩니다。 Google 스타일이나 NumPy 스타일 등 팀이나 프로젝트에 가장 적합한 스타일을 선택하세요。
RUNTEQ(ランテック)|超実戦型エンジニア育成スクール

5. docstring을 사용한 테스트(doctest)

Python에는、docstring 안의 샘플 코드가 실제로 기대한 대로 동작하는지 테스트할 수 있는 기능으로 doctest 모듈이 있습니다. 이 기능을 사용하면 docstring에 적힌 코드 예제가 올바른지 자동으로 확인할 수 있어 코드의 신뢰성을 높일 수 있습니다。doctest를 활용하면 문서화된 코드의 테스트를 손쉽게 수행할 수 있습니다。

doctest의 기본 사용법

doctestdocstring 안의 샘플 코드를 자동으로 감지해 실행하고, 결과가 문서에 적힌 출력과 일치하는지 확인합니다. 다음과 같이 if __name__ == "__main__": 블록에 doctest를 추가하면 테스트를 실행할 수 있습니다。
def add(a, b):
    """
    두 개의 숫자를 더하여 반환합니다。

    Args:
        a (int): 첫 번째 숫자
        b (int): 두 번째 숫자

    Returns:
        int: 두 숫자의 합

    Example:
        >>> add(2, 3)
        5
        >>> add(0, 0)
        0
    """
    return a + b

if __name__ == "__main__":
    import doctest
    doctest.testmod()
위의 예에서는、doctestdocstring 안의 코드 샘플을 실행하고 그 결과를 비교합니다. 테스트가 성공하면 아무것도 표시되지 않지만, 실패하면 오류 메시지가 표시됩니다. 이를 통해 docstring 안의 샘플 코드가 항상 올바른지 보장할 수 있습니다。

doctest를 사용하는 장점

  1. 코드의 일관성 doctest를 사용하면 docstring에 적힌 샘플 코드가 실제로 동작하는지 확인할 수 있어, 코드와 문서의 일관성을 유지할 수 있습니다. 이로써 문서가 최신 코드와 항상 일치하는 상태가 유지됩니다。
  2. 테스트의 자동화 doctest는 쉽게 자동화할 수 있어 함수나 클래스의 테스트를 수동으로 수행할 필요가 없습니다. doctest를 실행하기만 하면 docstring 안의 모든 코드 예제가 테스트되어 실수를 줄일 수 있습니다。

6. 실전 예:docstring을 활용한 코드의 문서화

실제로docstring을 활용하면 Python 코드의 가독성이 크게 향상되고, 다른 개발자들이 이해하기 쉬워집니다. 여기서는 클래스와 함수에 적절한docstring을 추가하고, Sphinx를 사용해 자동으로 문서화하는 프로세스를 소개합니다。

클래스에 대한 docstring 작성 예

클래스와 메서드에도docstring을 작성하는 것이 권장됩니다. 클래스에 대한docstring은 클래스가 어떤 기능을 제공하는지 간결하게 설명하고, 메서드별docstring에서 구체적인 기능을 자세히 기술합니다。
class Calculator:
    """
    간단한 계산기 클래스.

    이 클래스는 기본적인 덧셈, 뺄셈, 곱셈, 나눗셈을 수행합니다.

    Attributes:
        result (int): 계산 결과를 보관하는 변수
    """

    def __init__(self):
        """
        Calculator 클래스의 생성자.
        초기화 시 결과는 0으로 설정됩니다.
        """
        self.result = 0

    def add(self, a, b):
        """
        두 개의 숫자를 더하고 결과를 반환합니다.

        Args:
            a (int): 첫 번째 숫자
            b (int): 두 번째 숫자

        Returns:
            int: 두 숫자의 합
        """
        self.result = a + b
        return self.result
이 클래스 예시에서는 클래스 전체에 대한 설명과 함께、__init__add메서드에도 개별적인docstring이 작성되어 있습니다. 이렇게 하면 클래스 사용자들은 각 메서드가 어떻게 동작하는지 쉽게 파악할 수 있습니다。

Sphinx를 사용한 문서 생성

Sphinx를 사용하면、docstring에 기반해 HTML 및 PDF 형식의 문서를 자동 생성할 수 있습니다. 먼저 Sphinx를 프로젝트에 도입하고, 설정 파일(conf.py)을 준비합니다. 다음으로、make html명령을 실행하면、docstring에서 자동으로 HTML 문서가 생성됩니다。 다음 명령으로 Sphinx를 설치합니다。
pip install sphinx
다음으로、sphinx-quickstart명령을 사용해 프로젝트를 초기화하고, 프로젝트에 맞는 설정을 진행합니다. 그 후, Python 파일에 작성된docstring이 반영된 문서를 자동으로 생성할 수 있습니다。

7. 자주 하는 실수와 피하는 방법

docstring을 작성할 때 초보자가 빠지기 쉬운 실수가 있습니다. 이 섹션에서는 흔한 실수와 그 피하는 방법을 설명합니다.

1. 모호한 설명

docstring은 명확하고 간결하게 작성해야 하지만, 모호한 설명으로는 독자에게 의도가 전달되지 않습니다. 예를 들어, 다음 docstring은 불충분합니다。
def add(a, b):
    """두 숫자를 더합니다."""
    return a + b
이 예에서는 인자와 반환값에 관한 설명이 빠져 있어, 어떤 데이터 타입을 받는지, 무엇을 반환하는지가 불명확합니다. 개선책으로 다음과 같이 작성합니다.
def add(a, b):
    """
    두 정수를 더하고 그 결과를 반환합니다.

    Args:
        a (int): 첫 번째 숫자
        b (int): 두 번째 숫자

    Returns:
        int: 두 숫자의 합
    """
    return a + b

2. 인자와 반환값의 부정확한 설명

docstring 내에서 인자와 반환값에 대한 자세한 설명이 없으면, 사용자가 함수를 올바르게 사용할 수 없습니다. 특히 함수가 복잡한 경우에는 인자의 타입과 의미, 반환값의 타입을 명확히 기술하는 것이 중요합니다。
def divide(a, b):
    """두 숫자를 나눕니다."""
    return a / b
이 예에서는 인자와 에러 처리에 관한 설명이 빠져 있습니다. 다음과 같이 작성하면 사용자는 함수의 사용법을 올바르게 이해할 수 있습니다。
def divide(a, b):
    """
    두 숫자를 나누고 결과를 반환합니다. 0으로 나누면 ZeroDivisionError가 발생합니다.

    Args:
        a (float): 나누어지는 수
        b (float): 나누는 수

    Returns:
        float: 나눗셈 결과

    Raises:
        ZeroDivisionError: 0으로 나누려고 한 경우
    """
    if b == 0:
        raise ZeroDivisionError("0으로는 나눌 수 없습니다")
    return a / b
이처럼, docstring에는 충분한 정보를 담아 사용자가 오해 없이 코드를 사용할 수 있도록 하는 것이 중요합니다。

8. 정리:docstring을 활용한 효율적인 문서 작성

이 글에서는 Python의 docstring의 중요성, 작성 방법, 스타일, 모범 사례에 대해 설명했습니다。docstring은 코드의 가독성과 유지보수성을 향상시키는 데 매우 중요하며, PEP 257 가이드라인을 따르면 일관성 있는 문서를 작성할 수 있습니다。 더 나아가、doctest를 이용한 테스트와 Sphinx를 이용한 문서 생성을 통해 docstring을 활용하는 방법도 배웠습니다。이로써 코드 품질과 개발 효율의 향상을 기대할 수 있습니다。

PEP 257에 기반한 일관성 있는 문서 작성

PEP 257은 Python에서 docstring을 작성하기 위한 공식 가이드라인이며、이를 따르면 일관되고 읽기 쉬운 문서를 만들 수 있습니다。특히 간단한 한 줄짜리 docstring과 상세한 설명을 포함한 여러 줄 docstring을 구분해 사용함으로써 코드의 의도를 정확하게 전달할 수 있습니다。

doctest를 활용한 샘플 코드 테스트

doctest를 이용하면、docstring에 기재된 샘플 코드를 자동으로 테스트할 수 있습니다。이로써 코드와 문서의 정합성을 유지하면서、버그나 실수를 사전에 방지할 수 있습니다。

Sphinx를 이용한 문서의 자동 생성

Sphinx와 같은 문서 생성 도구를 사용하면、docstring으로부터 자동으로 HTML이나 PDF 형식의 문서를 생성할 수 있습니다。이로써 수동 문서 작성의 수고를 덜고、항상 최신 코드에 기반한 문서를 제공할 수 있습니다。
RUNTEQ(ランテック)|超実戦型エンジニア育成スクール