Python 3.8正式发布,来尝鲜这些新特性吧

今天 Python3.8 发布啦,它是 Python2 终结前最后一个大版本,我们一起看看这个版本都添加了那些新功能和特性。

PEP 572: Assignment Expressions

PEP 572 的标题是赋值表达式,也叫做「命名表达式」,不过它现在被广泛的别名是「海象运算符」(The Walrus Operator)。因为:= 很像海象「眼睛小,长着两枚长长的牙」这个特点 ^_^。

具体内容可以看我之前写的文章: PEP572: 海象运算符,在这里给大家展示个通过用 PEP 572 改写的一行实现斐波那契数列的例子:

In : (lambda f: f(f, int(input('Input: ')), 1, 0, 1))(lambda f, t, i, a, b: print(f'fib({i}) = {b}') or t == i or f
 ...: (f, t, i + 1, b, a + b))
Input: 10
fib(1) = 1
fib(2) = 1
fib(3) = 2
fib(4) = 3
fib(5) = 5
fib(6) = 8
fib(7) = 13
fib(8) = 21
fib(9) = 34
fib(10) = 55
Out: True

基于 Raymond Hettinger 版本改写:

In : [(t:=(t[1], sum(t)) if i else (0,1))[1] for i in range(10)]
Out: [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
PEP 570: Python Positional-Only parameters

PEP 570 说白了就是 强制使用者用位置参数

具体的可以看我之前写的文章: PEP570 新语法:只接受位置参数

PEP 578: Python Runtime Audit Hooks

现在可以给 Python 运行时添加审计钩子:

In : import sys
...: import urllib.request
...:
...:
...: def audit_hook(event, args):
...: if event in ['urllib.Request']:
...: print(f'Network {event=} {args=}')
...:
...: sys.addaudithook(audit_hook)

In : urllib.request.urlopen('https://httpbin.org/get?a=1')
Network event='urllib.Request' args=('https://httpbin.org/get?a=1', None, {}, 'GET')
Out: <http.client.HTTPResponse at 0x10e394310>

目前支持审计的事件名字和 API 可以看 PEP 文档 (延伸阅读链接 2), urllib.Request 是其中之一。另外还可以自定义事件:

In : def audit_hook(event, args):
...: if event in ['make_request']:
...: print(f'Network {event=} {args=}')
...:

In : sys.addaudithook(audit_hook)

In : sys.audit('make_request', 'https://baidu.com')
Network event='make_request' args=('https://baidu.com',)

In : sys.audit('make_request', 'https://douban.com')
Network event='make_request' args=('https://douban.com',)
Multiprocessing shared memory

可以跨进程直接访问同一内存 (共享):

# IPython进程A
In : from multiprocessing import shared_memory

In : a = shared_memory.ShareableList([1, 'a', 0.1])

In : a
Out: ShareableList([1, 'a', 0.1], name='psm_d5d6ba1b') # 注意name
# IPython进程B(另外一个终端进入IPython)
In : from multiprocessing import shared_memory

In : b = shared_memory.ShareableList(name='psm_d5d6ba1b') # 使用name就可以共享内存

In : b
Out: ShareableList([1, 'a', 0.1], name='psm_d5d6ba1b')
New importlib.metadata module

使用新的 importlib.metadata 模块可以直接读取第三方包的元数据:

In : from importlib.metadata import version, files, requires, distribution

In : version('flask')
Out: '1.1.1'

In : requires('requests')
Out:
['chardet (<3.1.0,>=3.0.2)',
 'idna (<2.9,>=2.5)',
 'urllib3 (!=1.25.0,!=1.25.1,<1.26,>=1.21.1)',
 'certifi (>=2017.4.17)',
 "pyOpenSSL (>=0.14) ; extra == 'security'",
 "cryptography (>=1.3.4) ; extra == 'security'",
 "idna (>=2.0.0) ; extra == 'security'",
 "PySocks (!=1.5.7,>=1.5.6) ; extra == 'socks'",
 'win-inet-pton ; (sys_platform == "win32" and python_version == "2.7") and extra == \'socks\'']

In : dist = distribution('celery')

In : dist.version
Out: '4.3.0'

In : dist.metadata['Requires-Python']
Out: '>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*'

In : dist.metadata['License']

In : dist.entry_points
Out:
[EntryPoint(name='celery', value='celery.__main__:main', group='console_scripts'),
 EntryPoint(name='celery', value='celery.contrib.pytest', group='pytest11')]

In : files('celery')[8]
Out: PackagePath('celery/__init__.py')

In : dist.locate_file(files('celery')[8])
Out: PosixPath('/Users/dongweiming/test/venv/lib/python3.8/site-packages/celery/__init__.py')
functools.cached_property

缓存属性 (cached_property) 是一个非常常用的功能,很多知名 Python 项目都自己实现过它,现在终于进入版本库了。

具体的可以看我之前写的文章: functools.cached_property(Python 3.8)

functools.lru_cache 作为装饰器时可以不加参数

lru_cache 装饰器支持 max_size 和 typed 2 个参数,如果对默认参数不敏感,过去只能这么用 (需要空括号):

In : @lru_cache()
...: def add(a, b):
...: return a + b
...:

从 3.8 开始可以直接作为装饰器,而不是作为返回装饰器的函数 (不加括号):

In : @lru_cache
...: def add(a, b):
...: return a + b
...:

就像 dataclasses.dataclass ,绝大部分场景都是这么用:

@dataclass
class InventoryItem:
 ...

其实 dataclass 支持多个参数:

def dataclass(cls=None, /, *, init=True, repr=True, eq=True, order=False,
 unsafe_hash=False, frozen=False):

所以这种使用全部缺省值的装饰器工厂用法中,括号反而显得多余了。

Asyncio REPL

具体的可以看我之前写的文章: asyncio REPL(Python 3.8)

F-strings DEBUG

具体的可以看我之前写的文章: 使用 f-strings 调试 (Python3.8)

Async Mock

单元测试模块 unittest 添加了 mock 异步代码的类:

In : import asyncio

In : from unittest.mock import AsyncMock, MagicMock

In : mock = AsyncMock(return_value={'json': 123})
In : await mock()
Out: {'json': 123}

In : asyncio.run(mock())
Out: {'json': 123}

In : async def main(*args, **kwargs):
...: return await mock(*args, **kwargs)
...:

In : asyncio.run(main())
Out: {'json': 123}

In : mock = MagicMock() # AsyncMock也可以

In : mock.__aiter__.return_value = [1, 2, 3]

In : async def main():
...: return [i async for i in mock]
...:

In : asyncio.run(main())
Out: [1, 2, 3]
Generalized iterable unpacking in yield and return

具体的可以看我之前写的文章: Python3.8 对「可迭代解包」的改进

后记

全部更改详情请查阅 Changelog (延伸阅读链接 1),另外推荐阅读延伸阅读链接 3 和 4,都是非常好的补充

延伸阅读

https://docs.python.org/3.8/whatsnew/3.8.html

https://www.python.org/dev/peps/pep-0578/#id11

https://speakerdeck.com/matrixise/whats-new-in-python-3-dot-8

https://realpython.com/python38-new-features/

总结

以上所述是小编给大家介绍的Python 3.8正式发布,来尝鲜这些新特性吧,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • Python 3.8正式发布,来尝鲜这些新特性吧

    今天 Python3.8 发布啦,它是 Python2 终结前最后一个大版本,我们一起看看这个版本都添加了那些新功能和特性. PEP 572: Assignment Expressions PEP 572 的标题是赋值表达式,也叫做「命名表达式」,不过它现在被广泛的别名是「海象运算符」(The Walrus Operator).因为:= 很像海象「眼睛小,长着两枚长长的牙」这个特点 ^_^. 具体内容可以看我之前写的文章: PEP572: 海象运算符,在这里给大家展示个通过用 PEP 572 改

  • Java 11 正式发布,这 8 个逆天新特性教你写出更牛逼的代码

    美国时间 09 月 25 日,Oralce 正式发布了 Java 11,这是据 Java 8 以后支持的首个长期版本.非常值得大家的关注,可以通过下面的地址进行下载: https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html 为什么说是长期版本,看下面的官方发布的支持路线图表. 可以看出 Java 8 扩展支持到 2025 年,而 Java 11 扩展支持到 2026 年. 现在大部

  • Python 3.10 中 6 个兴奋的新特性

    新的 Python 版本推出了有趣的新功能. Python 是当今最流行的编程语言之一.它有广泛的领域和应用,从学习计算机科学的基础,到执行复杂或者直接的科学计算任务来创建游戏.它的高级应用甚至包含数据科学和量子计算. Python的流行有很多原因.其中最主要的原因是Python和其他语言相比,通用性强,简单易学.除此之外,Python的开发和维护者--Python软件基金会--一直致力于用新的方法改进Python. 一周之前(2021年10月4日),一个新的Python版本发布了,Python

  • Python 3.8正式发布重要新功能一览

    Python3.8有哪些你要关注的新内容?  Python3.8 都有哪些新功能,在文档手册中,大家可以有一个概览.这么多新内容,哪些是大家最先要关注一下的呢?下面,营长就带大家从深度和广度两方面,了解那些最大的变化,帮助大家快速上手 Python3.8. 新功能手册: https://docs.python.org/3.8/whatsnew/3.8.html 在本文中,你将了解到Python 3.8如何: 使用赋值表达式简化一些代码结构 在你自己的函数中强制执行仅位置参数 指定更精确的类型提示

  • Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性(推荐)

    译者前言:相信凡是用过 zip() 内置函数的人,都会赞同它很有用,但是,它的最大问题是可能会产生出非预期的结果.PEP-618 提出给它增加一个参数,可以有效地解决大家的痛点. 这是 Python 3.10 版本正式采纳的第一个 PEP,「Python猫」一直有跟进社区最新动态的习惯,所以翻译了出来给大家尝鲜,强烈推荐一读.(PS:严格来说,zip() 是一个内置类(built-in type),而不是一个内置函数(built-in function),但我们一般都称它为一个内置函数.) PE

  • Webpack5正式发布,有哪些新特性

    webpack作为最使用最广泛的前端打包工具,已经成为前端工程化基础设施的一部分.而Webpack上一个大版本更新已经是18年的时候了,两年时间过去了让我们看看Webpack5都带来了哪些新特性,对我们的应用又有哪些帮助. 概览 下面这张图是 Webpack 官方 Changelog 里面截图出来的,可以看到​主要有这些方面的提高: 通过持久化缓存提高性能 采用更好的持久化缓存算法和默认行为 通过优化 Tree Shaking 和代码生成来减小Bundle体积 提高 Web 平台的兼容性 清除之

  • python合并已经存在的sheet数据到新sheet的方法

    简单的合并,本例是横向合并,纵向合并可以自行调整. import xlrd import xlwt import shutil from xlutils.copy import copy import datetime # 打开要使用的excel,获取要需要写入的行数 bk = xlrd.open_workbook('A.xlsx') #打开A文件 nbk = copy(bk) newsh = nbk.add_sheet('totale') #新建total名字的sheet nsheet = b

  • Python+OpenCV+图片旋转并用原底色填充新四角的例子

    我就废话不多说了,直接上代码吧! import cv2 from math import fabs, sin, cos, radians import numpy as np from scipy.stats import mode def get_img_rot_broa(img, degree=45, filled_color=-1): """ Desciption: Get img rotated a certain degree, and use some color

  • Python合并2个字典成1个新字典的方法(9种)

    字典是Python语言中唯一的映射类型. 映射类型对象里哈希值(键,key)和指向的对象(值,value)是一对多的的关系,通常被认为是可变的哈希表. 字典对象是可变的,它是一个容器类型,能存储任意个数的Python对象,其中也可包括其他容器类型. 字典类型与序列类型的区别: 1. 存取和访问数据的方式不同. 2. 序列类型只用数字类型的键(从序列的开始按数值顺序索引): 3. 映射类型可以用其他对象类型作键(如:数字.字符串.元祖,一般用字符串作键),和序列类型的键不同,映射类型的键直4.接或

  • .NET Core 2.2新增的部分功能使用尝鲜指南

    前言 美国当地时间12月4日,微软2019开发者大会中发布了一系列的重磅消息,包含了软硬件和开源社区的各种好消息是铺天盖地,作为一名普通的开发者,我第一时间下载了 .NET Core 2.2 的源码,针对发布说明逐条浏览,并截取了部分常用的功能进行尝试,下面就与大家分享.话不多说了,来一起看看详细的介绍吧 1. 对 API 接口统一大小写的支持 1.1 查看以下接口代码 [HttpGet] public ActionResult<UserInfo> Get() { return new Use

随机推荐