了解更多关于这个和其他两个未被充分利用但仍然有用的 Python 特性。
创新互联建站-专业网站定制、快速模板网站建设、高性价比大理州网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式大理州网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖大理州地区。费用合理售后完善,10年实体公司更值得信赖。
这是关于 Python 3.x 首发特性系列文章的第八篇。Python 3.7 于 2018 年首次发布,尽管它已经发布了几年,但它引入的许多特性都未被充分利用,而且相当酷。下面是其中的三个。
在 Python 3.7 中,只要激活了正确的 __future__
标志,注解在运行时就不会被评估:
from __future__ import annotations
def another_brick(wall: List[Brick], brick: Brick) -> Education:
pass
another_brick.__annotations__
{'wall': 'List[Brick]', 'brick': 'Brick', 'return': 'Education'}
它使递归类型(指向自己的类)和其他有趣的事情成为了可能。然而,这意味着如果你想做自己的类型分析,你需要明确地使用 ast
。
import ast
raw_type = another_brick.__annotations__['wall']
[parsed_type] = ast.parse(raw_type).body
subscript = parsed_type.value
f"{subscript.value.id}[{subscript.slice.id}]"
'List[Brick]'
Python 中的序列切片长期以来一直接受各种 类 int 对象(具有 __index__()
的对象)作为有效的切片部分。然而,直到 Python 3.7,itertools.islice
,即核心 Python 中对无限生成器进行切片的唯一方法,才获得了这种支持。
例如,现在可以用 numpy.short
大小的整数来切片无限生成器:
import numpy
short_1 = numpy.short(1)
short_3 = numpy.short(3)
short_1, type(short_1)
(1, numpy.int16)
import itertools
list(itertools.islice(itertools.count(), short_1, short_3))
[1, 2]
如果你认为 singledispatch 已经很酷了,你错了。现在可以根据注解来注册了:
import attr
import math
from 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
@singledispatch
def get_area(shape):
raise NotImplementedError("cannot calculate area for unknown shape",
shape)
@get_area.register
def _get_area_square(shape: Square):
return shape.side ** 2
@get_area.register
def _get_area_circle(shape: Circle):
return math.pi * (shape.radius ** 2)
get_area(Circle(1)), get_area(Square(1))
(3.141592653589793, 1)
Python 3.7 大约是四年前发布的,但是在这个版本中首次出现的一些特性非常酷,而且没有得到充分利用。如果你还没使用,那么将它们添加到你的工具箱中。
网站栏目:用这个Python3.7的特性来切片无限生成器
转载来源:http://www.gawzjz.com/qtweb/news3/186003.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联