使用 attrs 來告別 Python 中的樣板
在我們覆蓋 7 個 PyPI 庫的系列文章中了解更多解決 Python 問題的信息。
-- Moshe Zadka(作者)
Python是當今使用最多 流行的編程語言 之一,因為:它是開源的,它具有廣泛的用途(例如 Web 編程、業務應用、遊戲、科學編程等等),它有一個充滿活力和專註的社區支持它。這個社區是我們在 Python Package Index (PyPI)中提供如此龐大、多樣化的軟體包的原因,用以擴展和改進 Python。並解決不可避免的問題。
在本系列中,我們將介紹七個可以幫助你解決常見 Python 問題的 PyPI 庫。今天,我們將研究 attrs ,這是一個幫助你快速編寫簡潔、正確的代碼的 Python 包。
attrs
如果你已經寫過一段時間的 Python,那麼你可能習慣這樣寫代碼:
class Book(object):
def __init__(self, isbn, name, author):
self.isbn = isbn
self.name = name
self.author = author
接著寫一個 __repr__ 函數。否則,很難記錄 Book 的實例:
def __repr__(self):
return f"Book({self.isbn}, {self.name}, {self.author})"
接下來你會寫一個好看的 docstring 來記錄期望的類型。但是你注意到你忘了添加 edition 和 published_year 屬性,所以你必須在五個地方修改它們。
如果你不必這麼做如何?
@attr.s(auto_attribs=True)
class Book(object):
isbn: str
name: str
author: str
published_year: int
edition: int
使用新的類型注釋語法注釋類型屬性,attrs 會檢測注釋並創建一個類。
ISBN 有特定格式。如果我們想強行使用該格式怎麼辦?
@attr.s(auto_attribs=True)
class Book(object):
isbn: str = attr.ib()
@isbn.validator
def pattern_match(self, attribute, value):
m = re.match(r"^(d{3}-)d{1,3}-d{2,3}-d{1,7}-d$", value)
if not m:
raise ValueError("incorrect format for isbn", value)
name: str
author: str
published_year: int
edition: int
attrs 庫也對 不可變式編程 支持良好。將第一行改成 @attr.s(auto_attribs=True, frozen=True) 意味著 Book 現在是不可變的:嘗試修改一個屬性將會引發一個異常。相反,比如,如果希望將發布日期向後一年,我們可以修改成 attr.evolve(old_book, published_year=old_book.published_year+1) 來得到一個新的實例。
本系列的下一篇文章我們將來看下 singledispatch,一個能讓你向 Python 庫添加方法的庫。
查看本系列先前的文章:
- Cython
- Black
via: https://opensource.com/article/19/5/python-attrs
作者: Moshe Zadka 選題: lujun9972 譯者: geekpi 校對: wxy
本文由 LCTT 原創編譯, Linux中國 榮譽推出
點擊「了解更多」可訪問文內鏈接
TAG:Linux技術 |