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


Posted in Python onOctober 15, 2019

今天 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正式发布,来尝鲜这些新特性吧,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python实现指定字符串补全空格的方法
Apr 30 Python
python抓取最新博客内容并生成Rss
May 17 Python
Python搭建FTP服务器的方法示例
Jan 19 Python
python入门前的第一课 python怎样入门
Mar 06 Python
Python并行分布式框架Celery详解
Oct 15 Python
Python如何处理大数据?3个技巧效率提升攻略(推荐)
Apr 15 Python
Python 安装第三方库 pip install 安装慢安装不上的解决办法
Jun 18 Python
python 多进程共享全局变量之Manager()详解
Aug 15 Python
Python pandas实现excel工作表合并功能详解
Aug 29 Python
什么是Python包的循环导入
Sep 08 Python
Python 解决空列表.append() 输出为None的问题
May 23 Python
8g内存用python读取10文件_面试题-python 如何读取一个大于 10G 的txt文件?
May 28 Python
Python3安装pip工具的详细步骤
Oct 14 #Python
python区分不同数据类型的方法
Oct 14 #Python
django中瀑布流写法实例代码
Oct 14 #Python
python 中Arduino串口传输数据到电脑并保存至excel表格
Oct 14 #Python
python实现文件批量编码转换及注意事项
Oct 14 #Python
python 正则表达式贪婪模式与非贪婪模式原理、用法实例分析
Oct 14 #Python
Python协程操作之gevent(yield阻塞,greenlet),协程实现多任务(有规律的交替协作执行)用法详解
Oct 14 #Python
You might like
动漫女神老婆无限好,但日本女生可能就不是这么一回事了!
2020/03/04 日漫
DedeCms模板安装/制作概述
2007/03/11 PHP
php设计模式 Command(命令模式)
2011/06/26 PHP
php读取二进制流(C语言结构体struct数据文件)的深入解析
2013/06/13 PHP
用Div仿showModalDialog模式菜单的效果的代码
2007/03/05 Javascript
jQuery插件ajaxFileUpload实现异步上传文件效果
2015/04/14 Javascript
javascript创建cookie、读取cookie
2016/03/31 Javascript
jQuery获取与设置iframe高度的方法
2016/08/01 Javascript
jQuery实现鼠标经过像翻页和描点链接效果
2016/08/08 Javascript
细数JavaScript 一个等号,两个等号,三个等号的区别
2016/10/09 Javascript
KnockoutJS 3.X API 第四章之表单submit、enable、disable绑定
2016/10/10 Javascript
微信小程序选择图片和放大预览图片功能
2017/11/02 Javascript
Javascript 编码约定(编码规范)
2018/03/11 Javascript
vue 组件开发原理与实现方法详解
2019/11/29 Javascript
JavaScript ECMA-262-3 深入解析(二):变量对象实例详解
2020/04/25 Javascript
如何在vue 中引入使用jquery
2020/11/10 jQuery
Python排序搜索基本算法之选择排序实例分析
2017/12/09 Python
Python Pexpect库的简单使用方法
2019/01/29 Python
对Django中内置的User模型实例详解
2019/08/16 Python
Python使用微信itchat接口实现查看自己微信的信息功能详解
2019/08/22 Python
python设置代理和添加镜像源的方法
2020/02/14 Python
pycharm下pyqt4安装及环境配置的教程
2020/04/24 Python
如何在Windows中安装多个python解释器
2020/06/16 Python
澳大利亚最好的电动自行车:Leon Cycle
2020/12/19 全球购物
艺术系大学生毕业个人自我评价
2013/09/19 职场文书
工程质量承诺书范文
2014/03/27 职场文书
《英英学古诗》教学反思
2014/04/11 职场文书
平安工地汇报材料
2014/08/19 职场文书
2014国庆65周年领导讲话稿(3篇)
2014/09/21 职场文书
2014年卫生保健工作总结
2014/12/08 职场文书
2014年体检中心工作总结
2014/12/23 职场文书
幼儿园小班工作总结2015
2015/04/25 职场文书
CocosCreator ScrollView优化系列之分帧加载
2021/04/14 Python
Python列表删除重复元素与图像相似度判断及删除实例代码
2021/05/07 Python
详解MySQL中的pid与socket
2021/06/15 MySQL
Win11显卡控制面板打开显卡设置方法
2022/04/20 数码科技