当前位置: 首页 > 科技观察

使用此Python3.7功能对无限生成器进行切片

时间:2023-03-21 14:38:23 科技观察

了解有关此功能和其他两个未充分使用但仍然有用的Python功能的更多信息。这是关于Python3.x的第一个特性的系列文章中的第八篇。Python3.7于2018年首次发布,尽管已经发布了几年,但它引入的许多功能并未得到充分利用,而且非常酷。以下是其中的三个。注释延迟评估在Python3.7中,只要激活了正确的__future__标志,就不会在运行时评估注释:from__future__importannotationsdefanother_brick(wall:List[Brick],brick:Brick)->Education:passanother_brick.__annotations__{'wall':'List[Brick]','brick':'Brick','return':'Education'}这使得递归类型(指向它自己的类)和其他有趣的事情成为可能。然而,这意味着如果你想做你自己的类型分析,你需要显式地使用AST。importastraw_type=another_brick.__annotations__['wall'][parsed_type]=ast.parse(raw_type).bodysubscript=parsed_type.valuef"{subscript.value.id}[{subscript.slice.id}]"'List[Brick]'itertools.islice支持索引Python中的序列切片长期以来一直接受各种类似int的对象(具有__index__()的对象)作为有效的切片部分。然而,直到Python3.7itertools.islice,核心Python中切片无限生成器的唯一方法,才得到了这种支持。例如,现在可以使用numpy.short大小的整数对无限生成器进行切片:importnumpyshort_1=numpy.short(1)short_3=numpy.short(3)short_1,type(short_1)(1,numpy.int16)importitertoolslist(itertools.islice(itertools.count(),short_1,short_3))[1,2]functools.singledispatch()注解注册如果你认为singledispatch已经很酷了,那你就错了。现在可以根据注解进行注册:importattrimportmathfromfunctoolsimportsingledispatch@attr.s(auto_attribs=True,frozen=True)classCircle:radius:float@attr.s(auto_attribs=True,frozen=True)classSquare:side:float@singledispatchdefget_area(shape):raiseNotImplementedError("cannotcalculateareaforunknownshape",shape)@get_area.registerdef_get_area_square(shape:Square):返回shape.side**2@get_area.registerdef_get_area_circle():returnmath.pi*(shape.radius**2)get_area(Circle(1)),get_area(Square(1))(3.141592653589793,1)欢迎来到2017年Python3.7大约四年前发布,但是一些特性在此版本中首次亮相的非常酷且未得到充分利用。如果您还没有将它们添加到您的工具箱中。