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的urllib模块显示下载进度示例
Jan 17 Python
python中的__slots__使用示例
Feb 26 Python
python利用matplotlib库绘制饼图的方法示例
Dec 18 Python
Python3.6笔记之将程序运行结果输出到文件的方法
Apr 22 Python
基于Python List的赋值方法
Jun 23 Python
Django框架多表查询实例分析
Jul 04 Python
python获取中文字符串长度的方法
Nov 14 Python
Python中Unittest框架的具体使用
Aug 27 Python
python序列化与数据持久化实例详解
Dec 20 Python
Python中的全局变量如何理解
Jun 04 Python
Python DataFrame使用drop_duplicates()函数去重(保留重复值,取重复值)
Jul 20 Python
Python 实现PS滤镜中的径向模糊特效
Dec 03 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
PHP图片处理之使用imagecopy函数添加图片水印实例
2014/11/19 PHP
php+xml实现在线英文词典之添加词条的方法
2015/01/23 PHP
Linux+Nginx+MySQL下配置论坛程序Discuz的基本教程
2015/12/23 PHP
PHP保存session到memcache服务器的方法
2016/01/19 PHP
ThinkPHP框架实现的MySQL数据库备份功能示例
2018/05/24 PHP
浅析PHP7的多进程及实例源码
2019/04/14 PHP
改版了网上的一个js操作userdata
2007/04/27 Javascript
教你在heroku云平台上部署Node.js应用
2014/07/30 Javascript
jQuery+Ajax实现无刷新分页
2015/10/30 Javascript
JS控制div跳转到指定的位置的几种解决方案总结
2016/11/05 Javascript
基于jQuery实现滚动刷新效果
2017/01/09 Javascript
基于vue.js实现侧边菜单栏
2017/03/20 Javascript
解决修复npm安装全局模块权限的问题
2018/05/17 Javascript
Vue递归实现树形菜单方法实例
2018/11/06 Javascript
JS判断两个数组或对象是否相同的方法示例
2019/02/28 Javascript
js神秘的电报密码 哈弗曼编码实现
2019/09/10 Javascript
element-ui table行点击获取行索引(index)并利用索引更换行顺序
2020/02/27 Javascript
Pycharm编辑器技巧之自动导入模块详解
2017/07/18 Python
使用python批量读取word文档并整理关键信息到excel表格的实例
2018/11/07 Python
使用sklearn对多分类的每个类别进行指标评价操作
2020/06/11 Python
Django-imagekit的使用详解
2020/07/06 Python
HTML5各种头部meta标签的功能(推荐)
2017/03/13 HTML / CSS
全球知名旅游社区法国站点:TripAdvisor法国
2016/08/03 全球购物
英国最大的运动营养公司之一:LA Muscle
2018/07/02 全球购物
迷你分体式空调:SoGoodToBuy
2018/08/07 全球购物
戴森英国官网:Dyson英国
2019/05/07 全球购物
联想英国官网:Lenovo英国
2019/07/17 全球购物
伊莱克斯阿根廷网上商店:Tienda Electrolux
2021/03/08 全球购物
高中毕业的自我鉴定
2013/12/09 职场文书
主持人演讲稿
2014/05/13 职场文书
计算机网络专业自荐书
2014/06/09 职场文书
临床医学专业求职信
2014/08/08 职场文书
人力资源部岗位职责
2015/02/11 职场文书
公司中层管理培训心得体会
2016/01/11 职场文书
python常见的占位符总结及用法
2021/07/02 Python
JavaScript 事件捕获冒泡与捕获详情
2021/11/11 Javascript