设为首页 收藏本站
查看: 962|回复: 0

[经验分享] Python 最佳实践

[复制链接]

尚未签到

发表于 2015-11-29 13:25:40 | 显示全部楼层 |阅读模式
前言
  对我来说,以前每次面试是我审视自己,检验自己的一种方式。每次准备面试,以及被面试官问住的时候才会发现,其实我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
# 而且只能在包内相对引用。 包外都需要绝对引用
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-144947-1-1.html 上篇帖子: python 连接Mysql数据库 下篇帖子: Python——eventlet
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表