Python 最佳实践
前言
对我来说,以前每次面试是我审视自己,检验自己的一种方式。每次准备面试,以及被面试官问住的时候才会发现,其实我python我学的还不够好。工作中也是,可以从其他的同事那里获得成长。但是我今天说的是,我也在自己总结和思考最佳实践这件事。
我想很多人都会有意识的去读一些PEP(Python Enhancement Proposals)。了解语言设计者当时的考虑,这些文案也是经过很长时间的讨论最后才实施的。既然想用好这门语言,必然需要理解设计之美。比如我听说gvanrossum使用emacs作为编辑器,我也使用emacs,就是希望我可以更贴近一些python。
本文根据 The Best of the Best Practices (BOBP) Guide for Python 和 Khan’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
命名
- Variables,functions,methods,packages,moduleslower_case_with_underscores
- Classes and ExceptionsCapWords
- Protected methods and internal functions_single_leading_underscore(self,…)
- Private methods__double_leading_underscore(self,…)
- ConstantsALL_CAPS_WITH_UNDERSCORES
- 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 最佳实践的更多相关文章
- python 最佳实践与资源汇总
python 最佳实践 (部分) 一. 结构化工程 文件 功能 README.rst readme LICENSE 许可证 setup.py 打包和发布管理 requirements.txt 开发依赖 ...
- Python 最佳实践指南 2018 学习笔记
基础信息 版本 Python 2.7 Python 3.x Python2.7 版本在 2020 年后不再提供支持,建议新手使用 3.x 版本进行学习 实现 CPython:Python的标准实现: ...
- PYTHON 最佳实践指南(转)
add by zhj: 本文参考了The Hitchhiker's Guide to Python,当然也加入了作者的一些东西.The Hitchhiker's Guide to Python 的gi ...
- paip.python连接mysql最佳实践o4
paip.python连接mysql最佳实践o4 python连接mysql 还使用了不少时间...,相比php困难多了..麻烦的.. 而php,就容易的多兰.. python标准库没mysql库,只 ...
- paip.python ide 总结最佳实践o4.
paip.python ide 总结最佳实践o4. ====2个重要的标准 1.可以自动补全 2.可以断点调试 =======选型使用报告 Komodo正好儿俄机器上有,使用累挂,自动补全还凑火.就是 ...
- paip.复制文件 文件操作 api的设计uapi java python php 最佳实践
paip.复制文件 文件操作 api的设计uapi java python php 最佳实践 =====uapi copy() =====java的无,要自己写... ====php copy ...
- python高级编程之选择好名称:pepe8和命名最佳实践
# # -*- coding: utf-8 -*- # # python:2.x # __author__ = 'Administrator' # my_list=['a','b','c','d'] ...
- python高级编程之最佳实践,描述符与属性01
# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #最佳实践 """ 为了避免前面所有的 ...
- Python编程之美:最佳实践指南PDF高清完整版免费下载|百度云盘|Python新手到进阶
百度云盘:Python编程之美:最佳实践指南PDF高清完整版免费下载 提取码:1py6 内容简介 <Python编程之美:最佳实践指南>是Python用户的一本百科式学习指南,由Pytho ...
随机推荐
- PHP 时间函数 date 参数详解
time();表示的是从1970-01-01到现在共走了多少秒,不便于看,但便于计算 要找出前一天的时间就是 time()-60*60*24; 要找出前一年的时间就是 time()*60*60*24* ...
- 《OD学hadoop》Linux基础
一.Linux基本环境 1. Linux常见版本及VMware虚拟机安装Linux系统 2. 虚拟机网络配置(IP地址.主机名.防火墙) 3. 文件基本命令操作 4. 四大远程连接工具使用 二.Lin ...
- HeadFirst 12 (web应用安全)
测试领域可以使用的方法,在tomcat-users.xml 中设置授权, 为什么这个不能在生产环境中呢, 因为如果这个设置在生产环境中, 那么当你想修改”授权时”, 就要修改这个xml文件, 那么就要 ...
- C# Winform DataGridView分页功能的实现
// 1.定义几个所需的公有成员: ; //每页显示行数 ; //总记录数 ; //页数=总记录数/每页显示行数 ; //当前页号 ; //当前记录行 DataSet ds = new DataSet ...
- 如何直接在github网站上更新你fork的repo?
玩过github的人一定会在你自己的账号上fork了一些github开源项目.这些开源项目往往更新比较活跃,你今天fork用到你自己的项目中去了,过几个星期这个fork的origin可能有一些bugf ...
- HDU 2126 (背包方法数) Buy the souvenirs
DP还有很长很长一段路要走.. 题意:给出n纪念品的价格和钱数m,问最多能买多少件纪念品和买这些数量的纪念品的方案数. 首先,求能买最多的纪念品的数量,用贪心法可以解决.将价钱排序,然后从最便宜的开始 ...
- UVa 247 Calling Circles【传递闭包】
题意:给出n个人的m次电话,问最后构成多少个环,找出所有的环 自己想的是:用map来储存人名,每个人名映射成一个数字编号,再用并查集,求出有多少块连通块,输出 可是map不熟,写不出来,而且用并查集输 ...
- C#序列化XML至对象
内容来源: http://www.cnblogs.com/fish-li/archive/2013/05/05/3061816.html#_label0 自己做的Demo下载地址:Demo
- 长期演进技术(LTE,Long Term Evolution)
/********************************************************************************* * 长期演进技术(LTE,Long ...
- android中handler用法总结
一.Handler的定义: Handler主要接收子线程发送的数据, 并用此数据配合主线程更新UI,用来跟UI主线程交互用.比如可以用handler发送一个message,然后在handler的线程中 ...