使用attrs来告别Python中的样板

开发 后端
在本系列中,我们将介绍七个可以帮助你解决常见 Python 问题的 PyPI 库。今天,我们将研究 attrs,这是一个帮助你快速编写简洁、正确的代码的 Python 包。

[[265757]]

在我们覆盖 7 个 PyPI 库的系列文章中了解更多解决 Python 问题的信息。

Python是当今使用最多流行的编程语言之一,因为:它是开源的,它具有广泛的用途(例如 Web 编程、业务应用、游戏、科学编程等等),它有一个充满活力和专注的社区支持它。这个社区是我们在 Python Package Index(PyPI)中提供如此庞大、多样化的软件包的原因,用以扩展和改进 Python。并解决不可避免的问题。

在本系列中,我们将介绍七个可以帮助你解决常见 Python 问题的 PyPI 库。今天,我们将研究 attrs,这是一个帮助你快速编写简洁、正确的代码的 Python 包。

attrs

如果你已经写过一段时间的 Python,那么你可能习惯这样写代码:

  1. class Book(object):
  2.  
  3. def __init__(self, isbn, name, author):
  4. self.isbn = isbn
  5. self.name = name
  6. self.author = author

接着写一个 __repr__ 函数。否则,很难记录 Book 的实例:

  1. def __repr__(self):
  2. return f"Book({self.isbn}, {self.name}, {self.author})"

接下来你会写一个好看的 docstring 来记录期望的类型。但是你注意到你忘了添加 editionpublished_year 属性,所以你必须在五个地方修改它们。

如果你不必这么做如何?

  1. @attr.s(auto_attribs=True)
  2. class Book(object):
  3. isbn: str
  4. name: str
  5. author: str
  6. published_year: int
  7. edition: int

使用新的类型注释语法注释类型属性,attrs 会检测注释并创建一个类。

ISBN 有特定格式。如果我们想强行使用该格式怎么办?

  1. @attr.s(auto_attribs=True)
  2. class Book(object):
  3. isbn: str = attr.ib()
  4. @isbn.validator
  5. def pattern_match(self, attribute, value):
  6. m = re.match(r"^(\d{3}-)\d{1,3}-\d{2,3}-\d{1,7}-\d$", value)
  7. if not m:
  8. raise ValueError("incorrect format for isbn", value)
  9. name: str
  10. author: str
  11. published_year: int
  12. edition: int

attrs 库也对不可变式编程支持良好。将***行改成 @attr.s(auto_attribs=True, frozen=True) 意味着 Book 现在是不可变的:尝试修改一个属性将会引发一个异常。相反,比如,如果希望将发布日期向后一年,我们可以修改成 attr.evolve(old_book, published_year=old_book.published_year+1) 来得到一个新的实例。

本系列的下一篇文章我们将来看下 singledispatch,一个能让你向 Python 库添加方法的库。

责任编辑:庞桂玉 来源: Linux中国
相关推荐

2022-09-20 12:21:25

Vue2Vue3$attrs

2023-07-07 07:43:37

AutoMapper映射库

2024-11-15 13:15:36

2021-04-09 06:15:54

开源工具Python编程语言

2020-06-29 15:40:53

PlotlyPython数据可视化

2024-06-28 10:29:18

异常处理Python

2024-12-06 10:12:20

2017-12-19 15:24:21

DjangoPythonOracle

2021-07-02 12:28:37

Python编程语言

2017-07-19 16:02:27

Python数据科学数据分析

2022-06-28 13:41:07

浏览网页互联网交互Python

2018-05-21 14:44:33

LinuxshellPython

2017-08-02 07:36:06

大数据PythonOpenCV

2020-10-05 21:38:35

pythonprettyprintpprint

2020-12-03 07:43:03

JS Ajax JavaScript

2021-06-10 11:05:04

Java编程代码

2020-02-21 08:00:00

Pythonasyncio编程语言

2012-08-01 14:23:35

IBMdW

2019-04-16 13:22:22

物联网农业IOT

2021-03-14 13:00:36

FedoraPoetry Python
点赞
收藏

51CTO技术栈公众号