摘要:但實際工作中,想這種語法糖在有些場景中有讓人愛不釋手。對于該需求,如果按照上述代碼執(zhí)行,則需要在每一個關(guān)鍵字處對需要刪除的文件進行處理,這樣會有很多重復(fù)代碼。以往在語言中,使用可以很好的完成任務(wù),很遺憾并不支持。
此文章收集平時工作中一些Pythonic code,以供后面參考。
循環(huán)結(jié)束處理通常以往的做法是設(shè)置一個標(biāo)志位來處理或其他額外處理:
def get_file_content(fpath): """Get file content by the right encoding.""" G_ENCODING_LIST = ["utf-8", "gbk", "latin1"] for encode in G_ENCODING_LIST: try: content = open(fpath, encoding=encode).read() return content except UnicodeDecodeError: if encode == G_ENCODING_LIST[-1]: raise except FileNotFoundError: raise
而下例中的做法則是利用了Python本身語法的特性:
def get_file_content(fpath): """Get file content by the right encoding.""" G_ENCODING_LIST = ["utf-8", "gbk", "latin1"] for encode in G_ENCODING_LIST: try: content = open(fpath, encoding=encode).read() return content except UnicodeDecodeError: pass except FileNotFoundError: raise else: raise UnicodeDecodeError
另外需要注意的是:
在except分支中,如果是拋出剛抓取的異常,可不必指定。
為了避免過深的try except嵌套,這里使用了for循環(huán)使代碼塊更加扁平
列表生成式創(chuàng)建列表,通常的做法可以是這樣:
def add_patterns(self, ptn_docs): """Add pattern set info.""" ltypes = [] for ltype, doc in ptn_docs: ltypes.append(ltype) # 不使用列表表達式創(chuàng)建列表 doc_list = [] for word in jieba.cut(doc): doc_list.append(word) doc_list = [word for word in jieba.cut(doc)] doc_list = list(set(doc_list) - set(G_STOP_WORDS)) self._ptn_simtest_dbs[ltype]["all_doc_list"].append(doc_list) self._ptn_simtest_dbs[ltype]["dict"].add_documents([doc_list]) ......
Pythonic的做法則是這樣:
def add_patterns(self, ptn_docs): """Add pattern set info.""" ltypes = [] for ltype, doc in ptn_docs: ltypes.append(ltype) # 使用列表表達式創(chuàng)建列表 doc_list = [word for word in jieba.cut(doc)] doc_list = list(set(doc_list) - set(G_STOP_WORDS)) self._ptn_simtest_dbs[ltype]["all_doc_list"].append(doc_list) self._ptn_simtest_dbs[ltype]["dict"].add_documents([doc_list]) ......
注釋:
這里使用了集合差的方式求列表差集:
doc_list = list(set(doc_list) - set(G_STOP_WORDS))布爾值判斷
根據(jù)判斷對象結(jié)果返回True or False,可以通過以下方法簡寫:
def _check_fingerprint(self, suspect): """Check whether fingerprint exist.""" content = open(suspect, "rb").read() md5sum = hashlib.md5(content).hexdigest() wsp = self.ws_data.filter(fingerprint=md5sum) return True is wsp else False
還有更簡潔的寫法嗎:
def _check_fingerprint(self, suspect): """Check whether fingerprint exist.""" content = open(suspect, "rb").read() md5sum = hashlib.md5(content).hexdigest() wsp = self.ws_data.filter(fingerprint=md5sum) return bool(wsp)goto in Python
記得學(xué)習(xí)C語言的時候,老師通常會說不建議我們使用“goto”這樣的語法,以免造成意想不到的結(jié)果。
但實際工作中,想“goto”這種語法糖在有些場景中有讓人愛不釋手。
先看這個場景,下面代碼解析一個壓縮包中的pattern是否滿足指定格式:
def check_pattern_package(fpath): """Check pattern package correctness.""" base_dir = os.path.dirname(fpath) ret, reason, extract_dir = True, None, None with zipfile.ZipFile(fpath) as zf: infolist = zf.infolist() if not infolist[0].is_dir(): return False, REST_ERR_400_ZIP_BADFILE zf_base_dir = infolist[0].filename md5sum_file = os.path.join(zf_base_dir, "md5sum.txt") if md5sum_file not in zf.namelist(): return False, REST_ERR_400_ZIP_BADFORMAT zf.extractall(base_dir) extract_dir = os.path.join(base_dir, zf_base_dir) try: with open(os.path.jion(base_dir, md5sum_file)) as md5_fp: reader = csv.reader(md5_fp, delimiter=" ") except FileNotFoundError: return False, REST_ERR_400_ZIP_BADFORMAT else: for row in reader: if len(row) < 2: raise PtnPackageParseError(REST_ERR_400_ZIP_BADFORMAT) pzf = os.path.join(extract_dir, row[1]) with open(pzf, "rb") as fpzf: fdata = fpzf.read() md5sum = hashlib.md5(fdata).hexdigest() if md5sum != row[0]: return False, REST_ERR_400_ZIP_BADFILE return True, _
在上述代碼中,為了更好的執(zhí)行效率,一旦發(fā)現(xiàn)格式不符函數(shù)直接返回。
現(xiàn)在對這個函數(shù)有一個新的需求:根據(jù)函數(shù)的輸入?yún)?shù),刪除壓縮包和解壓縮目錄所有文件。對于該需求,如果按照上述代碼執(zhí)行,則需要在每一個“return”關(guān)鍵字處對需要刪除的文件進行處理,這樣會有很多重復(fù)代碼。以往在C語言中,使用“goto”可以很好的完成任務(wù),很遺憾Python并不支持“goto”。
使用“try exception”控制代碼執(zhí)行路徑模擬“goto”:
class PtnPackageParseError(Exception): """Exception for pattern package parse.""" def __init__(self, reason, message=""): self.reason = reason self.message = message super().__init__() def check_pattern_package(fpath, cleanup=False): """Check pattern package correctness.""" base_dir = os.path.dirname(fpath) ret, reason, extract_dir = True, None, None try: with zipfile.ZipFile(fpath) as zf: infolist = zf.infolist() if not infolist[0].is_dir(): raise PtnPackageParseError(REST_ERR_400_ZIP_BADFILE) zf_base_dir = infolist[0].filename md5sum_file = os.path.join(zf_base_dir, "md5sum.txt") if md5sum_file not in zf.namelist(): raise PtnPackageParseError(REST_ERR_400_ZIP_BADFORMAT) zf.extractall(base_dir) extract_dir = os.path.join(base_dir, zf_base_dir) try: with open(os.path.jion(base_dir, md5sum_file)) as md5_fp: reader = csv.reader(md5_fp, delimiter=" ") except FileNotFoundError: raise PtnPackageParseError(REST_ERR_400_ZIP_BADFORMAT) else: for row in reader: if len(row) < 2: raise PtnPackageParseError(REST_ERR_400_ZIP_BADFORMAT) pzf = os.path.join(extract_dir, row[1]) with open(pzf, "rb") as fpzf: fdata = fpzf.read() md5sum = hashlib.md5(fdata).hexdigest() if md5sum != row[0]: raise PtnPackageParseError(REST_ERR_400_ZIP_BADFILE) except PtnPackageParseError as e: ret, reason = False, e.reason finally: if cleanup: os.unlink(fpath) if os.path.exists(extract_dir): os.removedirs(extract_dir) return ret, reason, extract_dir
原文出處:github: jasonTu/python-material-collection
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/41624.html
摘要:溫習(xí)統(tǒng)計學(xué)的知識為更深層次的學(xué)習(xí)做準(zhǔn)備在的演講中說就是我們理解但不知道另外的是如何的我在臺下想對于那可以理解的我好像都只懂了參考標(biāo)準(zhǔn)高效的流程課程用的是我不想再學(xué)一門類似的語言了我會找出相對應(yīng)的和的來源流程什么是干凈的一個變 Why The Data Science Specialization 溫習(xí)統(tǒng)計學(xué)的知識, 為更深層次的學(xué)習(xí)做準(zhǔn)備 Andrew Ng 在 2015 GTC ...
摘要:整理可愛的簡化元編程的是什么鬼,多線程性能究竟如何淺談的語句基礎(chǔ)深入理解中的賦值引用拷貝作用域命名空間和作用域窺探引用計數(shù)編寫漂亮的,可讀的代碼的最佳時間語言中計數(shù)方法的演變描述符解密的內(nèi)存管理機制深入的內(nèi)存管理源碼剖析 Python 整理 Python3 Official Documentation Python3 Document Coding Style PEP 8 Encodi...
摘要: Caching Libraries for caching data. Beaker - A library for caching and sessions for use with web applications and stand-alone Python scripts and applications. dogpile.cache - dogpile.cache...
摘要:我希望的是類似中文字符這樣的使用體驗。中文中文這里的遍歷就類似中文中文我們這里干的事情類似于里兩種類型的區(qū)分。 致力于在現(xiàn)代C++中提供Python的編程體驗。這個建立在兩個關(guān)鍵的基礎(chǔ)上 c++ 11/14/17 提供了從 auto 到 structure binding 的語法便利 https://ericniebler.github.io... 提供的 range 抽象 但是 ...
摘要:最終還是要寫上足夠量的代碼,才會有悟道的那一刻。另外,對于代碼本身,有一套書寫規(guī)范,叫做。 Python 里有個小彩蛋: 在 Python Shell 里輸入 import this showImg(https://segmentfault.com/img/remote/1460000018394156?w=600&h=463); 這段話被稱作 Python 之禪 ( The Zen ...
閱讀 1808·2023-04-26 01:44
閱讀 1222·2021-11-12 10:34
閱讀 1611·2021-09-09 09:33
閱讀 1740·2019-08-30 15:44
閱讀 2903·2019-08-30 13:49
閱讀 2199·2019-08-29 15:26
閱讀 954·2019-08-26 13:30
閱讀 1420·2019-08-23 18:15