前言

对我来说,以前每次面试是我审视自己,检验自己的一种方式。每次准备面试,以及被面试官问住的时候才会发现,其实我python我学的还不够好。工作中也是,可以从其他的同事那里获得成长。但是我今天说的是,我也在自己总结和思考最佳实践这件事。

我想很多人都会有意识的去读一些PEP(Python Enhancement Proposals)。了解语言设计者当时的考虑,这些文案也是经过很长时间的讨论最后才实施的。既然想用好这门语言,必然需要理解设计之美。比如我听说gvanrossum使用emacs作为编辑器,我也使用emacs,就是希望我可以更贴近一些python。

本文根据 The Best of the Best Practices (BOBP) Guide for PythonKhan’s style-guides中对于开发中一些事物的理解和看法,有出至PEP,也有一些python界知名开发者,我加入了一些我自己的理解和看法。

价值观

“Build tools for others that you want to be built for you.” – Kenneth Reitz (Requests等知名库作者)

你自己都不想用的东西做出来有什么意义呢?

“Simplicity is alway better than functionality.” – Pieter Hintjens (ZeroMQ)

我对函数式编程的看法一直是看场景,甚至于我经常会对比性能,义无反顾的使用性能最好的,但是代码又不难懂和繁琐的

“Fit the 90% use-case. Ignore the nay sayers.” – Kenneth Reitz

程序员都有完美主义情怀,但是其实往往我们是在偏激的看事情 – 用户其实不case

“Beautiful is better than ugly.” – PEP 20

开发参考

“Explicit is better than implicit” – PEP 20

不要留坑,我经常看到一些复杂的代码,这些代码的作者写的时候明显知道自己在做什么,但是别人很难维护和看懂.
所以我对自己的职业的基本要求就是: 那天我离职了,后来接手的人不会经常骂我

“Readability counts.” – PEP 20

“Anybody can fix anything.” – Khan’s style-guides

我现在更多不是代码炫技,我经常思考的怎么让最少的代码,最简单的设计结构满足当前需求,也能给未来一段时间里也有扩展性

Fix each broken window (bad design,wrong decision,or poor code) as soon as it is discovered.

我们改bug有个原则 – 测试要覆盖到出bug的地方。每个人内心都有很高的代码质量的要求

“Now is better than never.” – PEP 20

明日复明日,明日何其多。我们在代码review的时候,问题需要在提出的时候就去改,永远不会说下一次再说,因为下一次大多时候是没有下一次了

Test ruthlessly. Write docs for new features.

Even more important that Test-Driven Development–Human-Driven Development

一些细节

PEP8

很多人是排斥的,假如你想让未来部门有自己的风格,习惯。让新人马上上手接受,PEP8是一个非常明智的选择

文件开头

新的文件的开头需要加一些docstring。描述文件的作用,编辑者,修改原因和日期等帮助阅读者的描述.

不要添加#!/usr/bin/python(除非这个文件未来是一个可执行的文件),copyright,__author__或者其他内容.

第一行建议添加# coding-utf-8

命名

  1. Variables,functions,methods,packages,moduleslower_case_with_underscores
  2. Classes and ExceptionsCapWords
  3. Protected methods and internal functions_single_leading_underscore(self,…)
  4. Private methods__double_leading_underscore(self,…)
  5. ConstantsALL_CAPS_WITH_UNDERSCORES
  6. Avoid one-letter variables (esp. l,O,I).永远不要使用没有意义的单字符作为变量名

PS: 这点可以折中,假如一个代码块代码逻辑很清晰,而 这个短的便令也只是过程中的一个间接变量之类的情况下是可以接受的

Good or Bad

列举一些正确和错误的用法.

Avoid redundant labeling.

# Good
import audio core=audio.Core()
controller=audio.Controller() # Bad
import audio core=audio.AudioCore()
controller=audio.AudioController()

不要使用重复意义的标签

Prefer “reverse notation”.

# Good
elements=...
elements_active=...
elements_defunct=... # Bad
elements=...
active_elements=...
defunct_elements...

Avoid getter and setter methods.

# Good
person.age=42 # Bad
person.set_age(42)

Indentation

永远不要Tab和空格混用。使用4个空格作为python缩进

Imports

Import entire modules instead of individual symbols within a module.

PS: 这个时候可以参考tornado的代码用法.

比如现在有这样一个包

 
$tree
└──canteen
├──__init__.py
├──sessions.py

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

PS: 除非这个第三方模块的文档显式的要求这些写

Splitting tricky lines

# Bad:
badge_name=badges.topic_exercise_badges.TopicExerciseBadge.name_for_topic_key_name(self.key().name())
# Good:
badge_name=(badges.topic_exercise_badges.TopicExerciseBadge
.name_for_topic_key_name(self.key().name())) # Bad:
self.redirect("/class_profile?selected_graph_type=%s

我添加的规则

from … import …

# Bad
from aa import alonglonglonglonglong,alonglonglonglonglonglonglonglonglong,
alonglonglonglonglonglong # Good
from aa import(alonglonglonglonglong,alonglonglonglonglonglonglonglonglong,
alonglonglonglonglonglong)
from aa import(alonglonglonglonglong,alonglonglonglonglonglonglonglonglong,
alonglonglonglonglonglong,alonglonglonglonglonglonglong,
alonglonglonglonglonglong2) # Good。 当引入的函数/类/变量很多时,也可以选择空 4 个空格的方式,而不需要和首行的左括号后对齐

相对引用(relative import) 和 绝对引用(absolute import)

$cat xx/models/user/consts.py  # 如果想引用这个变量
TMP=1 $cat xx/views/user.py
from xx.models.user.consts import TMP # recommended。 # 假如模块层级>=3。 比如 xx/models/user/consts.py 就在根目录下的第 3 级。 如果其他当前目录下源文件需要调用它的内容。 也可以选择相对引用
$cat xx/models/user/main.py # 需要和 consts.py 在一个目录下才可以
from consts import TMP # Bad
from.consts import TMP # Good # 而且只能在包内相对引用。 包外都需要绝对引用

Python 最佳实践的更多相关文章

  1. python 最佳实践与资源汇总

    python 最佳实践 (部分) 一. 结构化工程 文件 功能 README.rst readme LICENSE 许可证 setup.py 打包和发布管理 requirements.txt 开发依赖 ...

  2. Python 最佳实践指南 2018 学习笔记

    基础信息 版本 Python 2.7 Python 3.x Python2.7 版本在 2020 年后不再提供支持,建议新手使用 3.x 版本进行学习 实现 CPython:Python的标准实现: ...

  3. PYTHON 最佳实践指南(转)

    add by zhj: 本文参考了The Hitchhiker's Guide to Python,当然也加入了作者的一些东西.The Hitchhiker's Guide to Python 的gi ...

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

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

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

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

  6. paip.复制文件 文件操作 api的设计uapi java python php 最佳实践

    paip.复制文件 文件操作 api的设计uapi java python php 最佳实践 =====uapi   copy() =====java的无,要自己写... ====php   copy ...

  7. python高级编程之选择好名称:pepe8和命名最佳实践

    # # -*- coding: utf-8 -*- # # python:2.x # __author__ = 'Administrator' # my_list=['a','b','c','d'] ...

  8. python高级编程之最佳实践,描述符与属性01

    # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #最佳实践 """ 为了避免前面所有的 ...

  9. Python编程之美:最佳实践指南PDF高清完整版免费下载|百度云盘|Python新手到进阶

    百度云盘:Python编程之美:最佳实践指南PDF高清完整版免费下载 提取码:1py6 内容简介 <Python编程之美:最佳实践指南>是Python用户的一本百科式学习指南,由Pytho ...

随机推荐

  1. Android之开发杂记(三)

    一.popup 弹出框 在onCreate中创建时异常 Unable to add window -- token null is not valid; is your activity runnin ...

  2. 《Linux内核设计与实现》读书笔记(十一)- 定时器和时间管理【转】

    转自:http://www.cnblogs.com/wang_yb/archive/2013/05/10/3070373.html 系统中有很多与时间相关的程序(比如定期执行的任务,某一时间执行的任务 ...

  3. mysql0000-00-00日期异常及解决方法

    当mysql的datetime类型的值设置为0000-00-00 00:00:00(或者 0000-00-00)的时候,java的datetime或者timestamp读取到这个值并转换的时候,将抛出 ...

  4. poj-3040 Allowance (贪心)

    http://poj.org/problem?id=3040 FJ 有n种不同面值的硬币,每种硬币都有相应的个数,大面值的硬币值总能被小面值的硬币值整除,每周需要支付 Bessie   c元,问最多能 ...

  5. How to install ruby on mac/ change ruby source in china

    his one is tailor made for the Basix users among you. If you've been itching to try out Ruby and/or ...

  6. tc srm 632 500 (规律)

    We have a sequence of N positive integers: a[0] through a[N-1]. You do not know these integers. All ...

  7. 为Gradle添加UTF-8支持

    gradle默认使用系统字符编码,大多数中文系统是使用GBK编码 但程序员绝大部分都是使用UTF-8写各类java文件以及其他资源文件 编译时很容易报错,比如下面的错误: ”警告:编码 GBK 的不可 ...

  8. 深入.NET平台和C#编程 错题录

    1.在C#中,关于文件操作相关的类说法正确的是(AB) <选择二项> A:FileInfo类提供了用于操作文件的实例方法 B:File类提供了用于操作文件的静态方法 C:Directory ...

  9. JProfiler 使用说明

    一个全功能的 Java 剖析工具( profiler ),专用于分析 J2SE 和 J2EE 应用程序.它把 CPU .执行绪和内存的剖析组合在一个强大的 应用中. JProfiler 可提供许多 I ...

  10. Java [Leetcode 96]Unique Binary Search Trees

    题目描述: Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For ...