总体原则

价值

  • “为别人开发你也想要使用的工具。” ——Kenneth Reitz
  • "简洁总是胜过可用。" ——Pieter Hintjens
  • "满足90%的使用场景。忽略那些说不的人。" ——Kenneth Reitz
  • "优美胜过丑陋。" ——PEP 20
  • 为开源(甚至是闭源项目)而开发。

一般开发准则

  • “明确胜过含蓄。” —— PEP 20
  • “易读亦有价。” —— PEP 20
  • “人人都能打补丁。” —— 可汗学院开发文档
  • 一旦发现破窗(设计错误,决策失误或编码质量低),马上修补。
  • “现在做也要胜过不去做。” —— PEP 20
  • "测试要彻底。撰写新功能文档。"
  • 人力驱动型开发,比测试驱动型开发更重要。(译者:原文为Even more important that Test-Driven Development--Human-Driven Development,译者认为more important that应该是more important than,应该是作者笔误,否则意思不通,)
  • 这些准则可能——应该是很可能——会改变。

特殊准则

风格

感觉合理的话,就遵循PEP 8。

命名

  • 变量、函数、方法、包、模块
  • 小写,并使用下划线分隔单词(lower_case_with_underscores)
  • 类、异常
  • 首字母大写(CapWords)
  • 受保护的方法和内部函数
  • 单下划线开头(_single_leading_underscore(self, ...))
  • 私有的方法
  • 双下划线开头(__double_leading_underscore(self, ...))
  • 常量
  • 字母全部大写,单词间用下划线分隔(ALL_CAPS_WITH_UNDERSCORES)
一般命名准则

尽量不要使用只有一个字母的变量名(例如,l,I,O等)。

例外:在很简短的代码块中,如果变量名的意思可以从上下文明显地看出来,即可。

没问题

for e in elements:
e.mutate()

避免重复变量名。

正确的做法

import audio

core = audio.Core()
controller = audio.Controller()

错误的做法

import audio

core = audio.AudioCore()
controller = audio.AudioController()

“反向标记”更好。

正确的做法

elements = ...
elements_active = ...
elements_defunct = ...

错误的做法

elements = ...
active_elements = ...
defunct_elements ...

避免使用getter和setter方法。

正确的做法

person.age = 42

错误的做法

person.set_age(42)

缩进

用4个空格符——永远别用Tab制表符。就说这么多。

模块引用

引用整个模块,而不是模块中的单个标识符。举个例子,假设一个cantee模块下面,有一个sessions.py文件,

正确的做法

import canteen
import canteen.sessions
from canteen import sessions

错误的做法

from canteen import get_user  # Symbol from canteen/__init__.py
from canteen.sessions import get_session # Symbol from canteen/sessions.py

例外:如果第三方代码的文档中明确说明要单个引用,即可。

理由:避免循环引用。看这里

把代码引用部分放在文件的顶部,按下面的顺序分成三个部分,每个部分之间空一行。 1. 系统引用 2. 第三方引用 3. 本地引用

理由:明确显示每个模块的引用来源。

文档

遵循PEP 257提出的文档字符串准则。reStructuredText (reST) 和Sphinx有助于确保文档符合标准。

对于功能明显的函数,撰写一行文档字符串。

"""返回``foo``的路径名."""

多行文档字符串应包括:

  • 一行摘要
  • 合适的话,请描述使用场景
  • 参数
  • 返回数据类型和语义信息,除非返回None

    """训练一个用来区分Foo和Bar的模型。

    用法::

    >>> import klassify
    >>> data = [("green", "foo"), ("orange", "bar")]
    >>> classifier = klassify.train(data)

    :param train_data: (color, label)形式的一个元祖列表。

    :rtype: A :class:Classifier <Classifier>

    """

注意

使用主动词(“返回”),而不是描述性的单词(“返回值”)。 在类的文档字符串中为__init__方法撰写文档。

class Person(object):
"""A simple representation of a human being. :param name: A string, the person's name.
:param age: An int, the person's age.
"""
def __init__(self, name, age):
self.name = name
self.age = age
关于注释

尽量少用。与其写很多注释,不如提高代码可读性。通常情况下,短小的方法比注释更有效。

错误的做法

# If the sign is a stop sign
if sign.color == 'red' and sign.sides == 8:
stop()

正确的做法

def is_stop_sign(sign):
return sign.color == 'red' and sign.sides == 8 if is_stop_sign(sign):
stop()

但是的确要写注释时,请牢记:“遵循斯托克与怀特所写的《风格的要素》。” —— PEP 8

每行的长度

不要过分在意。80到100个字符都是没问题的。

使用括号延续当前行。

wiki = (
"The Colt Python is a .357 Magnum caliber revolver formerly manufactured "
"by Colt's Manufacturing Company of Hartford, Connecticut. It is sometimes "
'referred to as a "Combat Magnum". It was first introduced in 1955, the '
"same year as Smith & Wesson's M29 .44 Magnum."
)

测试

尽量争取测试全部代码,但也不必执着于覆盖率。

一般测试准则

  • 使用较长的、描述性的名称。通常情况下,这能避免在测试方法中再写文档。
  • 测试之间应该是孤立的。不要与真实地数据库或网络进行交互。使用单独的测试数据库,测试完即可销毁,或者是使用模拟对象。
  • 使用工厂模式,而不是fixture。
  • 别让不完整的测试通过,否则你就有可能忘记。你应该加上一些占位语句,比如assert False, "TODO: finish me"

单元测试

  • 每次聚焦一个很小的功能点。
  • 运行速度要快,但是速度慢总比不测试好。
  • 通常,每一个类或模型都应该有一个测试用例类。
    import unittest
    import factories class PersonTest(unittest.TestCase): def setUp(self):
    self.person = factories.PersonFactory() def test_has_age_in_dog_years(self):
    self.assertEqual(self.person.dog_years, self.person.age / 7)

功能测试

功能测试是更高层次的测试,更接近最终用户如何与应用交互这一层面。通常用在网络应用与图形应用测试。

  • 按照场景撰写测试。测试用例的测试方法命名应该看上去像场景描述。
  • 在编写代码之前,通过注释说明具体场景信息。
    import unittest
    
    class TestAUser(unittest.TestCase):
    
        def test_can_write_a_blog_post(self):
    # Goes to the her dashboard
    ...
    # Clicks "New Post"
    ...
    # Fills out the post form
    ...
    # Clicks "Submit"
    ...
    # Can see the new post
    ...

请注意,测试用例的类名称和测试方法的名称放在一起,就像是“测试一名用户能否发布博文”。

本文受到下列资料的启发...

原文链接:http://codingpy.com/article/bobp-guide-for-python-development/

【转】Python开发指南:最佳实践精选的更多相关文章

  1. paip.python ide 总结最佳实践o4.

    paip.python ide 总结最佳实践o4. ====2个重要的标准 1.可以自动补全 2.可以断点调试 =======选型使用报告 Komodo正好儿俄机器上有,使用累挂,自动补全还凑火.就是 ...

  2. paip.python连接mysql最佳实践o4

    paip.python连接mysql最佳实践o4 python连接mysql 还使用了不少时间...,相比php困难多了..麻烦的.. 而php,就容易的多兰.. python标准库没mysql库,只 ...

  3. Struts2、Spring、Hibernate 高效开发的最佳实践(转载)

    Struts2.Spring.Hibernate 高效开发的最佳实践 Struts2.Spring.Hibernate(SSH)是最常用的 Java EE Web 组件层的开发技术搭配,网络中和许多 ...

  4. Windows 平台做 Python 开发的最佳组合

    在 Windows 上怎样做 Python 开发?是像大神那样使用纯文本编辑器,还是用更加完善的 IDE?到底是用自带的命令行工具,还是需要装新的 Terminal?本文将带你了解如何利用微软官方维护 ...

  5. ES6 开发规范-最佳实践

    ES6 开发规范(最佳实践) 本文为开发规范,收集方便日后查看. [开发规范]https://blog.csdn.net/zzzkk2009/article/details/53171058?utm_ ...

  6. (转)Android开发:性能最佳实践-管理应用内存

    翻自:http://developer.android.com/training/articles/memory.html 在任何软件开发环境中,RAM都是宝贵的资源,但在移动操作系统中更加珍贵.尽管 ...

  7. [Docker] 容器开发环境最佳实践理论

      保持 image 小       选择合适的 base image.       使用 multi-stage 构建. https://docs.docker.com/develop/develo ...

  8. Python开发指南规范

    分号 不要在行尾加分号, 也不要用分号将两条命令放在同一行. 行长度 每行不超过80个字符 例外: 长的导入模块语句 注释里的URL 不要使用反斜杠连接行. Python会将 圆括号, 中括号和花括号 ...

  9. [蟒蛇菜谱]Python日志记录最佳实践

    # -*- coding: utf8 -*- import logging # 创建一个logger logger = logging.getLogger('mylogger') logger.set ...

随机推荐

  1. 20套新鲜出炉的免费 PSD 格式的图标《免费下载》

    在网页设计中,设计师专注于每一个领域的设计,包括颜色选择.图标.创造力.混色等.正确的选择图标可以使他们的设计脱颖而出,看起来令人震惊.在 Web 设计领域,图标发挥非常重要的作用,因为美丽的和创造性 ...

  2. Swift_3.0_取消杂乱无章的log输出

    一 举例: 输出的杂乱无章的东西 subsystem: com.apple.UIKit, category: HIDEventFiltered, enable_level: , persist_lev ...

  3. Java魔法堂:注解用法详解——@Override

    一.前言 现在有Son和Parent两个类,且类型Son将会重写类型Parent的getName函数.但不幸的是由于码农大意,写成如下代码: public class Parent{ public S ...

  4. elasticsearch配置

    配置文件详解1.0版 配置文件位于es根目录的config目录下面,有elasticsearch.yml和logging.yml两个配置,主配置文件是elasticsearch.yml,日志配置文件是 ...

  5. [ASP.NET] 使用 ASP.NET SignalR 添加实时 Web

    ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程.实时 Web 功能是指这样一种功能:当所连接的客户端变得可用时服务 ...

  6. Math APP 2.0

    首先,我们把这个软件理解成一个投入市场的.帮助小朋友进行算术运算练习的APP. 从质量保证的角度,有哪些需要改进的BUG? 从用户的角度(把自己当成小学生或真的请小学生帮忙),需要在哪些方面进行改进? ...

  7. 比较body.onload(function())、$(document).ready(function())与$(windows).load(function)

    原理对比: body.onload(function())是优先将document的DOM渲染,即将页面所有的元素(包括html标签以及所引用到的图片,flash媒体等媒体文件)加载完成,然后再执行页 ...

  8. BI之SSAS完整实战教程1 -- 开篇, BI简介 & SSAS简介

    文章提纲 商业智能(BI, Business Intelligence)基本概念 SSAS(SQL Server Analysis Services)相关工具(开发.管理和客户端) 总结 一.商业智能 ...

  9. 重新想象 Windows 8.1 Store Apps 系列文章索引

    [源码下载] [重新想象 Windows 8 Store Apps 系列文章] 重新想象 Windows 8.1 Store Apps 系列文章索引 作者:webabcd 1.重新想象 Windows ...

  10. kFreeBsd 国内开源镜像站汇总

    从http://bbs.chinaunix.net/archiver/tid-3756178.html这里抽取了debian源中支撑kfreebsd架构的源. 中科大: http://debian.u ...