** kwargs 매개 변수를 문서화하는 올바른 방법은 무엇입니까?


99

저는 sphinx 와 autodoc 플러그인을 사용하여 Python 모듈에 대한 API 문서를 생성하고 있습니다. 특정 매개 변수를 잘 문서화하는 방법을 볼 수는 있지만 매개 변수를 문서화하는 방법의 예는 찾을 수 없습니다 **kwargs.

누구든지 이것을 문서화하는 명확한 방법에 대한 좋은 예가 있습니까?


이것은 전적으로 사용하는 독 스트링 방법에 따라 다릅니다. (reStructuredText, Sphinx, Google)
Stevoisiak

2
이것은 닫히지 않아야합니다. 유효한 질문입니다. 그것은 구체적입니다 (스핑크스를 사용하여 ** kwargs를 문서화하는 방법) doc 주석은 파이썬에서 완전히 표준화되지 않았기 때문에 질문을 구체적으로 지원하는 한 (sphinx) 의견 (또는 여러 방법)이 발생할 것입니다.
JerodG 2018-08-29

답변:


4

subprocess-module의 문서 가 좋은 예 라고 생각 합니다. 상위 / 상위 클래스에 대한 모든 매개 변수의 전체 목록을 제공합니다 . 그런 다음 다른 모든 항목에 대해 해당 목록을 참조하십시오 **kwargs.


98
이 대답이 의미가없는 유일한 사람입니까? 문제의 구체적인 예를 찾을 수 없습니다.
Acumenus

2
예를 들면 다음과 같습니다 subprocess.call(*popenargs, **kwargs). subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)다음의 모든 것이 *인식 된 키 **kwargs(또는 적어도 자주 사용되는 키 )로 문서화되어 있습니다
nos

2
그것의 가장 의미있는 계속은 지금 subprocess.Popen이며, 더 이상 특히 훌륭한 예라고 확신 할 수 없습니다.
Donal Fellows

내가 착각하지 않는 한 더 이상 Python 3.7 에서 문서화되지 않습니다 .
Mateen Ulhaq

11
답변에 실제 예를 포함하지 않은 것에 대한 반대 투표.
naught101

52

이 질문을 찾은 후 나는 유효한 Sphinx이고 상당히 잘 작동하는 다음 사항을 결정했습니다.

def some_function(first, second="two", **kwargs):
    r"""Fetches and returns this thing

    :param first:
        The first parameter
    :type first: ``int``
    :param second:
        The second parameter
    :type second: ``str``
    :param \**kwargs:
        See below

    :Keyword Arguments:
        * *extra* (``list``) --
          Extra stuff
        * *supplement* (``dict``) --
          Additional content

    """

r"""..."""이것을 "원시"문서화 문자열을 따라서 유지하기 위해 필요 \*스핑크스는 리터럴로 데리러 (그대로를* "강조"의 아닌 시작).

선택한 형식 (괄호로 묶인 유형 및 m- 대시로 구분 된 설명이있는 글 머리 기호 목록)은 단순히 Sphinx에서 제공하는 자동 형식과 일치하는 것입니다.

"키워드 인수"섹션을 기본 "매개 변수"섹션처럼 보이게 만드는 이러한 노력을 한 후에는 처음부터 자체 매개 변수 섹션을 롤링하는 것이 더 쉬울 것 같습니다 (다른 답변에 따라). ,하지만 **kwargs이미 Sphinx를 사용하고있는 경우 개념 증명으로 보완을위한 멋진 모습을 얻을 수있는 한 가지 방법 입니다.


26

Sphinx에서 파싱 한 Google 스타일 독 스트링

면책 조항 : 테스트되지 않았습니다.

의이 컷 아웃에서 스핑크스 문서화 문자열의 예*args과가 **kwargs남아있는 확장되지 않은 :

def module_level_function(param1, param2=None, *args, **kwargs):
    """
    ...

    Args:
        param1 (int): The first parameter.
        param2 (Optional[str]): The second parameter. Defaults to None.
            Second line of description should be indented.
        *args: Variable length argument list.
        **kwargs: Arbitrary keyword arguments.

나는 것이 좋습니다 소형화에 대한 다음과 같은 솔루션을 :

    """
    Args:
        param1 (int): The first parameter.
        param2 (Optional[str]): The second parameter. Defaults to None.
            Second line of description should be indented.
        *param3 (int): description
        *param4 (str): 
        ...
        **key1 (int): description 
        **key2 (int): description 
        ...

공지 방법, Optional필요하지 않습니다 **key인수.

그렇지 않으면 , 당신은 명시 적으로 아래 * 인수를 나열 시도 할 수 Other Parameters**kwargs아래 Keyword Args(구문 분석 참조 섹션 ) :

    """
    Args:
        param1 (int): The first parameter.
        param2 (Optional[str]): The second parameter. Defaults to None.
            Second line of description should be indented.

    Other Parameters:
        param3 (int): description
        param4 (str): 
        ...

    Keyword Args:
        key1 (int): description 
        key2 (int): description 
        ...

9

있습니다 doctstring 예 해당 설명서에서 스핑크스에 대한이. 특히 그들은 다음을 보여줍니다.

def public_fn_with_googley_docstring(name, state=None):
"""This function does something.

Args:
   name (str):  The name to use.

Kwargs:
   state (bool): Current state to be in.

Returns:
   int.  The return code::

      0 -- Success!
      1 -- No good.
      2 -- Try again.

Raises:
   AttributeError, KeyError

A really great idea.  A way you might use me is

>>> print public_fn_with_googley_docstring(name='foo', state=None)
0

BTW, this always returns 0.  **NEVER** use with :class:`MyPublicClass`.

"""
return 0

질문했지만 명시 적으로 Google Python 스타일 가이드를 가리킬 것 입니다. 그들의 독 스트링 예는 그들이 kwargs를 구체적으로 부르지 않는다는 것을 암시하는 것 같습니다. (other_silly_variable = 없음)

def fetch_bigtable_rows(big_table, keys, other_silly_variable=None):
"""Fetches rows from a Bigtable.

Retrieves rows pertaining to the given keys from the Table instance
represented by big_table.  Silly things may happen if
other_silly_variable is not None.

Args:
    big_table: An open Bigtable Table instance.
    keys: A sequence of strings representing the key of each table row
        to fetch.
    other_silly_variable: Another optional variable, that has a much
        longer name than the other args, and which does nothing.

Returns:
    A dict mapping keys to the corresponding table row data
    fetched. Each row is represented as a tuple of strings. For
    example:

    {'Serak': ('Rigel VII', 'Preparer'),
     'Zim': ('Irk', 'Invader'),
     'Lrrr': ('Omicron Persei 8', 'Emperor')}

    If a key from the keys argument is missing from the dictionary,
    then that row was not found in the table.

Raises:
    IOError: An error occurred accessing the bigtable.Table object.
"""
pass

ABB는 하위 프로세스 관리 문서를 참조하는 데 허용되는 답변에 대해 질문이 있습니다. 모듈을 가져 오면 inspect.getsource를 통해 모듈 독 스트링을 빠르게 볼 수 있습니다.

Silent Ghost의 권장 사항을 사용하는 파이썬 인터프리터의 예 :

>>> import subprocess
>>> import inspect
>>> import print inspect.getsource(subprocess)

물론 도움말 기능을 통해 모듈 문서를 볼 수도 있습니다. 예를 들어 help (subprocess)

개인적으로 kwargs에 대한 하위 프로세스 독 스트링의 팬은 아니지만 Google 예제와 마찬가지로 Sphinx 문서 예제에 표시된대로 kwargs를 별도로 나열하지 않습니다.

def call(*popenargs, **kwargs):
"""Run command with arguments.  Wait for command to complete, then
return the returncode attribute.

The arguments are the same as for the Popen constructor.  Example:

retcode = call(["ls", "-l"])
"""
return Popen(*popenargs, **kwargs).wait()

ABB의 질문에 대한이 답변을 포함하고 있습니다. 코드에 주석을 달기위한 통찰력과 영감을 얻기 위해 이러한 방식으로 모든 모듈의 소스 또는 문서를 검토 할 수 있다는 점에 주목할 가치가 있기 때문입니다.


2
수정 : 이것은 Sphinx 문서의 일부가 아니라 독립적 인 'example pypi 프로젝트'의 일부이며, 이는 스스로를 신뢰할 수없는 가이드로 명시 적으로 설명합니다.
boycy

other_silly_variablekwargs 인수는 아니지만 완전히 정상적인 인수입니다.
bugmenot123

4

다른 사람이 유효한 구문을 찾고 있다면 .. 여기에 docstring의 예가 있습니다. 이것이 내가 한 방법입니다. 유용하기를 바라지 만, 특별히 어떤 것과도 호환된다고 주장 할 수 없습니다.

def bar(x=True, y=False):
    """
    Just some silly bar function.

    :Parameters:
      - `x` (`bool`) - dummy description for x
      - `y` (`string`) - dummy description for y
    :return: (`string`) concatenation of x and y.
    """
    return str(x) + y

def foo (a, b, **kwargs):
    """
    Do foo on a, b and some other objects.

    :Parameters:
      - `a` (`int`) - A number.
      - `b` (`int`, `string`) - Another number, or maybe a string.
      - `\**kwargs` - remaining keyword arguments are passed to `bar`

    :return: Success
    :rtype: `bool`
    """
    return len(str(a) + str(b) + bar(**kwargs)) > 20

3
그렇다면 개별 키워드 인수는 어떻습니까?
maasha

4

이 사용 설명서의 스타일에 따라 다르지만 당신이 사용하는 경우 numpydoc의 스타일을 그것을 문서화하는 것이 좋습니다되어 **kwargs사용 Other Parameters.

예를 들어 quornian의 예를 따르십시오.

def some_function(first, second="two", **kwargs):
    """Fetches and returns this thing

    Parameters
    ----------
    first : `int`
        The first parameter
    second : `str`, optional
        The second parameter

    Other Parameters
    ----------------
    extra : `list`, optional
        Extra stuff. Default ``[]``.
    suplement : `dict`, optional
        Additional content. Default ``{'key' : 42}``.
    """

특히 함수 시그니처에서 명확하지 않기 때문에 kwargs의 기본값을 제공하는 것이 좋습니다.


1
귀하의 제안이 이전 문서 또는 개인적인 경험에서 비롯된 것인지 확실하지 않지만 현재의 "기타 매개 변수"문서 (귀하가 연결)에는 "자주 사용하지 않는 매개 변수를 설명하는 데 사용"해야하며 "사용 만 사용해야합니다." 함수에 많은 수의 키워드 매개 변수가있는 경우 매개 변수 섹션이 복잡해지지 않도록합니다.
Ninjakannon

1

numpydoc 스타일 로이 작업을 수행하는 방법을 찾고 있다면 유형을 지정하지 않고 매개 변수 섹션에서 간단히 언급**kwargs 할 수 있습니다 -pandas 문서 스프린트 2018 의 스핑크스 확장 napolean 및 docstring 가이드numpydoc 예제 에서 설명 된 대로 .

다음은 LSST 개발자 가이드 에서 찾은 예 입니다. 매개 변수에 대한 설명이 무엇인지 잘 설명합니다 **kwargs.

def demoFunction(namedArg, *args, flag=False, **kwargs):
    """Demonstrate documentation for additional keyword and
    positional arguments.

    Parameters
    ----------
    namedArg : `str`
        A named argument that is documented like always.
    *args : `str`
        Additional names.

        Notice how the type is singular since the user is expected to pass individual
        `str` arguments, even though the function itself sees ``args`` as an iterable
        of `str` objects).
    flag : `bool`
        A regular keyword argument.
    **kwargs
        Additional keyword arguments passed to `otherApi`.

        Usually kwargs are used to pass parameters to other functions and
        methods. If that is the case, be sure to mention (and link) the
        API or APIs that receive the keyword arguments.

        If kwargs are being used to generate a `dict`, use the description to
        document the use of the keys and the types of the values.
    """

또는 @Jonas Adler가 제안한 것을 기반 으로 섹션에 및 설명넣는**kwargsOther Parameters 것이 더 낫다는 것을 알았 습니다. matplotlib 문서 가이드 의이 예제 에서도 동일하게 제안합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.