2018年 06月 28日 上午

  731 字     3 分钟       

美国时间6月27日晚8点,Python 3.7.0 经过多轮测试,终于发布了正式版,增强了多处特性功能,同时 3.6 也更新到 3.6.6 稳定版本。

主要特性

  • PEP 539,新增 CPython 中用于线程本地存储的 C-API
  • PEP 545,Python 官方文档翻译版本,新增日文、法文、韩文
  • PEP 552,优化 pyc 文件
  • PEP 553,新增内置函数 breakpoint() ,该函数在调用时自动进入调试器
  • PEP 557,新增内置模块dataclasses,可大幅简化类实例属性的初始化定义
  • PEP 560,新增支持类型模块和泛型
  • PEP 562,支持在模块定义 getattr 和__dir__
  • PEP 563,推迟对注释语句的分析从而优化 Python 的类型提示
  • PEP 564,time 内置函数支持纳秒
  • PEP 565,重新在 main 中默认显示 DeprecationWarning
  • PEP 567,新增 contextvars模块,可实现上下文变量解决变量线程安全
  • 避免使用 ASCII 作为默认文本编码,强制 UTF-8 编码运行
  • 字典对象的 keys 按插入顺序排列,现在是官方语言规范
  • 多方面的显著性能优化

dataclasses模块 示例

这个特性可能是 3.7.0 以后比较常用的了,是从其他语言借鉴过来的,这里简单演示下用法。

假如我们要封装一个类对象,在之前我们的代码可能要这么写:

class Article(object):
    def __init__(self, _id, author_id, title, text, tags=None, 
                 created=datetime.now(), edited=datetime.now()):
    self._id = _id
    self.author_id = author_id
    self.title = title
    self.text = text
    self.tags = list() if tags is None else tags
    self.created = created
    self.edited = edited

    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)

    def __eq__(self, other):
        if not isinstance(other, self.__class__):
            return NotImplemented
        return (self._id, self.author_id) == (other._id, other.author_id)

    def __lt__(self, other):
        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进行改造,可以写成这个样子:

@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)

可见这种语法使代码更加简练清晰,也更符合面向对象思想的语法方式,用过 SQLAlchemy 的同学肯定觉得很像 ORM 写法。

上述示例只是最基础的展示,更丰富的用法可以查看PEP 557文档。

3.7 版本下载地址:
https://www.python.org/downloads/

更多特性:
https://docs.python.org/3.7/whatsnew/3.7.html



Python

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!

 目录

关注公众号: 面向人生编程

回复【资料】获取精选学习资料