当前位置: 首页 > 科技观察

Python3.8刚刚发布!一分钟了解新版本强大功能!

时间:2023-03-15 13:16:55 科技观察

Python3.8今天发布。新版本增加了很多新特性,这也说明Python版本的道路又向前迈进了一大步。小编整理了新版本的几大更新,为大家详细讲解!对了,让Python之父桂大爷愤而辞职的赋值表达式功能还在上线呢~新的赋值表达式PEP572的标题是assignmentexpression,也叫“命名表达式”,不过现在被广泛使用了别名是“海象算子”。因为:=很像海象“小眼睛,两颗长牙”的特征^_^。下面是一个用PEP572重写的一行实现斐波那契数列的例子:In:(lambdaf:f(f,int(input('Input:')),1,0,1))(lambdaf,t,i,a,b:print(f'fib({i})={b}')ort==iorf...:(f,t,i+1,b,a+b))输入:10fib(1)=1fib(2)=1fib(3)=2fib(4)=3fib(5)=5fib(6)=8fib(7)=13fib(8)=21fib(9)=34fib(10)=55Out:真根据RaymondHettinger的版本重写:In:[(t:=(t[1],sum(t))ifielse(0,1))[1]foriinrange(10)]Out:[1,1,2,3,5,8,13,21,34,55]MandatoryuseofpositionalparametersPEP570,说白了,就是强制用户使用位置参数提醒:Python3.8版本下,报如下错误:TypeError:divmod()takesnokeywordarguments就是这个原因!在运行时添加审计挂钩现在您可以将审计挂钩添加到Python运行时:In:importsys...:importurllib.request...:...:...:default_hook(event,args):...:ifeventin['urllib.Request']:...:print(f'Network{event=}{args=}')...:...:sys.addaudithook(audit_hook)In:urllib.request.urlopen('https://httpbin.org/get?a=1')Networkevent='urllib.Request'args=('https://httpbin.org/get?a=1',None,{},'GET')Out:目前支持审计的事件名称和API可以在PEP文档中找到(扩展阅读链接2),urllib.Request就是其中之一。另外,可以自定义事件:In:default_hook(event,args):...:ifeventin['make_request']:...:print(f'Network{event=}{args=}')...:在:sys.addaudithook(audit_hook)中在:sys.audit('make_request','https://baidu.com')Networkevent='make_request'args=('https://baidu.com',)中:sys.audit('make_request','https://douban.com')Networkevent='make_request'args=('https://douban.com',)跨进程内存共享可以直接跨进程访问同一个内存(共享):#IPython进程AIn:frommultiprocessingimportshared_memoryIn:a=shared_memory.ShareableList([1,'a',0.1])In:aOut:ShareableList([1,'a',0.1],name='psm_d5d6ba1b')#注意name#IPython进程B(另一个终端进入IPython)In:frommultiprocessingimportshared_memoryIn:b=shared_memory.ShareableList(name='psm_d5d6ba1b')#使用name共享内存In:bOut:ShareableList([1,'a',0.1],name='psm_d5d6ba1b')新的第三方包读取模块使用新的importlib.metadata模块直接读取第三方packag的元数据es:In:fromimportlib.metadataimportversion,files,requires,distributionIn: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'","密码学(>=1.3.4);extra=='安全'","idna(>=2.0.0);extra=='安全'","PySocks(!=1.5.7,>=1.5.6);extra=='socks'",'win-inet-pton;(sys_platform=="win32"andpython_version=="2.7")andextra==\'socks\'']In:dist=distribution('celery')In:dist.versionOut:'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_pointsOut:[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')newcacheproperty缓存属性(cached_property)是一个很常用的函数,很多著名的Python项目自己实现了,现在终于进入版本库了。functools.lru_cache可以作为不带参数的装饰器使用。lru_cache装饰器支持max_size和类型参数。如果对默认参数不敏感,只能用过去(需要空括号):in:@lru_cache()...:defadd(a,b):...:returna+b。..:从3.8开始可以直接作为装饰器代替函数返回装饰器(不用加括号):In:@lru_cache...:defadd(a,b):...:returna+b...:就像dataclasses.dataclass一样,大部分场景都会用到:@dataclassclassInventoryItem:...其实dataclass是支持多参数的:defdataclass(cls=None,/,*,init=True,repr=True,eq=True,order=False,unsafe_hash=False,frozen=False):所以这使用了所有的默认值在装饰器工厂用法中,括号是多余的。AsyncioREPLREPL对于学习一门新的编程语言很有帮助。你可以通过这个交互环境中的输出快速验证你的理解是否正确。官方新增AsyncioREPL功能,使用更方便!F-stringsDEBUG一个新的调试功能,当然是一贯的,不利于调试。.....AsyncMock单元测试模块unittest添加mock异步代码类:In:importasyncioIn:fromunittest.mockimportAsyncMock,MagicMockIn:mock=AsyncMock(return_value={'json':123})In:awaitmock()Out:{'json':123}In:asyncio.run(mock())Out:{'json':123}In:asyncdefmain(*args,**kwargs):...:returnawaitmock(*args,**kwargs)...:In:asyncio.run(main())Out:{'json':123}In:mock=MagicMock()#AsyncMock也可用In:mock.__aiter__.return_value=[1,2,3]In:asyncdefmain():...:return[iasyncforiimmock]...:In:asyncio.run(main())Out:[1,2,3]iterableunpack这主要是一个错误修复。好的,现在你知道Python3.8的最新特性了吗?

最新推荐
猜你喜欢