使用 attrs 來告別 Python 中的樣板

Moshe Zadka發表於2019-05-18

在我們覆蓋 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 來記錄期望的型別。但是你注意到你忘了新增 editionpublished_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

本文由 LCTT 原創編譯,Linux中國 榮譽推出

使用 attrs 來告別 Python 中的樣板

訂閱“Linux 中國”官方小程式來檢視

相關文章