代码约定
在Python社区中有许多关于代码风格的约定。如果你写过一段时间Python了,那么也许对此已经有些了解。 我会简单介绍一下,同时给你一些URL链接,从中你可以找到关于这个话题的详细信息。
让我们提出一个PEP!
PEP全称是“Python Enhancement Proposal”(Python增强提案)。你可以在python.org上找到它们以及对应的索引目录。 PEP在索引目录中按照数字编号排列,包括了元PEP(meta-PEP,讨论关于PEP的细节)。与之对应的是技术PEP(technical PEP),思考的是诸如Python内部实现的改良这样的话题。
有一些PEP,比如PEP 8和PEP 257,影响了Python代码风格的标准。 PEP 8包括了Python代码风格的规约。 而PEP 257包括了文档字符串(docstrings, 在Python中给代码加文档的标准方式)的规约。
PEP 8: Python代码风格规约
PEP 8是对Python代码风格的官方规约。 我建议你阅读它并将之付诸在Flask项目(以及其他Python项目)的开发实践中。 当项目规模膨胀到多个包含成百上千行代码的文件时,这样做会使你的代码更加工整、了然。毕竟PEP 8的建议都是围绕着实现更加可读的代码这个目标。 另外,如果你的项目准备开源,潜在的奉献者(contributors)会很高兴看到你的代码是遵循PEP 8的。
一个至关重要的建议是每级缩进使用4个空格。不要使用tab。 如果你打破了这个规约,它将会成为你(以及你的队友)在项目间切换的一个负担。 这种不一致一向是任意语言心中的痛,但是对于Python,一门着重留白的语言,这是一个不可承受之重。 因为tab与space之间的混搭会导致不可预期且难以排查的错误。
PEP 257: 文档字符串规约
PEP 257 覆盖了Python的另一项标准:docstrings。 你可以阅读PEP中的定义和相关建议,不过这里会给一个例子来展示一个文档字符串应该是怎样的:
def launch_rocket():
"""主要的火箭发射调度器
启动发射火箭所需的每一个步骤。
"""
# [...]
这种风格的文档字符串可以通过一些诸如Sphinx的软件来生成不同格式的文档。 同时它们也有助于让你的代码更加工整。
参见
- PEP 8 http://legacy.python.org/dev/peps/pep-0008/
- PEP 257 http://legacy.python.org/dev/peps/pep-0257/
- Sphinx http://sphinx-doc.org/,一个文档生成器,同出于Flask作者之手
相对形式的import
开发Flask应用时,使用相对形式的import会让你的生活更加轻松。
原因很简单。之前,当需要import一个内部模块时,你也许要显式指明应用的包名(the app's package name)。假设你想要从myapp/models.py中导入User
模型:
# 使用绝对路径来导入User
from myapp.models import User
用了相对形式的import后,你可以使用点标记法:第一个.
来表示当前目录,之后的每一个.
表示下一个父目录。
# 使用相对路径来导入User
from .models import User
这种做法的好处在于使得package变得更加模块化了。 现在你可以重命名你的package并在别的项目中重用模块,而无需忍受更新被硬编码的包名之苦。
参见
- 你可以在PEP 328的这一节里读到更多关于相对形式的import的语法
- 在写作本书的过程中,我碰巧在这个Tweet上面看到了一个使用相对形式的import的好处: https://twitter.com/dabeaz/status/372059407711887360 Just had to rename our whole package. Took 1 second. Package relative imports FTW!
总结
- 尽量遵循PEP 8中的代码风格规约。
- 尽量遵循PEP 257中的文档字符串规约。
- 使用相对形式的import来import你的应用中的内部模块。