Python Docstring 风格和写法学习

什么是Python Docstring

和Java类似,Python也通过注释形式的Docstring给程序、类、函数等建立文档。通过Docstring建立的文档不仅对人来说有更好的可读性,也能够让IDE等工具自动识别使用函数、类、变量等的一些限制,从而帮助我们更好地理解程序。

Python Docstring 的三种风格

总的来说,Python Docstring有三种主要风格,分别是reST风格、Google风格和Numpy风格:

reST的全称是 reStructredText。通过以冒号开头的几个关键字来说明类、函数中的参数、返回值、异常等。

例如我们要造一个双向链表的轮子,我们新建一个 DoubleLinkList.py 文件。其中包含两个类,一个是双向链表的节点类 DLLNode,一个是双向链表类 DoubleLinkList

首先看一下 DLLNode类。

class DLLNode(object):
"""
    The definition of node of double link list.

    :param val: The value of a node.

    :param prev: The pointer of the previous node of this node.

    :param next: The pointer of the next node of this node.

    :type val: Any
    :type prev: DLLNode, default None
    :type next: DLLNode, default None
"""

    def __init__(self, val, prev=None, next=None):
        self.val = val
        self.prev = prev
        self.next = next

我们可以看到在 DLLNode类中通过三个双引号 """建立了对DLLNode类的docstring。注意docstring必须位于任意其他代码的开头。在类的docstring中,常见的有如下声明标记:

:param <类属性名称>: <描述>
:type <类属性名称>: <类型>
</类型></类属性名称></描述></类属性名称>

其中,类型除了基本类型,如 intfloatstr等,还可以是列表类型 List[type],元组类型 Tuple[types],以及字典类型 Dict[KeyType, ValueType]等,还可以是各种模块中定义的类型。注意当类型为列表、元组或字典时与Python本身自带类型的不同。

这里我们不需要再对 DLLNode类中 __init__()函数添加docstring。在生成文档时,Python会自动将类的docstring复制给它的 __init__()函数。

下面再看一下 DoubleLinkList类。

class DoubleLinkList(object):
"""
    The definition of double link list.

    :param head: The head pointer of the list.

    :type head: DLLNode
"""
    def __init__(self, head):
        self.head = head

    def insert_node(self, val, node):
"""
        Insert a node before the node which data is val.

        :param val: The value to be find to insert a node before it.

        :param node: The node ready to insert.

        :type val: Any
        :type node: DLLNode
"""
        pass

    def remove_node(self, val):
"""
        Remove a node which data is val.

        :param val: The val of node to be removed.

"""
        pass

    def length(self):
"""
        Returns the length of this link table.

        :return: The length of this link table.

        :rtype: int
"""
        pass

    def search_node(self, val):
"""
        Search the first position of node which data equals val.

        :param val: The value to be searched.

        :return: The position of val first appeared.

        :rtype: int
"""
        pass

    def update_node(self, position, val):
"""
        Update the node in position by val.

        :param position: The position of the node to be updated.

        :param val: The target value of updated node.

        :type position: int
        :type val: Any
"""
        pass

假设我们给 DoubleLinkList类设计了增删改查和求长度五个方法。我们可以看到,除了 :param:type外,还有几个新的标签,列举如下:

:return: <对返回值的描述>
:rtype: <返回值类型>
:raises: <可能抛出的异常列表>
</可能抛出的异常列表></返回值类型></对返回值的描述>

当我们在docstring中为函数指定了 :param:type以后,如果在调用函数时给函数传入了错误的参数类型,IDE会发出warning,可以提醒我们传入正确的参数类型。

除了reST风格,Google Style也是一种常见的docstring规范。

仍以上文的 DoubleLinkList为例。Google Style的docstring如下:

class DLLNode(object):
"""
    The definition of node of double link list.

    Args:
        val (Any): The value of Node.

        prev (DLLNode): The previous node of this node.

        next (DLLNode): The next node of this node.

"""

    def __init__(self, val, prev=None, next=None):
        self.val = val
        self.prev = prev
        self.next = next

class DoubleLinkList(object):
"""
    The definition of double link list.

    Args:
        head (DLLNode): The head pointer of the link list.

"""
    def __init__(self, head):
        self.head = head

    def insert_node(self, val, node):
"""
        Insert a node before the node which data is val.

        Args:
            val (Any): The value to be find to insert a node before it.

            node (DLLNode): The node ready to insert.

"""
        pass

    def remove_node(self, val):
"""
        Remove a node which data is val.

        Args:
            val (DLLNode): The val of node to be removed.

"""
        pass

    def length(self):
"""
        Returns the length of this link table.

        Returns:
            int: The length of this link list.

"""
        pass

    def search_node(self, val):
"""
        Search the first position of node which data equals val.

        Args:
            val: The value to be searched.

        Returns:
            int: The first position of the searched value.

"""
        pass

    def update_node(self, position, val):
"""
        Update the node in position by val.

        Args:
            position (int): The position of node to be updated.

            val: The new value of target.

"""
        pass

与reST风格不同,Google Style将所有的参数写在 Args标签下,而所有的返回值写在 Returns标签下。我个人认为比起reST风格,Google Style的可读性要更好一些。在 Args标签下,可以在参数名称后面加 (&#x7C7B;&#x578B;)来确定参数的类型,同样可以起到对参数类型的限制作用。

Numpy是矩阵分析、科学计算、机器学习中都会用到的常见Python程序库。其文档详实完整,也是程序员们学习的典范之一。Numpy也有自己独特的Python Docstring风格。我们仍以 DoubleLinkList模块为例来说明。

class DLLNode(object):
"""
    The definition of node of double link list.

    Parameters
    ----------
    val : Any
        The value of node.

    prev : DLLNode
        The previous node of this node.

    next : DLLNode
        The next node of this node.

    Attributes
    ----------
    val : Any
        The value of node.

    prev : DLLNode
        The previous node of this node.

    next : DLLNode
        The next node of this node.

"""

    def __init__(self, val, prev=None, next=None):
        self.val = val
        self.prev = prev
        self.next = next

class DoubleLinkList(object):
"""
    The definition of double link list.

    Parameters
    ----------
    head : DLLNode
        The head pointer of the link list.

    Attributes
    ----------
    head : DLLNode
        The head pointer of the link list.

"""
    def __init__(self, head):
        self.head = head

    def insert_node(self, val, node):
"""
        Insert a node before the node which data is val.

        Parameters
        ----------
        val:
            The value to be find to insert a node before it.

        node : DLLNode
            The node ready to insert.

"""
        pass

    def remove_node(self, val):
"""
        Remove a node which data is val.

        Parameters
        ----------
        val :
            The val of node to be removed.

"""
        pass

    def length(self):
"""
        Returns the length of this link table.

        Returns
        -------
        int
            The length of this link list.

"""
        pass

    def search_node(self, val):
"""
        Search the first position of node which data equals val.

        Parameters
        ----------
        val:
            The value to be searched.

        Returns
        -------
        int
            The first position of the searched value.

"""
        pass

    def update_node(self, position, val):
"""
        Update the node in position by val.

        Parameters
        ----------
        position :int
            The position of node to be updated.

        val:
            The new value of target.

"""
        pass

和Google Style不同,Numpy Style采用如下格式描述一个类:

"""
&#x7C7B;&#x63CF;&#x8FF0;

Parameters
&#x5C5E;&#x6027; : [&#x7C7B;&#x578B;]
    &#x5C5E;&#x6027;&#x7684;&#x63CF;&#x8FF0;
"""

其中Parameters和Attributes可以不一样。具体区别我也不是搞得很明白。

函数描述如下

"""
&#x51FD;&#x6570;&#x63CF;&#x8FF0;

Parameters
&#x7C7B;&#x578B;
    &#x8FD4;&#x56DE;&#x503C;&#x7684;&#x63CF;&#x8FF0;

Raises
&#x8303;&#x4F8B;&#x63CF;&#x8FF0;

Yields(&#x4EC5;&#x9488;&#x5BF9;&#x751F;&#x6210;&#x5668;&#x51FD;&#x6570;)
&#x6CE8;&#x91CA;&#x5185;&#x5BB9;
"""

Numpy风格的docstring似乎不能用sphinx来生成html形式的文档。

本文介绍了Python程序设计中常见的三种docstring的风格,其中我个人认为Google Style相比之下是最好的一个,它既可以采用Sphinx来生成HTML格式的文档,也可以直接在命令行中通过help函数获得可读性更高的文档。但在Pycharm等IDE中,默认支持的是reST风格的。具体如何使用,就要看自己的喜好和项目要求了。

Original: https://www.cnblogs.com/ryuasuka/p/11085387.html
Author: 飞鸟_Asuka
Title: Python Docstring 风格和写法学习

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/609908/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Redis主从复制搭建及原理

    1 简介 1.1 Redis在单机、单节点、单实例下存在的问题 单机故障 内存容量有限 访问压力 Redis主从架构主要解决的问题:单机故障和访问压力,通过主从架构可以将访问流量分…

    Linux 2023年6月13日
    097
  • Java50个关键字之abstract

    abstract abstract 可以出现的位置: 修饰方法 修饰类 修饰类 一个类被 abstract修饰,那么该类就叫做 &#x62BD;&#x8C61;&a…

    Linux 2023年6月7日
    088
  • 【数学建模相关】matplotlib画多个子图(散点图为例 左右对照画图)

    @ 例题 例图 代码展示 例题 乙醇偶合制备 C4 烯烃 C4 烯烃广泛应用于化工产品及医药的生产,乙醇是生产制备 C4 烯烃的原料。 在制备过程中,催化剂组合(即:Co 负载量、…

    Linux 2023年6月8日
    095
  • JavaScript快速入门-07-异常处理与调试

    7、异常处理与调试 7.1 异常处理 7.1.1 try/catch语句 try/catch语句常用于处理JavaScript中的异常,其基本语法如下所示: try { // 可能…

    Linux 2023年6月7日
    0105
  • CentOS 7安装FTP服务器

    修改 vsftpd.conf配置文件,禁用匿名用户访问ftp服务器 vim /etc/vsftpd/vsftpd.conf 将配置文件中的 anonymous_enable=YES…

    Linux 2023年5月27日
    096
  • 从 Hadoop 到云原生, 大数据平台如何做存算分离

    Hadoop 的诞生改变了企业对数据的存储、处理和分析的过程,加速了大数据的发展,受到广泛的应用,给整个行业带来了变革意义的改变;随着云计算时代的到来, 存算分离的架构受到青睐,企…

    Linux 2023年6月14日
    056
  • Redis主从复制、哨兵、Cluster三种模式

    Redis作为缓存的高效中间件,在我们日常的开发中被频繁的使用,今天就来说一说Redis的四种模式,分别是 「单机版、主从复制、哨兵、以及集群模式」。 可能,在一般公司的程序员使用…

    Linux 2023年5月28日
    086
  • 国产化之虚拟ARM64-CPU安装银河麒麟操作系统

    背景 某个项目需要实现基础软件全部国产化,其中操作系统指定银河麒麟v4,CPU使用飞腾处理器。我本地没有这个国产的处理器,但飞腾是基于 _ARMv8_架构的64位处理器,所以理论上…

    Linux 2023年5月27日
    0315
  • 实现Django ORM admin view中model字段choices取值自动更新的一种方法

    有两个表,一个是记录网站信息的site表,结构如下: CREATE TABLE site ( id bigint(20) unsigned NOT NULL AUTO_INCREM…

    Linux 2023年6月6日
    099
  • 001.AD域控简介及使用

    一 AD概述 域(Domain)是Windows网络中独立运行的单位,域之间相互访问则需要建立信任关系。 当一个域与其他域建立了信任关系后,2个域之间不但可以按需要相互进行管理,还…

    Linux 2023年6月7日
    0125
  • 配置nginx只打印延迟超过0.1s和非2XX的accesslog

    背景 当业务accesslog全开时,写入es的qps达到了10W,评估后觉得不太值得,所以考虑抽样打印。查看相关文档后发现目前我们使用的nginx版本不支持抽样打印,所以考虑其他…

    Linux 2023年6月14日
    0106
  • Go-interface基本概念

    interface类型可以定义一组方法,但是这些不需要实现。并且interface不能包含任何变量。到某个自定义类型要使用的时候,再根据具体情况把这些方法写出来。 定义一个接口: …

    Linux 2023年6月8日
    0101
  • alpinelinux镜像安装中文字体

    镜像下载、域名解析、时间同步请点击阿里云开源镜像站 编辑dockerfile,先切换国内镜像源,默认alpinelinux是国外源,下载包会很慢 vim Dockerfile FR…

    Linux 2023年6月7日
    0106
  • 三分钟永久激活WebStorm、PHPStorm、PyCharm、IntelliJ IDEA等JetBrains系列IDE

    前言 本文讲解如何永久激活WebStorm、PHPStorm、PyCharm、IntelliJ IDEA等JetBrains系列IDE,亲测有效,操作简单,一次激活,永久有效,一劳…

    Linux 2023年6月7日
    0112
  • cv2简单使用(opencv-python)

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月14日
    071
  • dbus的奇妙世界

    故事背景 在linux开发中我们经常会用到dbus来进行进程间通信,但是如何理解dbus服务端和客户端呢?很多小伙伴可能都会遇到类似的问题,而且都是含含糊糊的,接下来我们直接上硬菜…

    Linux 2023年5月27日
    082
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球