From c327fbde159ae0069f2fe8cf1447abc5f18ad903 Mon Sep 17 00:00:00 2001 From: geekpi Date: Mon, 13 May 2019 08:56:54 +0800 Subject: [PATCH] translated --- ...bye to boilerplate in Python with attrs.md | 107 ------------------ ...bye to boilerplate in Python with attrs.md | 106 +++++++++++++++++ 2 files changed, 106 insertions(+), 107 deletions(-) delete mode 100644 sources/tech/20190503 Say goodbye to boilerplate in Python with attrs.md create mode 100644 translated/tech/20190503 Say goodbye to boilerplate in Python with attrs.md diff --git a/sources/tech/20190503 Say goodbye to boilerplate in Python with attrs.md b/sources/tech/20190503 Say goodbye to boilerplate in Python with attrs.md deleted file mode 100644 index 85d1f2345c..0000000000 --- a/sources/tech/20190503 Say goodbye to boilerplate in Python with attrs.md +++ /dev/null @@ -1,107 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: (geekpi) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Say goodbye to boilerplate in Python with attrs) -[#]: via: (https://opensource.com/article/19/5/python-attrs) -[#]: author: (Moshe Zadka https://opensource.com/users/moshez/users/moshez) - -Say goodbye to boilerplate in Python with attrs -====== -Learn more about solving common Python problems in our series covering -seven PyPI libraries. -![Programming at a browser, orange hands][1] - -Python is one of the most [popular programming languages][2] in use today—and for good reasons: it's open source, it has a wide range of uses (such as web programming, business applications, games, scientific programming, and much more), and it has a vibrant and dedicated community supporting it. This community is the reason we have such a large, diverse range of software packages available in the [Python Package Index][3] (PyPI) to extend and improve Python and solve the inevitable glitches that crop up. - -In this series, we'll look at seven PyPI libraries that can help you solve common Python problems. Today, we'll examine [**attrs**][4], a Python package that helps you write concise, correct code quickly. - -### attrs - -If you have been using Python for any length of time, you are probably used to writing code like: - - -``` -class Book(object): - -def __init__(self, isbn, name, author): -self.isbn = isbn -self.name = name -self.author = author -``` - -Then you write a **__repr__** function; otherwise, it would be hard to log instances of **Book** : - - -``` -def __repr__(self): -return f"Book({self.isbn}, {self.name}, {self.author})" -``` - -Next, you write a nice docstring documenting the expected types. But you notice you forgot to add the **edition** and **published_year** attributes, so you have to modify them in five places. - -What if you didn't have to? - - -``` -@attr.s(auto_attribs=True) -class Book(object): -isbn: str -name: str -author: str -published_year: int -edition: int -``` - -Annotating the attributes with types using the new type annotation syntax, **attrs** detects the annotations and creates a class. - -ISBNs have a specific format. What if we want to enforce that format? - - -``` -@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 -``` - -The **attrs** library also has great support for [immutability-style programming][5]. Changing the first line to **@attr.s(auto_attribs=True, frozen=True)** means that **Book** is now immutable: trying to modify an attribute will raise an exception. Instead, we can get a _new_ instance with modification using **attr.evolve(old_book, published_year=old_book.published_year+1)** , for example, if we need to push publication forward by a year. - -In the next article in this series, we'll look at **singledispatch** , a library that allows you to add methods to Python libraries retroactively. - -#### Review the previous articles in this series - - * [Cython][6] - * [Black][7] - - - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/5/python-attrs - -作者:[Moshe Zadka ][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/moshez/users/moshez -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/programming_code_keyboard_orange_hands.png?itok=G6tJ_64Y (Programming at a browser, orange hands) -[2]: https://opensource.com/article/18/5/numbers-python-community-trends -[3]: https://pypi.org/ -[4]: https://pypi.org/project/attrs/ -[5]: https://opensource.com/article/18/10/functional-programming-python-immutable-data-structures -[6]: https://opensource.com/article/19/4/7-python-problems-solved-cython -[7]: https://opensource.com/article/19/4/python-problems-solved-black diff --git a/translated/tech/20190503 Say goodbye to boilerplate in Python with attrs.md b/translated/tech/20190503 Say goodbye to boilerplate in Python with attrs.md new file mode 100644 index 0000000000..e80b5b03e1 --- /dev/null +++ b/translated/tech/20190503 Say goodbye to boilerplate in Python with attrs.md @@ -0,0 +1,106 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Say goodbye to boilerplate in Python with attrs) +[#]: via: (https://opensource.com/article/19/5/python-attrs) +[#]: author: (Moshe Zadka https://opensource.com/users/moshez/users/moshez) + +使用 attrs 来告别 Python 中的样板 +====== +在我们覆盖 7 个 PyPI 库的系列文章中了解更多解决 Python 问题的信息。 +![Programming at a browser, orange hands][1] + +Python是当今使用最多[流行的编程语言] [2]之一 - 并且有充分的理由:它是开源的,它具有广泛的用途(例如Web编程,业务应用程序,游戏,科学编程等等)更多),它有一个充满活力和专注的社区支持它。这个社区是我们在[Python Package Index] [3](PyPI)中提供如此庞大,多样化的软件包的原因,以扩展和改进Python并解决不可避免的问题。 + +在本系列中,我们将介绍七个可以帮助你解决常见 Python 问题的 PyPI 库。今天,我们将研究 [**attrs**][4],这是一个帮助你快速编写简洁,正确的代码的 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** 库也对[不可变风格编程][5]支持良好。将第一行改成 **@attr.s(auto_attribs=True, frozen=True)** 意味着 **Book** 现在是不可变的:尝试修改一个属性将会引发一个异常。相反,比如,如果希望将发布日期向后一年,我们可以修改成 **attr.evolve(old_book, published_year=old_book.published_year+1)** 来得到一个_新的_实例。 + +本系列的下一篇文章我们将来看下 **singledispatch**,一个能让你向 Python 库添加方法的库。 + +#### 查看本系列先前的文章 + + * [Cython][6] + * [Black][7] + + + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/19/5/python-attrs + +作者:[Moshe Zadka ][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/moshez/users/moshez +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/programming_code_keyboard_orange_hands.png?itok=G6tJ_64Y (Programming at a browser, orange hands) +[2]: https://opensource.com/article/18/5/numbers-python-community-trends +[3]: https://pypi.org/ +[4]: https://pypi.org/project/attrs/ +[5]: https://opensource.com/article/18/10/functional-programming-python-immutable-data-structures +[6]: https://opensource.com/article/19/4/7-python-problems-solved-cython +[7]: https://opensource.com/article/19/4/python-problems-solved-black