当前位置: 首页 > 科技观察

使用attrs告别Python中的样板

时间:2023-03-13 01:52:30 科技观察

在我们涵盖7个PyPI库的系列中了解有关解决Python问题的更多信息。Python是当今最流行的编程语言之一,因为:它是开源的,用途广泛(例如网络编程、商业应用程序、游戏、科学编程等),它由充满活力的并致力于社区吧。这个社区是我们在Python包索引(PyPI)中提供如此庞大、多样化的包集、扩展和改进Python的原因。并解决不可避免的问题。在本系列中,我们将介绍七个PyPI库,它们可以帮助您解决常见的Python问题。今天,我们将了解attrs,这是一个Python包,可帮助您快速编写干净、正确的代码。attrs如果你写过一段时间的Python,那么你可能习惯这样写代码:classBook(object):def__init__(self,isbn,name,author):self.isbn=isbnself.name=nameself.author=author然后写一个__repr__函数。否则,很难记录Book的实例:def__repr__(self):returnf"Book({self.isbn},{self.name},{self.author})"接下来你写一个很好的文档字符串来记录预期的类型.但是您注意到您忘记添加edition和published_year属性,因此您必须在五个地方修改它们。如果您不必这样做怎么办?@attr.s(auto_attribs=True)classBook(object):isbn:strname:strauthor:strpublished_year:intedition:int使用新的类型注释语法注释类型属性,attrs将检测注释并创建一个类。ISBN有特定的格式。如果我们想强制格式化怎么办?@attr.s(auto_attribs=True)classBook(object):isbn:str=attr.ib()@isbn.validatordefpattern_match(self,attribute,value):m=re.match(r"^(\d{3}-)\d{1,3}-\d{2,3}-\d{1,7}-\d$",value)如果不是m:raiseValueError("isbn格式不正确",value)name:strauthor:strpublished_year:intedition:intattrs该库对不可变编程也有很好的支持。将第一行更改为@attr.s(auto_attribs=True,frozen=True)意味着Book现在是不可变的:尝试修改属性将引发异常。反之,比如我们想把出版日期后移一年,我们可以修改为attr.evolve(old_book,published_year=old_book.published_year+1)得到一个新的实例。在本系列的下一篇文章中,我们将了解singledispatch,这是一个允许您向Python库添加方法的库。