Linux中國

用這個 Python 3.7 的特性來切片無限生成器

這是關於 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]'

itertools.islice 支持 index

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]

functools.singledispatch() 註解註冊

如果你認為 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)

歡迎來到 2017 年

Python 3.7 大約是四年前發布的,但是在這個版本中首次出現的一些特性非常酷,而且沒有得到充分利用。如果你還沒使用,那麼將它們添加到你的工具箱中。

via: https://opensource.com/article/21/5/python-37-features

作者:Moshe Zadka 選題:lujun9972 譯者:geekpi 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國