您现在的位置是:亿华云 > 人工智能
用这个 Python 3.7 的特性来切片无限生成器
亿华云2025-10-08 23:35:54【人工智能】1人已围观
简介了解更多关于这个和其他两个未被充分利用但仍然有用的 Python 特性。这是关于 Python 3.x 首发特性系列文章的第八篇。Python 3.7于 2018 年首次发布,尽管它已经发布了几年,但
了解更多关于这个和其他两个未被充分利用但仍然有用的性切限生 Python 特性。
这是片无关于 Python 3.x 首发特性系列文章的第八篇。Python 3.7 于 2018 年首次发布,成器尽管它已经发布了几年,性切限生但它引入的片无许多特性都未被充分利用,而且相当酷。成器下面是性切限生其中的三个。
注解推迟评估
在 Python 3.7 中,片无只要激活了正确的成器 __future__ 标志,注解在运行时就不会被评估:
from __future__ import annotationsdef another_brick(wall: List[Brick],性切限生 brick: Brick) -> Education: pass another_brick.__annotations__ { wall: List[Brick], brick: Brick, return: Education}它使递归类型(指向自己的站群服务器类)和其他有趣的事情成为了可能。然而,片无这意味着如果你想做自己的成器类型分析,你需要明确地使用 ast。性切限生
import astraw_type = another_brick.__annotations__[wall][parsed_type] = ast.parse(raw_type).body subscript = parsed_type.valuef"{ subscript.value.id}[{ subscript.slice.id}]" List[Brick]itertools.islice 支持 index
Python 中的片无序列切片长期以来一直接受各种 类 int 对象(具有 __index__() 的对象)作为有效的切片部分。然而,成器直到 Python 3.7,itertools.islice,即核心 Python 中对无限生成器进行切片的唯一方法,才获得了这种支持。源码下载
例如,现在可以用 numpy.short 大小的整数来切片无限生成器:
import numpyshort_1 = numpy.short(1)short_3 = numpy.short(3)short_1, type(short_1) (1, numpy.int16) import itertoolslist(itertools.islice(itertools.count(), short_1, short_3)) [1, 2]functools.singledispatch() 注解注册
如果你认为 singledispatch 已经很酷了,你错了。现在可以根据注解来注册了:
import attrimport mathfrom functools import singledispatch@attr.s(auto_attribs=True, frozen=True)class Circle: radius: float@attr.s(auto_attribs=True, frozen=True)class Square: side: float@singledispatchdef get_area(shape): raise NotImplementedError("cannot calculate area for unknown shape", shape)@get_area.registerdef _get_area_square(shape: Square): return shape.side ** 2@get_area.registerdef _get_area_circle(shape: Circle): return math.pi * (shape.radius ** 2)get_area(Circle(1)), get_area(Square(1)) (3.141592653589793, 1)欢迎来到 2017 年
Python 3.7 大约是四年前发布的,但是在这个版本中首次出现的一些特性非常酷,而且没有得到充分利用。如果你还没使用,那么将它们添加到你的工具箱中。
很赞哦!(59)