使用 attrs 來告別 Python 中的樣板
在我們覆蓋 7 個 PyPI 庫的系列文章中瞭解更多解決 Python 問題的資訊。
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 庫新增方法的庫。
檢視本系列先前的文章:
via: https://opensource.com/article/19/5/python-attrs
作者:Moshe Zadka 選題:lujun9972 譯者:geekpi 校對:wxy
訂閱“Linux 中國”官方小程式來檢視
相關文章
- Sourcery - Swift超程式設計實踐,告別樣板程式碼Swift程式設計
- angular attrs.$observe和$scope.$watch的區別Angular
- angularJS的$attrs方法使用程式碼例項AngularJS
- 使用 WebAuthn 告別密碼:線上身份保護的未來Web密碼
- Python中eval與exec的使用及區別Python
- python 中 is, is not ,==, != 的區別Python
- JavaScript 中的原型原來是這樣的JavaScript原型
- B365主機板怎麼樣?B365晶片組主機板和B360主機板的區別介紹晶片
- 053、Vue3+TypeScript基礎,頁面通訊之$attrs的使用VueTypeScript
- Python中/與//的區別是什麼?其如何使用?Python
- PostgreSQL 14中連線引數target_session_attrs增強SQLSession
- Python 中 is 和 == 的區別Python
- Python中is和==的區別Python
- Python中的鴨子型別Python型別
- Python中 ‘==‘ 與‘is‘的區別Python
- python3.13 有人使用了嗎?多併發使用起來怎麼樣呢?Python
- python中 _、__、__xx__() 區別及使用場景Python
- Python中列表遍歷使用range和enumerate的區別Python
- Python未來的發展趨勢怎麼樣?Python
- 關於 vue2.x 的 $attrs 和 $listenersVue
- 使用Python來調教我的微信Python
- Python中的型別檢查Python型別
- Python 中的列舉型別Python型別
- python中的型別轉換Python型別
- 原來CSS中的border還可以這樣玩CSS
- 怎樣理解和識別 Linux 中的檔案型別Linux型別
- 蘋果告別“高大上” 越來越向安卓和中國使用者靠近蘋果安卓
- python中*args的使用Python
- python中for……else……的使用Python
- python 中assert的使用Python
- Python中模組的使用Python
- Python中各種括號的區別、用途及使用方法Python
- JavaScript 中的 CSS:基於元件的樣式的未來JavaScriptCSS元件
- 使用樣式類為某一型別的元素設定樣式型別
- AI朋克致敬MNIST:只用Python和開發板,製作永不重樣的時鐘AIPython
- NuoDB:告訴你未來的資料庫是什麼樣VU資料庫
- [Vue warn]: $attrs is readonly;Webpack externals 配置VueWeb
- 使用Python的Supervisor來管理程式Python