新聞中心

“只有客戶發(fā)展了,才有我們的生存與發(fā)展!”這是創(chuàng)新互聯(lián)的服務(wù)宗旨!把網(wǎng)站當(dāng)作互聯(lián)網(wǎng)產(chǎn)品,產(chǎn)品思維更注重全局思維、需求分析和迭代思維,在網(wǎng)站建設(shè)中就是為了建設(shè)一個(gè)不僅審美在線,而且實(shí)用性極高的網(wǎng)站。創(chuàng)新互聯(lián)對(duì)網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)站開發(fā)、網(wǎng)頁設(shè)計(jì)、網(wǎng)站優(yōu)化、網(wǎng)絡(luò)推廣、探索永無止境。
今天Python3.8發(fā)布啦,新版本添加了很多全新功能,也表明Python的版本之路前進(jìn)了一大步,小編整理了新版本的幾個(gè)主要更新,為大家做詳細(xì)解讀!
順便一提,導(dǎo)致Python之父龜叔憤然離職的賦值表達(dá)式功能還是上線了~
新增賦值表達(dá)式
PEP 572的標(biāo)題是賦值表達(dá)式,也叫做「命名表達(dá)式」,不過它現(xiàn)在被廣泛的別名是「海象運(yùn)算符」(The Walrus Operator)。因?yàn)?=很像海象「眼睛小,長著兩枚長長的牙」這個(gè)特點(diǎn)^_^。
在這里給大家展示個(gè)通過用PEP 572改寫的一行實(shí)現(xiàn)斐波那契數(shù)列的例子:
- In : (lambda f: f(f, int(input('Input: ')), 1, 0, 1))(lambda f, t, i, a, b: print(f'fib({i}) = ') 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]
強(qiáng)制使用位置參數(shù)
PEP 570說白了就是強(qiáng)制使用者用位置參數(shù)
溫馨提示:Python3.8版本下,見到以下報(bào)錯(cuò):
- TypeError: divmod() takes no keyword arguments
就是這個(gè)原因啦!
運(yùn)行時(shí)添加審計(jì)hooks
現(xiàn)在可以給Python運(yùn)行時(shí)添加審計(jì)鉤子:
- 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:
目前支持審計(jì)的事件名字和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',)
跨進(jìn)程內(nèi)存共享
可以跨進(jìn)程直接訪問同一內(nèi)存(共享):
- # IPython進(jìn)程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進(jìn)程B(另外一個(gè)終端進(jìn)入IPython)
- In : from multiprocessing import shared_memory
- In : b = shared_memory.ShareableList(name='psm_d5d6ba1b') # 使用name就可以共享內(nèi)存
- In : b
- Out: ShareableList([1, 'a', 0.1], name='psm_d5d6ba1b')
全新第三方包讀取模塊
使用新的 importlib.metadata模塊可以直接讀取第三方包的元數(shù)據(jù):
- 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')
新增緩存屬性
緩存屬性 (cached_property) 是一個(gè)非常常用的功能,很多知名 Python 項(xiàng)目都自己實(shí)現(xiàn)過它,現(xiàn)在終于進(jìn)入版本庫了。
functools.lru_cache作為裝飾器時(shí)可以不加參數(shù)
lru_cache裝飾器支持 max_size和 typed2個(gè)參數(shù),如果對(duì)默認(rèn)參數(shù)不敏感,過去只能這么用(需要空括號(hào)):
- In : @lru_cache()
- ...: def add(a, b):
- ...: return a + b
- ...:
從3.8開始可以直接作為裝飾器,而不是作為返回裝飾器的函數(shù)(不加括號(hào)):
- In : @lru_cache
- ...: def add(a, b):
- ...: return a + b
- ...:
就像 dataclasses.dataclass,絕大部分場(chǎng)景都是這么用:
- @dataclass
- class InventoryItem:
- ...
其實(shí) dataclass支持多個(gè)參數(shù):
- def dataclass(cls=None, /, *, init=True, repr=True, eq=True, order=False,
- unsafe_hash=False, frozen=False):
所以這種使用全部缺省值的裝飾器工廠用法中,括號(hào)反而顯得多余了。
Asyncio REPL
REPL對(duì)于學(xué)習(xí)一門新的編程語言非常有幫助,你可以再這個(gè)交互環(huán)境里面通過輸出快速驗(yàn)證你的理解是不是正確。
官方全新增加了一個(gè)Asyncio REPL功能,使用更加方便!
F-strings DEBUG
一個(gè)新增的調(diào)試功能,當(dāng)然一貫的,對(duì)調(diào)試毫無幫助。
Async Mock
單元測(cè)試模塊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]
可迭代解包
這個(gè)主要是問題修復(fù)。
好啦,現(xiàn)在你知道 Python 3.8 的最新功能了嗎?
網(wǎng)頁名稱:Python3.8剛剛發(fā)布!一分鐘了解新版本的強(qiáng)大功能!
本文網(wǎng)址:http://www.dlmjj.cn/article/dhsocpo.html


咨詢
建站咨詢
