Python■你应该知道的Python3.6、3.7、3.8新特性( 四 )


       if not isinstance(other self.__class__):            return NotImplemented
       return (self._id self.author_id) < (other._id other.author_id)    def __repr__(self):
       return '{(id={ author_id={ title={)'.format(
               self.__class__.__name__ self._id self.author_id self.title)

大量的初始化属性要定义默认值 , 可能还需要重写一堆魔法方法 , 来实现类实例的打印、比较、排序和去重等功能 。
如果使用dataclasses进行改造 , 可以写成这个样子:
from dataclasses import dataclass fieldfrom typing import Listfrom datetime import datetimeimport dateutil@dataclass(order=True)   //注意这里class Article(object):
   _id: int
   author_id: int
   title: str = field(compare=False)
   text: str = field(repr=False compare=False)
   tags: List[str
= field(default=list() repr=False compare=False)
   created: datetime = field(default=datetime.now() repr=False compare=False)
   edited: datetime = field(default=datetime.now() repr=False compare=False)    def __post_init__(self):
      if type(self.created) is str:
          self.created = dateutil.parser.parse(self.created)       if type(self.edited) is str:
          self.edited = dateutil.parser.parse(self.edited)

这使得类不仅容易设置 , 而且当我们创建一个实例并打印出来时 , 它还可以自动生成优美的字符串 。 在与其他类实例进行比较时 , 它也会有适当的行为 。 这是因为dataclasses除了帮我们自动生成 __init__ 方法外 , 还生成了一些其他特殊方法 , 如 repr、eq 和 hash 等 。
Dataclasses 使用字段 field来完提供默认值 , 手动构造一个 field() 函数能够访问其他选项 , 从而更改默认值 。 例如 , 这里将 field 中的 default_factory 设置为一个 lambda 函数 , 该函数提示用户输入其名称 。
from dataclasses import dataclass fieldclass User:
   name: str = field(default_factory=lambda: input(\"enter name\"))

4、生成器异常处理在Python 3.7中 , 生成器引发StopIteration异常后 , StopIteration异常将被转换成RuntimeError异常 , 那样它不会悄悄一路影响应用程序的堆栈框架 。 这意味着如何处理生成器的行为方面不太敏锐的一些程序会在Python 3.7中抛出RuntimeError 。 在Python 3.6中 , 这种行为生成一个弃用警告;在Python 3.7中 , 它将生成一个完整的错误 。
一个简易的方法是使用try/except代码段 , 在StopIteration传播到生成器的外面捕获它 。 更好的解决方案是重新考虑如何构建生成器――比如说 , 使用return语句来终止生成器 , 而不是手动引发StopIteration 。
5、开发模式Python解释器添加了一个新的命令行开关:-X , 让开发人员可以为解释器设置许多低级选项 。
这种运行时的检查机制通常对性能有重大影响 , 但在调试过程中对开发人员很有用 。
-X 激活的选项包括: