Python 最佳实践
前言
對(duì)我來(lái)說(shuō),以前每次面試是我審視自己,檢驗(yàn)自己的一種方式。每次準(zhǔn)備面試,以及被面試官問(wèn)住的時(shí)候才會(huì)發(fā)現(xiàn),其實(shí)我python我學(xué)的還不夠好。工作中也是,可以從其他的同事那里獲得成長(zhǎng)。但是我今天說(shuō)的是,我也在自己總結(jié)和思考最佳實(shí)踐這件事。
我想很多人都會(huì)有意識(shí)的去讀一些PEP(Python Enhancement Proposals)。了解語(yǔ)言設(shè)計(jì)者當(dāng)時(shí)的考慮,這些文案也是經(jīng)過(guò)很長(zhǎng)時(shí)間的討論最后才實(shí)施的。既然想用好這門(mén)語(yǔ)言,必然需要理解設(shè)計(jì)之美。比如我聽(tīng)說(shuō)gvanrossum使用emacs作為編輯器,我也使用emacs,就是希望我可以更貼近一些python。
本文根據(jù) The Best of the Best Practices (BOBP) Guide for Python 和 Khan’s style-guides中對(duì)于開(kāi)發(fā)中一些事物的理解和看法,有出至PEP,也有一些python界知名開(kāi)發(fā)者,我加入了一些我自己的理解和看法。
價(jià)值觀
“Build tools for others that you want to be built for you.” – Kenneth Reitz (Requests等知名庫(kù)作者)
你自己都不想用的東西做出來(lái)有什么意義呢?
“Simplicity is alway better than functionality.” – Pieter Hintjens (ZeroMQ)
我對(duì)函數(shù)式編程的看法一直是看場(chǎng)景,甚至于我經(jīng)常會(huì)對(duì)比性能,義無(wú)反顧的使用性能最好的,但是代碼又不難懂和繁瑣的
“Fit the 90% use-case. Ignore the nay sayers.” – Kenneth Reitz
程序員都有完美主義情懷,但是其實(shí)往往我們是在偏激的看事情 – 用戶其實(shí)不case
“Beautiful is better than ugly.” – PEP 20
開(kāi)發(fā)參考
“Explicit is better than implicit” – PEP 20
不要留坑,我經(jīng)常看到一些復(fù)雜的代碼,這些代碼的作者寫(xiě)的時(shí)候明顯知道自己在做什么,但是別人很難維護(hù)和看懂.
所以我對(duì)自己的職業(yè)的基本要求就是: 那天我離職了,后來(lái)接手的人不會(huì)經(jīng)常罵我
“Readability counts.” – PEP 20
“Anybody can fix anything.” – Khan’s style-guides
我現(xiàn)在更多不是代碼炫技,我經(jīng)常思考的怎么讓最少的代碼,最簡(jiǎn)單的設(shè)計(jì)結(jié)構(gòu)滿足當(dāng)前需求,也能給未來(lái)一段時(shí)間里也有擴(kuò)展性
Fix each broken window (bad design,wrong decision,or poor code) as soon as it is discovered.
我們改bug有個(gè)原則 – 測(cè)試要覆蓋到出bug的地方。每個(gè)人內(nèi)心都有很高的代碼質(zhì)量的要求
“Now is better than never.” – PEP 20
明日復(fù)明日,明日何其多。我們?cè)诖areview的時(shí)候,問(wèn)題需要在提出的時(shí)候就去改,永遠(yuǎn)不會(huì)說(shuō)下一次再說(shuō),因?yàn)橄乱淮未蠖鄷r(shí)候是沒(méi)有下一次了
Test ruthlessly. Write docs for new features.
Even more important that Test-Driven Development–Human-Driven Development
一些細(xì)節(jié)
PEP8
很多人是排斥的,假如你想讓未來(lái)部門(mén)有自己的風(fēng)格,習(xí)慣。讓新人馬上上手接受,PEP8是一個(gè)非常明智的選擇
文件開(kāi)頭
新的文件的開(kāi)頭需要加一些docstring。描述文件的作用,編輯者,修改原因和日期等幫助閱讀者的描述.
不要添加#!/usr/bin/python(除非這個(gè)文件未來(lái)是一個(gè)可執(zhí)行的文件),copyright,__author__或者其他內(nèi)容.
第一行建議添加# coding-utf-8
命名
PS: 這點(diǎn)可以折中,假如一個(gè)代碼塊代碼邏輯很清晰,而 這個(gè)短的便令也只是過(guò)程中的一個(gè)間接變量之類的情況下是可以接受的
Good or Bad
列舉一些正確和錯(cuò)誤的用法.
Avoid redundant labeling.
# Good import audiocore=audio.Core() controller=audio.Controller()# Bad import audiocore=audio.AudioCore() controller=audio.AudioController()?
不要使用重復(fù)意義的標(biāo)簽
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
永遠(yuǎn)不要Tab和空格混用。使用4個(gè)空格作為python縮進(jìn)
Imports
Import entire modules instead of individual symbols within a module.
PS: 這個(gè)時(shí)候可以參考tornado的代碼用法.
比如現(xiàn)在有這樣一個(gè)包
$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: 除非這個(gè)第三方模塊的文檔顯式的要求這些寫(xiě)
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?
我添加的規(guī)則
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。 當(dāng)引入的函數(shù)/類/變量很多時(shí),也可以選擇空 4 個(gè)空格的方式,而不需要和首行的左括號(hào)后對(duì)齊相對(duì)引用(relative import) 和 絕對(duì)引用(absolute import)
$cat xx/models/user/consts.py # 如果想引用這個(gè)變量 TMP=1$cat xx/views/user.py from xx.models.user.consts import TMP # recommended。# 假如模塊層級(jí)>=3。 比如 xx/models/user/consts.py 就在根目錄下的第 3 級(jí)。 如果其他當(dāng)前目錄下源文件需要調(diào)用它的內(nèi)容。 也可以選擇相對(duì)引用 $cat xx/models/user/main.py # 需要和 consts.py 在一個(gè)目錄下才可以 from consts import TMP # Bad from.consts import TMP # Good# 而且只能在包內(nèi)相對(duì)引用。 包外都需要絕對(duì)引用?
轉(zhuǎn)載于:https://www.cnblogs.com/Vito2008/p/4987476.html
總結(jié)
以上是生活随笔為你收集整理的Python 最佳实践的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 进击的UI---------------
- 下一篇: 自学Python六 爬虫基础必不可少的