社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python 3.8刚刚发布!一分钟了解新版本的强大功能!

马哥Linux运维 • 4 年前 • 949 次点击  

新功能解读来源于公众号“Python之美”,ID:python_cn,作者董伟明。

今天Python3.8发布啦,新版本添加了很多全新功能,也表明Python的版本之路前进了一大步,小编整理了新版本的几个主要更新,为大家做详细解读!

顺便一提,导致Python之父龟叔愤然离职的赋值表达式功能还是上线了~

新增赋值表达式

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

在这里给大家展示个通过用PEP 572改写的一行实现斐波那契数列的例子:

  1. 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

  2. ...: (f, t, i + 1, b, a + b))

  3. Input: 10

  4. fib(1) = 1

  5. fib(2 ) = 1

  6. fib(3) = 2

  7. fib(4) = 3

  8. fib(5) = 5

  9. fib(6) = 8

  10. fib(7) = 13

  11. fib(8) = 21

  12. fib(9) = 34

  13. fib(10) = 55

  14. Out: True

基于Raymond Hettinger版本改写:

  1. In : [(t:=(t[1 ], sum(t)) if i else (0,1))[1] for i in range(10)]

  2. Out: [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

强制使用位置参数

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

温馨提示:Python3.8版本下,见到以下报错:

  1. TypeError: divmod() takes no keyword arguments


就是这个原因啦!

运行时添加审计hooks

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

  1. In : import sys

  2. ...: import urllib.request

  3. ...:

  4. ...:

  5. ...: def audit_hook(event, args):

  6. ...: if event in ['urllib.Request']:

  7. ...: print(f'Network {event=} {args=}')

  8. ...:

  9. ...: sys.addaudithook(audit_hook)


  10. In : urllib.request.urlopen('https://httpbin.org/get?a=1' )

  11. Network event='urllib.Request' args=('https://httpbin.org/get?a=1', None, {}, 'GET')

  12. Out: <http.client.HTTPResponse at 0x10e394310>

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

  1. In : def audit_hook(event , args):

  2. ...: if event in ['make_request']:

  3. ...: print(f'Network {event=} {args=}')

  4. ...:


  5. In : sys.addaudithook(audit_hook)


  6. In : sys.audit('make_request', 'https://baidu.com')

  7. Network event='make_request' args=('https://baidu.com',)


  8. In : sys.audit('make_request', 'https://douban.com')

  9. Network event='make_request' args=('https://douban.com',)

跨进程内存共享

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

  1. # IPython进程A

  2. In : from multiprocessing import shared_memory


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


  4. In : a

  5. Out: ShareableList([1, 'a', 0.1], name='psm_d5d6ba1b') # 注意name

  6. # IPython进程B(另外一个终端进入IPython)

  7. In : from multiprocessing import shared_memory


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


  9. In : b

  10. Out: ShareableList([1, 'a', 0.1], name='psm_d5d6ba1b')

全新第三方包读取模块

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

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


  2. In : version('flask')

  3. Out: '1.1.1'


  4. In : requires('requests')

  5. Out:

  6. ['chardet (<3.1.0,>=3.0.2)',

  7. 'idna (<2.9,>=2.5)',

  8. 'urllib3 (!=1.25.0,!=1.25.1,<1.26,>=1.21.1)',

  9. 'certifi (>=2017.4.17)',

  10. "pyOpenSSL (>=0.14) ; extra == 'security'",

  11. "cryptography (>=1.3.4) ; extra == 'security'",

  12. "idna (>=2.0.0) ; extra == 'security'",

  13. "PySocks (!=1.5.7,>=1.5.6) ; extra == 'socks'",

  14. 'win-inet-pton ; (sys_platform == "win32" and python_version == "2.7") and extra == \'socks\'']


  15. In : dist = distribution('celery')


  16. In : dist.version

  17. Out: '4.3.0'


  18. In : dist.metadata['Requires-Python']

  19. Out: '>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*'


  20. In : dist.metadata ['License']


  21. In : dist.entry_points

  22. Out:

  23. [EntryPoint(name='celery', value='celery.__main__:main', group='console_scripts'),

  24. EntryPoint(name='celery', value='celery.contrib.pytest', group='pytest11')]


  25. In : files('celery')[8]

  26. Out: PackagePath('celery/__init__.py')


  27. In : dist.locate_file(files('celery')[8])

  28. Out: PosixPath('/Users/dongweiming/test/venv/lib/python3.8/site-packages/celery/__init__.py')

新增缓存属性

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

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

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

  1. In : @lru_cache()

  2. ...: def add(a, b):

  3. ...: return a + b

  4. ...:

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

  1. In : @lru_cache

  2. ...: def add(a, b):

  3. ...: return a + b

  4. ...:

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

  1. @dataclass

  2. class InventoryItem:

  3. ...

其实 dataclass支持多个参数:

  1. def dataclass(cls=None, /, *, init=True, repr=True, eq=True, order=False,

  2. unsafe_hash=False, frozen=False):

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

Asyncio REPL

REPL对于学习一门新的编程语言非常有帮助,你可以再这个交互环境里面通过输出快速验证你的理解是不是正确。

官方全新增加了一个Asyncio REPL功能,使用更加方便!

F-strings DEBUG

一个新增的调试功能,当然一贯的,对调试毫无帮助。。。。。。

Async Mock

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

  1. In : import asyncio


  2. In : from unittest.mock import AsyncMock, MagicMock


  3. In : mock = AsyncMock(return_value={'json': 123})

  4. In : await mock()

  5. Out: {'json': 123}


  6. In : asyncio.run(mock())

  7. Out: {'json': 123}


  8. In : async def main(*args, **kwargs):

  9. ...: return await mock (*args, **kwargs)

  10. ...:


  11. In : asyncio.run(main())

  12. Out: {'json': 123}


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


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


  15. In : async def main():

  16. ...: return [i async for i in mock]

  17. ...:


  18. In : asyncio.run(main())

  19. Out: [1, 2, 3]

可迭代解包

这个主要是问题修复。

好啦,现在你知道 Python 3.8 的最新功能了吗?

Python课程全新升级,全栈、web、数据分析、爬虫、AI全新上线。网络班开班倒计时2天,120天冲击年薪30万,改变速约~~~~


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/47045
 
949 次点击  
文章 [ 2 ]  |  最新文章 3 年前