编码风格#

注意

这是从旧 IPython wiki 原封不动复制过来的,目前正在开发中。开发指南的这一部分中的许多信息已过时。

本文档描述了我们的编码风格。编码风格是指以下内容

  • 源代码的格式(缩进、间距等)

  • 命名方式(变量、函数、类、模块等)

通用编码约定#

一般来说,我们遵循 Python 的 PEP 8 中描述的标准 Python 风格约定,它是官方 Python 风格指南。

其他一般性评论

  • 在大文件中,顶级类和函数应由 2 行分隔,以便于在视觉上将它们分开。

  • 缩进使用 4 个空格,切勿使用硬制表符。

  • 对于具有相同方法的类,保持方法的顺序相同。对于实现类似接口的类和类似的接口,这一点尤其正确。

命名约定#

对于命名约定,我们还遵循 PEP 8 的准则。一些现有代码并未完全遵循此原则,但对于所有新的和经过重构的 IPython 代码,我们将使用

  • 所有 小写 模块名称。长的模块名称可以用下划线分隔单词(really_long_module_name.py),但这不是必需的。尝试使用附近文件的约定。

  • 驼峰式 的类名。

  • 小写_带下划线 的方法、函数、变量和属性。

  • 实现特定的私有方法将使用 _single_underscore_prefix。带有前导双下划线的名称在特殊情况下使用,因为它们会使子类化变得困难(子类不容易看到此类名称)。

  • 偶尔会使用一些连字符小写名称,但主要用于非常短的名称或在实现与基类中现有方法非常相似的名称(如 runlines(),其中 runsource()runcode() 已建立先例)。

  • 旧的 IPython 代码库包含大量带有显式 IPip 前缀的类和模块。这不是必需的,所有新代码都不应使用此前缀。此方法合理的唯一情况是对于预期导入到外部命名空间的类或函数,以及很可能与其他内容冲突的非常通用的名称(如 Shell)。但是,如果前缀似乎绝对必要,则更具体的 IPYipy 优先使用。

  • 所有 JavaScript 代码也应遵循这些命名约定。

对象的属性声明#

通常,对象应在其中声明对象在其整个生命周期中要保存的所有属性。虽然 Python 允许你在任何时间向实例添加属性,但这会使代码更难阅读,并要求方法不断使用 hasattr() 或 try/except 调用进行检查。通过在类头中声明对象的全部属性,可以参考一个地方来理解对象的数据接口,其中注释可以解释每个变量的作用,并且如果可能,可以分配明智的默认值。

如果属性旨在包含可变对象,则应将其设置为 None 类,其可变值应在对象的构造函数中设置。由于类属性由所有实例共享,因此如果不这样做,可能会导致难以跟踪的错误。但你仍应在类声明中设置它,以便接口规范完整且记录在一个地方。

一个简单的示例

class Foo(object):
    # X does..., sensible default given:
    x = 1
    # y does..., default will be set by constructor
    y = None
    # z starts as an empty list, must be set in constructor
    z = None

    def __init__(self, y):
        self.y = y
        self.z = []

新文件#

为 IPython 启动一个新的 Python 文件时,你可以使用 以下模板 作为起点,其中为你预先编写了一些常见内容。