Python代碼風格與編程習慣重要嗎?
Python代碼風格
首先我們要以 PEP8 代碼規(guī)范為標準,但也無需完全遵守。例如:一行不能超過 79 個字符等。
Python模塊模板
模塊開頭指定編碼格式
模塊文檔注釋,展示模塊的信息,信息內(nèi)容自己決定,如:
- Author,作者
- Desc,模塊描述
- Date,創(chuàng)建時間
有一個 main()
函數(shù)
有一個程序主入口 if __name__ == '__main__':
#!/usr/bin/python3 # -*- coding:utf-8 -*- # @Author: Hui # @Desc: { 項目主入口模塊 } # @Date: 2020/05/21 13:04 def main(): print('Hello Python') if __name__ == '__main__': main()
main()
函數(shù)方便用于測試當前模塊功能。
import 導入
import
導入,避免使用 from ... import *
,因為這可能導致模塊、類、變量名重復而導致錯誤。
我自己的 import
代碼風格有兩種。
由短到長
根據(jù)代碼的長度由短到長依次導入,import
過度到 from ... import ...
,換行分割可有可無,我是根據(jù) from ... import ...
前面的 import
的數(shù)量和整體美觀來決定要不要換行。
import os import sys import time import random import config import pygame import requests import numpy as np from PIL import Image from threading import Thread from datetime import datetime
分類導入
分類導入,是分好類后在根據(jù)代碼的長度由短到長依次導入,主要有:
- Python內(nèi)置模塊
- Python自建模塊
- Python第三方庫
# Python內(nèi)置模塊導入 import os import sys import time import random from threading import Thread from datetime import datetime # Python自建模塊、第三方庫導入 import config import pygame import requests import numpy as np from PIL import Image
導入順序依次為
Python內(nèi)置模塊 --> Python自建模塊 --> Python第三方庫
根據(jù)自己的風格,導入的自建模塊、Python第三方庫少時可以在一起無需換行
導入的自建模塊少時可以跟Python內(nèi)置模塊在一起,就是轉換成 由短到長 的風格
建議
導入模塊代碼風格無需照搬照抄地遵循,我們做任何的優(yōu)化就是為了讓代碼更好看,結構清晰,無需刻意遵循死規(guī)則、爛規(guī)則,應該活學活用,創(chuàng)新變化,學習別人優(yōu)秀的方案,總結出適合自己的。
例如:
假如import
導入語句比 from
導入語句更長,要遵循或者糾結 import
是要在 from
導入語句前面還是由短到長排放呢?
import numpy as np import multiprocessing from PIL import Image
import numpy as np from PIL import Image import multiprocessing
無需太過糾結、摳字眼,兩種導入風格都可以。
Django代碼范例
封裝html的url網(wǎng)址
渲染 html
頁面,把 html
的存放路徑總體封裝到一個類里面。
class BookView(object): """圖書模塊視圖類""" # 圖書首頁 INDEX_VIEW = 'book/index.html' # 圖書信息頁 BOOK_INFO_VIEW = 'book/book_info.html' # 英雄信息頁 HERO_INFO_VIEW = 'book/hero_info.html' # 定義視圖函數(shù) def index(request): """ 圖書首頁 """ data = { 'content': 'hello world', 'list': list(range(1, 10)), } return render(request, BookView.INDEX_VIEW, data) def show_book(request): """ 展示圖書信息界面 """ book_list = BookInfo.objects.all() data = { 'book': book_list } return render(request, BookView.BOOK_INFO_VIEW, data)
封裝注冊的提示錯誤信息
返回頁面提示的錯誤信息,統(tǒng)一封裝到字典中,提高代碼可讀性、擴展性。
初始版本
class UserView(object): """用戶模塊視圖類""" LOGIN_VIEW = 'user/login.html' REGISTER_VIEW = 'user/register.html' USER_CENTER_VIEW = 'user/user_center.html' def register(request): username = request.get('username') password = request.get('password') email = request.get('email') allow = request.get('allow') # 校驗注冊項是否有空值 # all()中有一個為空返回False,都有值則True if not all([username, password, email]): return render(request, UserView.REGISTER_VIEW, {'error_msg': '數(shù)據(jù)不完整'}) # 校驗是否勾選(同意)用戶協(xié)議 if allow != 'on': return render(request, UserView.REGISTER_VIEW, {'error_msg': '請勾選用戶協(xié)議'}) # 校驗用戶名是否重復 try user = User.object.get(username=username) except User.DoesNotExists: user = None if user: return render(request, UserView.REGISTER_VIEW, {'error_msg': '該用戶已存在'}) return render(request, 'register.html')
可以看到在返回響應數(shù)據(jù)時代碼大致一樣,只有提示信息不一樣
return render(request, UserView.REGISTER_VIEW, {'error_msg': '數(shù)據(jù)不完整'}) return render(request, UserView.REGISTER_VIEW, {'error_msg': '請勾選用戶協(xié)議'}) return render(request, UserView.REGISTER_VIEW, {'error_msg': '該用戶已存在'})
因此封裝后的版本
def register(request): username = request.get('username') password = request.get('password') email = request.get('email') allow = request.get('allow') error_msg = { 'email_error': '郵箱格式不正確', 'user_exists': '該用戶已存在', 'data_error': '數(shù)據(jù)不完整', 'user_protocol': '請勾選用戶協(xié)議', } # 返回頁面的數(shù)據(jù) data = dict() # 校驗注冊項是否有空值 # all()中有一個為空返回False,都有值則True if not all([username, password, email]): data['error_msg'] = error_msg['data_error'] # 校驗是否勾選(同意)用戶協(xié)議 elif allow != 'on': data['error_msg'] = error_msg['user_protocol'] else: # 校驗用戶名是否重復 user = User.object.filter(username=username) if user: data['error_msg'] = error_msg['user_error'] else: pass return render(request, UserView.REGISTER_VIEW, data)
# 校驗用戶名是否重復 try user = User.object.get(username=username) except User.DoesNotExists: user = None
優(yōu)化后
User.object.filter(username=username)
get
獲取不到數(shù)據(jù)會報異常,filter則返回一個空的 query_set
查詢結果集,去除了 try ... except
異常捕獲。讓代碼結構更清晰。
我們把 if、if..
改成了 if elif else
,把 render(request, 'register.html', data)
抽到外面去了,并不需要在每一個 if
里面 return
響應。把錯誤信息封裝在 error_msg
字典中,下次想再添加一些錯誤提示信息或者想修改錯誤提示信息可以在 error_msg
字典中添加、修改,這樣易維護、擴展,也更加明確有哪些錯誤信息。
到此這篇關于Python代碼風格與編程習慣重要嗎?的文章就介紹到這了,更多相關Python編程規(guī)范內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python+uiautomator2實現(xiàn)手機鎖屏解鎖功能
python-uiautomator2封裝了谷歌自帶的uiautomator2測試框架,提供便利的python接口,這篇文章給大家介紹使用Python+uiautomator2實現(xiàn)手機鎖屏解鎖(期望輸入的鎖屏密碼,基于滑動解鎖),感興趣的朋友一起看看吧2021-04-04python 添加用戶設置密碼并發(fā)郵件給root用戶
這篇文章主要介紹了python 添加用戶設置密碼并發(fā)郵件給root用戶的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-07-07python使用隱式循環(huán)快速求和的實現(xiàn)示例
這篇文章主要介紹了python使用隱式循環(huán)快速求和的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-09-09在Python中執(zhí)行和調(diào)用JavaScript的多種方法小結
JavaScript(JS)是一種常用的腳本語言,通常用于網(wǎng)頁開發(fā),但有時也需要在Python中執(zhí)行或調(diào)用JavaScript代碼,本文將詳細介紹Python中執(zhí)行和調(diào)用JavaScript的多種方法,每種方法都將附有示例代碼,方便理解如何在Python中與JavaScript進行互動,需要的朋友可以參考下2023-11-11通過Python使用saltstack生成服務器資產(chǎn)清單
人工去對每一臺服務器的硬件信息并記錄早已經(jīng)過去了,無論通過腳本還是自動化工具都是可以進行一次編寫到處抓取的,本文主要使用saltstack作為使用工具,然后利用其提供的APi編寫所需的Python腳本2016-03-03