打开网易新闻 查看精彩图片

导读:了解更多关于这个和其他两个未被充分利用但仍然有用的 Python 特性。

本文字数:2294,阅读时长大约: 2分钟

https://linux.cn/article-13459-1.html
作者:Moshe Zadka
译者:geekpi

这是关于 Python 3.x 首发特性系列文章的第八篇。 于 2018 年首次发布,尽管它已经发布了几年,但它引入的许多特性都未被充分利用,而且相当酷。下面是其中的三个。

注解推迟评估

在 Python 3.7 中,只要激活了正确的 __future__ 标志,注解在运行时就不会被评估:

  1. from __future__ import annotations

  2. def another_brick(wall: List[Brick], brick: Brick) -> Education:

  3. pass

  1. another_brick.__annotations__

  1. {'wall': 'List[Brick]', 'brick': 'Brick', 'return': 'Education'}

它使递归类型(指向自己的类)和其他有趣的事情成为了可能。然而,这意味着如果你想做自己的类型分析,你需要明确地使用 ast

  1. import ast

  2. raw_type = another_brick.__annotations__['wall']

  3. [parsed_type] = ast.parse(raw_type).body

  1. subscript = parsed_type.value

  2. f"{subscript.value.id}[{subscript.slice.id}]"

  1. 'List[Brick]'

itertools.islice 支持 index

Python 中的序列切片长期以来一直接受各种 类 int 对象(具有 __index__() 的对象)作为有效的切片部分。然而,直到 Python 3.7,itertools.islice,即核心 Python 中对无限生成器进行切片的唯一方法,才获得了这种支持。

例如,现在可以用 numpy.short 大小的整数来切片无限生成器:

  1. import numpy

  2. short_1 = numpy.short(1)

  3. short_3 = numpy.short(3)

  4. short_1, type(short_1)

  1. (1, numpy.int16)

  1. import itertools

  2. list(itertools.islice(itertools.count(), short_1, short_3))

  1. [1, 2]

functools.singledispatch() 注解注册

如果你认为 已经很酷了,你错了。现在可以根据注解来注册了:

  1. import attr

  2. import math

  3. from functools import singledispatch

  4. @attr.s(auto_attribs=True, frozen=True)

  5. class Circle:

  6. radius: float

  7. @attr.s(auto_attribs=True, frozen=True)

  8. class Square:

  9. side: float

  10. @singledispatch

  11. def get_area(shape):

  12. raise NotImplementedError("cannot calculate area for unknown shape",

  13. shape)

  14. @get_area.register

  15. def _get_area_square(shape: Square):

  16. return shape.side ** 2

  17. @get_area.register

  18. def _get_area_circle(shape: Circle):

  19. return math.pi * (shape.radius ** 2)

  20. get_area(Circle(1)), get_area(Square(1))

  1. (3.141592653589793, 1)

欢迎来到 2017 年

Python 3.7 大约是四年前发布的,但是在这个版本中首次出现的一些特性非常酷,而且没有得到充分利用。如果你还没使用,那么将它们添加到你的工具箱中。

via:

作者: 选题: 译者: 校对:

本文由 原创编译, 荣誉推出

欢迎遵照 CC-BY-NC-SA 协议规定转载,

如需转载,请在文章下留言 “ 转载:公众号名称”,

我们将为您添加白名单,授权“ 转载文章时可以修改”。