使用 attrs 来告别 Python 中的样板
创始人
2024-03-02 02:32:25
0

在我们覆盖 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中国 荣誉推出

相关内容

python基础语法【迭代...
1.迭代器 1.什么是迭代器(iter)...
2025-06-01 20:30:55
手把手教你使用Flask框...
目录前言0、Flask框架的详细介绍一、Flask 框架封装接口1...
2025-06-01 17:11:00
【练习题】python函数...
写一个匿名函数,判断指定的年是否是闰年 (先直接用普...
2025-06-01 15:13:03
4年功能测试,我一进阶py...
目录:导读前言一、Python编程入门到精通二、接口...
2025-06-01 13:34:04
Python嵌套函数(Ne...
Python嵌套函数(Nested function...
2025-06-01 12:52:54
python 基础系列篇:...
python 基础系列篇:三、认识函数、方法...
2025-06-01 09:29:50

热门资讯

Helix:高级 Linux ... 说到 基于终端的文本编辑器,通常 Vim、Emacs 和 Nano 受到了关注。这并不意味着没有其他...
使用 KRAWL 扫描 Kub... 用 KRAWL 脚本来识别 Kubernetes Pod 和容器中的错误。当你使用 Kubernet...
JStock:Linux 上不... 如果你在股票市场做投资,那么你可能非常清楚投资组合管理计划有多重要。管理投资组合的目标是依据你能承受...
Epic 游戏商店现在可在 S... 现在可以在 Steam Deck 上运行 Epic 游戏商店了,几乎无懈可击! 但是,它是非官方的。...
《Apex 英雄》正式可在 S... 《Apex 英雄》现已通过 Steam Deck 验证,这使其成为支持 Linux 的顶级多人游戏之...
从 Yum 更新中排除特定/某... 作为系统更新的一部分,你也许需要在基于 Red Hat 系统中由于应用依赖排除一些软件包。如果是,如...
通过 SaltStack 管理... 我在搜索Puppet的替代品时,偶然间碰到了Salt。我喜欢puppet,但是我又爱上Salt了:)...
如何在 Github 上创建一... 学习如何复刻一个仓库,进行更改,并要求维护人员审查并合并它。你知道如何使用 git 了,你有一个 G...
Opera 浏览器内置的 VP... 昨天我们报道过 Opera 浏览器内置了 VPN 服务,用户打开它可以防止他们的在线活动被窥视。不过...
如何检查你的 Linux 系统... 不知道在使用哪个初始化系统?以下是方法。每个主流 Linux 发行版(包括 Ubuntu、Fedor...