Python 3.8更新內(nèi)容詳解

本文詳細(xì)介紹 Python 3.8 中的新功能身辨,以及和與 3.7 相比的一些不同點(diǎn)已添。

新功能

編譯的字節(jié)碼文件的并行文件系統(tǒng)緩存新的 PYTHONPYCACHEPREFIX設(shè)置(也可用 )將隱式字節(jié)碼緩存配置為使用單獨(dú)的并行文件系統(tǒng)樹(shù),而不是每個(gè)源目錄中的默認(rèn)子目錄隘谣。-X pycache_prefix__pycache_報(bào)告緩存的位置sys.pycache_prefix(None表示pycache子目錄中的默認(rèn)位置)吼虎。

其他語(yǔ)言變更

一個(gè)continue說(shuō)法是非法finally條款因與實(shí)施問(wèn)題。在Python 3.8中篷扩,這一限制被取消了。

該int類型現(xiàn)在具有as_integer_ratio()與現(xiàn)有float.as_integer_ratio()方法兼容的新方法茉盏。

增加了對(duì)\N{name}的支持鉴未。

Dict和dictviews現(xiàn)在可以使用反向插入順序進(jìn)行迭代 reversed()枢冤。

函數(shù)調(diào)用中允許關(guān)鍵字名稱的語(yǔ)法進(jìn)一步受到限制。特別是铜秆,f((keyword)=arg)不再允許淹真。它從來(lái)沒(méi)有打算在關(guān)鍵字參數(shù)賦值術(shù)語(yǔ)的左側(cè)允許多于一個(gè)裸名稱。見(jiàn)bpo-34641连茧。

現(xiàn)在允許Iterable解包核蘸,而不使用括號(hào)yield 和return語(yǔ)句。(由David Cuthbert和Jordan Chapman在bpo-32117中提供啸驯。)

不是有效轉(zhuǎn)義序列的反斜杠字符對(duì)DeprecationWarning從Python 3.6開(kāi)始生成客扎。在Python 3.8中它生成了一個(gè)SyntaxWarning代替。(由Serhiy Storchaka供稿于bpo-32912罚斗。)

SyntaxWarning在某些情況下徙鱼,編譯器會(huì)在元組或列表之前錯(cuò)過(guò)逗號(hào)時(shí)生成。例如:

1data = [
2   (1, 2, 3) # oops, missing comma!
3    (4, 5, 6)
4]

子類之間的算術(shù)運(yùn)算datetime.date或 datetime.datetime與datetime.timedelta對(duì)象現(xiàn)在返回子類的實(shí)例惰聂,而不是基類疆偿。這也會(huì)影響其實(shí)現(xiàn)(直接或間接)使用datetime.timedelta算術(shù)的操作的返回類型,例如 datetime.datetime.astimezone()搓幌。

當(dāng)Python解釋器被Ctrl-C(SIGINT)中斷并且KeyboardInterrupt未捕獲到的結(jié)果異常時(shí)杆故,Python進(jìn)程現(xiàn)在通過(guò)SIGINT信號(hào)或正確的退出代碼退出,以便調(diào)用進(jìn)程可以檢測(cè)到它因Ctrl而死亡-C溉愁。POSIX和Windows上的shell使用它來(lái)正確終止交互式會(huì)話中的腳本处铛。

改進(jìn)的模塊

現(xiàn)在的_asdict()方法collections.namedtuple()返回一個(gè)dict而不是一個(gè)collections.OrderedDict。這是有效的拐揭,因?yàn)樽訮ython 3.7以來(lái)撤蟆,常規(guī)dicts已經(jīng)保證了排序。如果需要額外的功能OrderedDict堂污,建議的補(bǔ)救措施是將結(jié)果轉(zhuǎn)換為所需的類型:OrderedDict(nt._asdict())家肯。該unicodedata模塊已升級(jí)為使用Unicode 12.0.0 版本。

ASYNCIO

在Windows上盟猖,現(xiàn)在是默認(rèn)的事件循環(huán)ProactorEventLoop讨衣。

gettext

添加pgettext()及其變體。

檢查

如果該屬性是值為docstrings的位置式镐,該inspect.getdoc()函數(shù)現(xiàn)在可以找到文檔字符串反镇。這提供了類似于我們已經(jīng)有文件的選項(xiàng),以及:__slots__dictproperty()classmethod()staticmethod()

1class AudioClip:
2    __slots__ = {'bit_rate': 'expressed in kilohertz to one decimal place',
3                 'duration': 'in seconds, rounded up to an integer'}
4    def __init__(self, bit_rate, duration):
5        self.bit_rate = round(bit_rate / 1000.0, 1)
6        self.duration = ceil(duration)

GC

get_objects()現(xiàn)在可以接收一個(gè)可選的生成參數(shù)娘汞,指示從中獲取對(duì)象的生成歹茶。由Pablo Galindo 提供的 bpo-36016。

gzip

添加了mtime參數(shù)以gzip.compress()獲得可重現(xiàn)的輸出。(由Guo Ci Teo在bpo-34898供稿惊豺。)

idlelib和IDLE

超過(guò)N行的輸出(默認(rèn)為50)被壓縮到一個(gè)按鈕燎孟。可以在“設(shè)置”對(duì)話框的“常規(guī)”頁(yè)面的PyShell部分中更改N. 右鍵單擊輸出可以擠壓更少但可能超長(zhǎng)的線條扮叨。通過(guò)雙擊按鈕或通過(guò)右鍵單擊按鈕進(jìn)入剪貼板或單獨(dú)的窗口缤弦,可以擴(kuò)展壓縮輸出。(由Tal Einat在bpo-1529353供稿彻磁。)

上述更改已被移植到3.7維護(hù)版本。

json.tool

添加選項(xiàng)--json-lines以將每個(gè)輸入行解析為單獨(dú)的JSON對(duì)象狸捅。(由Weipeng Hong在bpo-31553供稿衷蜓。)

計(jì)算

增加math.dist()了計(jì)算兩點(diǎn)之間歐氏距離的新函數(shù)。

擴(kuò)展了math.hypot()處理多個(gè)維度的功能尘喝。以前磁浇,它只支持2-D案例。

添加了新函數(shù)朽褪,math.prod()作為類似函數(shù)sum() 返回“start”值(默認(rèn)值:1)乘以可迭代數(shù)字的乘積置吓。

os.path

os.path返回一個(gè)布爾值結(jié)果類似功能exists(),lexists()缔赠,isdir()衍锚, isfile(),islink()嗤堰,和ismount()現(xiàn)在回到False代替升高ValueError或它的子類 UnicodeEncodeError戴质,并UnicodeDecodeError為包含字符或字節(jié)在OS級(jí)不可表示的路徑。

expanduser()在Windows上現(xiàn)在更喜歡 USERPROFILE 環(huán)境變量踢匣,不使用 HOME告匠,通常不為常規(guī)用戶帳戶設(shè)置。

ncurses

添加了一個(gè)新變量离唬,其中包含底層ncurses庫(kù)的結(jié)構(gòu)化版本信息:ncurses_version后专。

pathlib

pathlib.Path返回布爾結(jié)果類似方法 exists(),is_dir()输莺, is_file()戚哎,is_mount(), is_symlink()模闲,is_block_device()建瘫, is_char_device(),is_fifo()尸折, is_socket()現(xiàn)在回到False而不是提高 ValueError或它的子類UnicodeEncodeError的包含字符的不可表示在操作系統(tǒng)級(jí)別路徑啰脚。(由Serhiy Storchaka供稿于bpo-33721。)

shutil

shutil.copytree()現(xiàn)在接受一個(gè)新的dirs_exist_ok關(guān)鍵字參數(shù)。

SSL

添加SSLContext.post_handshake_auth以啟用和 ssl.SSLSocket.verify_client_post_handshake()啟動(dòng)TLS 1.3握手后身份驗(yàn)證橄浓。

統(tǒng)計(jì)

添加statistics.fmean()為更快的浮點(diǎn)變體statistics.mean()粒梦。

添加statistics.multimode()了返回最常見(jiàn)值的列表。

添加statistics.NormalDist了一個(gè)用于創(chuàng)建和操作隨機(jī)變量的正態(tài)分布的工具.

1>>>
2>>> temperature_feb = NormalDist.from_samples([4, 12, -3, 2, 7, 14])
3>>> temperature_feb
4NormalDist(mu=6.0, sigma=6.356099432828281)
5
6>>> temperature_feb.cdf(3)            # Chance of being under 3 degrees
70.3184678262814532
8>>> # Relative chance of being 7 degrees versus 10 degrees
9>>> temperature_feb.pdf(7) / temperature_feb.pdf(10)
101.2039930378537762
11
12>>> el_nino = NormalDist(4, 2.5)
13>>> temperature_feb += el_nino        # Add in a climate effect
14>>> temperature_feb
15NormalDist(mu=10.0, sigma=6.830080526611674)
16
17>>> temperature_feb * (9/5) + 32      # Convert to Fahrenheit
18NormalDist(mu=50.0, sigma=12.294144947901014)
19>>> temperature_feb.samples(3)        # Generate random samples
20[7.672102882379219, 12.000027119750287, 4.647488369766392]

tar文件

該tarfile模塊現(xiàn)在默認(rèn)為新檔案的現(xiàn)代pax(POSIX.1-2001)格式荸实,而不是之前的GNU特定格式匀们。這通過(guò)標(biāo)準(zhǔn)化和可擴(kuò)展格式的一致編碼(UTF-8)提高了跨平臺(tái)的可移植性,并提供了其他一些好處准给。

令牌化

當(dāng)提供沒(méi)有尾隨新行的輸入時(shí)泄朴,tokenize模塊現(xiàn)在隱式地發(fā)出NEWLINE令牌。此行為現(xiàn)在與C tokenizer在內(nèi)部執(zhí)行的操作相匹配露氮。

Tkinter

添加的方法selection_from()祖灰, selection_present(), selection_range()和 selection_to() 在tkinter.Spinbox類畔规。

moveto() 在tkinter.Canvas課堂上添加了方法局扶。

時(shí)間

CLOCK_UPTIME_RAW為macOS 10.12 添加了新時(shí)鐘。

unicodedata

新函數(shù)is_normalized()可用于驗(yàn)證字符串是否處于特定的正常形式叁扫。

單元測(cè)試

添加addModuleCleanup()并 addClassCleanup()進(jìn)行unittest以支持setUpModule()和的 清理setUpClass()三妈。

VENV

venv現(xiàn)在,Activate.ps1在PowerShell Core 6.1下莫绣,所有平臺(tái)上都包含一個(gè)用于激活虛擬環(huán)境的腳本畴蒲。

XML

作為對(duì)DTD和外部實(shí)體檢索的緩解,默認(rèn)情況下兔综, xml.dom.minidom和xml.sax模塊不再處理外部實(shí)體饿凛。

優(yōu)化

subprocess現(xiàn)在,模塊可以os.posix_spawn()在某些情況下使用該功能以獲得更好的性能软驰。目前涧窒,如果滿足所有這些條件,它僅用于macOS和Linux

-close_fds為false;
未設(shè)置preexec_fn锭亏,pass_fds纠吴,cwd和start_new_session參數(shù);
該可執(zhí)行文件路徑中包含一個(gè)目錄。
-shutil.copyfile()慧瘤,shutil.copy()戴已,shutil.copy2(), shutil.copytree()并shutil.move()使用特定于平臺(tái)的“快速?gòu)?fù)制”在Linux锅减,MacOS的和Solaris糖儡,以更有效地復(fù)制文件系統(tǒng)調(diào)用≌唬“快速?gòu)?fù)制”意味著復(fù)制操作發(fā)生在內(nèi)核中握联,避免在Python中使用用戶空間緩沖區(qū),如“ outfd.write(infd.read())”。在Windows上shutil.copyfile()使用更大的默認(rèn)緩沖區(qū)大薪鹈觥(1 MiB而不是16 KiB)纯露,并使用memoryview()基于a 的變體 - shutil.copyfileobj()。在同一分區(qū)中復(fù)制512 MiB文件的速度在Linux上約為+ 26%代芜,在macOS上為+ 50%埠褪,在Windows上為+ 40%。此外挤庇,消耗的CPU周期更少钞速。請(qǐng)參閱與平臺(tái)相關(guān)的高效復(fù)制操作部分。

shutil.copytree()使用os.scandir()函數(shù)和依賴它的所有復(fù)制函數(shù)使用緩存os.stat()值嫡秕。復(fù)制具有8000個(gè)文件的目錄的速度在Linux上約為+ 9%玉工,在Windows上為+ 20%,在Windows SMB共享上為+ 30%淘菩。此外,os.stat() 系統(tǒng)調(diào)用的數(shù)量減少了38%屠升,使shutil.copytree()網(wǎng)絡(luò)文件系統(tǒng)的速度更快潮改。

-pickle模塊中的默認(rèn)協(xié)議現(xiàn)在是協(xié)議4,首先在Python 3.4中引入腹暖。與Python 3.0以來(lái)提供的Protocol 3相比汇在,它提供了更好的性能和更小的尺寸。
刪除了一個(gè)Py_ssize_t成員PyGC_Head脏答。所有GC跟蹤對(duì)象(例如元組糕殉,列表,字典)的大小減少了4或8個(gè)字節(jié)殖告。

uuid.UUID現(xiàn)在用于slots__減少其內(nèi)存占用阿蝶。 -性能提升operator.itemgetter()了33%。優(yōu)化參數(shù)處理并為單個(gè)非負(fù)整數(shù)索引的常見(jiàn)情況添加快速路徑到元組(這是標(biāo)準(zhǔn)庫(kù)中的典型用例)黄绩。 -加速字段查找collections.namedtuple()羡洁。它們現(xiàn)在的速度提高了兩倍以上,使它們成為Python中最快的實(shí)例變量查找形式爽丹。 -list如果輸入iterable具有已知長(zhǎng)度(輸入實(shí)現(xiàn)__len)筑煮,則構(gòu)造函數(shù)不會(huì)全局定位內(nèi)部項(xiàng)緩沖區(qū)。這使得創(chuàng)建的列表平均減少12%粤蝎。(由Raymond Hettinger和Pablo Galindo在bpo-33234中提供真仲。)
-將類變量寫入的速度加倍。更新非dunder屬性時(shí)初澎,會(huì)有不必要的更新插槽調(diào)用秸应。(由Stefan Behnel,Pablo Galindo Salgado,Raymond Hettinger灸眼,Neil Schemenauer和Serhiy Storchaka供稿于bpo-36012卧檐。)
-減少轉(zhuǎn)換傳遞給許多內(nèi)置函數(shù)和方法的參數(shù)的開(kāi)銷。加快調(diào)用一些簡(jiǎn)單的內(nèi)置函數(shù)和方法焰宣,最多可達(dá)20-50%霉囚。(由Serhiy Storchaka在bpo-23867, bpo-35582和bpo-36127供稿匕积。)

構(gòu)建和C API更改

這些PyByteArray_Init()和PyByteArray_Fini()功能已被刪除盈罐。他們沒(méi)有做任何事情,因?yàn)镻ython 2.7.4和Python 3.2.0被排除在有限的API(穩(wěn)定的ABI)之外闪唆,并且沒(méi)有記錄盅粪。

結(jié)果PyExceptionClass_Name()現(xiàn)在是類型 而不是。const char *char *

二元性Modules/Setup.dist和 Modules/Setup已被刪除悄蕾。以前票顾,在更新CPython源代碼樹(shù)時(shí),必須手動(dòng)將Modules/Setup.dist(在源代碼樹(shù)內(nèi))復(fù)制到 Modules/Setup(在構(gòu)建樹(shù)內(nèi))以反映上游的任何更改帆调。這對(duì)包裝商來(lái)說(shuō)是一個(gè)小小的好處奠骄,代價(jià)是CPython開(kāi)發(fā)后開(kāi)發(fā)人員經(jīng)常煩惱,因?yàn)橥洀?fù)制文件可能會(huì)導(dǎo)致構(gòu)建失敗番刊。

現(xiàn)在構(gòu)建系統(tǒng)總是從Modules/Setup源樹(shù)內(nèi)部讀取含鳞。鼓勵(lì)想要自定義該文件的人將其更改保存在CPython的git fork中或作為補(bǔ)丁文件,就像它們對(duì)源樹(shù)的任何其他更改一樣芹务。

將Python數(shù)轉(zhuǎn)換為C整數(shù)的 PyLong_AsLong()函數(shù)和參數(shù)解析函數(shù)(如 PyArg_ParseTuple()整數(shù)轉(zhuǎn)換格式單位)'i' 現(xiàn)在將使用index()特殊方法而不是( int__()如果可用)蝉绷。將使用int()方法但沒(méi)有 index()方法(如Decimal和 Fraction)為對(duì)象發(fā)出棄用警告。 PyNumber_Check()現(xiàn)在將返回 1實(shí)現(xiàn)的對(duì)象__index()枣抱。

堆分配的類型對(duì)象現(xiàn)在將增加它們PyObject_Init()(和它的并行宏P(guān)yObject_INIT)中的引用計(jì)數(shù)而不是in PyType_GenericAlloc()熔吗。可能需要調(diào)整修改實(shí)例分配或釋放的類型沃但。

不支持

不建議使用的方法getchildren()磁滚,getiterator()在ElementTree模塊現(xiàn)在發(fā)出 DeprecationWarning來(lái)代替PendingDeprecationWarning。它們將在Python 3.9中刪除宵晚。

傳遞一個(gè)不是concurrent.futures.ThreadPoolExecutorto的實(shí)例的對(duì)象已 asyncio.loop.set_default_executor()被棄用垂攘,并且將在Python 3.9中被禁止。

該getitem()方法xml.dom.pulldom.DOMEventStream淤刃, wsgiref.util.FileWrapper并fileinput.FileInput已被棄用晒他。

這些方法的實(shí)現(xiàn)忽略了它們的索引參數(shù),而是返回下一個(gè)項(xiàng)目逸贾。

該typing.NamedTuple已否決了陨仅,_field_types贊成的屬性annotations具有相同信息的屬性津滞。
ast類Num,Str灼伤,Bytes触徐,NameConstant和 Ellipsis被標(biāo)記是過(guò)時(shí)的,并將在未來(lái)的Python版本中刪除狐赡。Constant應(yīng)該用來(lái)代替撞鹉。

下面的函數(shù)和方法棄用在gettext 模塊:lgettext(),ldgettext()颖侄, lngettext()和ldngettext()鸟雏。它們返回編碼的字節(jié),如果翻譯的字符串存在編碼問(wèn)題览祖,則可能會(huì)出現(xiàn)意外的與Unicode相關(guān)的異常孝鹊。在Python 3中使用返回Unicode字符串的替代方法要好得多。這些功能已經(jīng)被打破了很長(zhǎng)時(shí)間展蒂。

功能bind_textdomain_codeset()又活,方法 output_charset()和 set_output_charset(),以及代碼集 的功能參數(shù)translation()和install()也不贊成使用锰悼,因?yàn)樗鼈儍H用于為l*gettext()功能皇钞。

-該isAlive()方法threading.Thread已被棄用。

許多帶有整數(shù)參數(shù)的內(nèi)置函數(shù)和擴(kuò)展函數(shù)現(xiàn)在將為Decimals松捉,F(xiàn)ractions和任何其他對(duì)象發(fā)出棄用警告, 這些對(duì)象只能在丟失的情況下轉(zhuǎn)換為整數(shù)(例如馆里,具有int__() 方法但沒(méi)有__index()方法)隘世。在將來(lái)的版本中,它們將是錯(cuò)誤的鸠踪。

API和功能刪除

Python 3.8中刪除了以下功能和API:
macpath已刪除在Python 3.7中棄用的模塊丙者。
該函數(shù)platform.popen()已被刪除,自Python 3.3以來(lái)已被棄用:os.popen()改為使用营密。

該pyvenv腳本已被刪除械媒, 以幫助消除關(guān)于 腳本綁定的Python解釋器的混淆。python3.8 -m venvpyvenv

parse_qs评汰,parse_qsl和escape從除去cgi 模塊纷捞。它們已從Python 3.2或更早版本棄用。

filemode功能已從tarfile模塊中刪除被去。自Python 3.3以來(lái)主儡,它沒(méi)有記錄和棄用。
該XMLParser構(gòu)造不再接受HTML參數(shù)惨缆。它從未產(chǎn)生過(guò)影響糜值,在Python 3.4中已被棄用丰捷。所有其他參數(shù)現(xiàn)在都是僅關(guān)鍵字。

刪除了doctype()方法XMLParser寂汇。

unicode_internal編解碼器被刪除病往。

移植

本節(jié)列出了先前描述的更改以及可能需要更改代碼的其他錯(cuò)誤修正。

Python行為的變化

屈服表達(dá)式(both yield和子句)現(xiàn)在在理解和生成器表達(dá)式中是不允許的(除了最左邊的子句中的可迭代表達(dá)式)

編譯器現(xiàn)在生成一個(gè)SyntaxWarning何時(shí)身份檢查 與某些類型的文字(例如字符串骄瓣,整數(shù))一起使用停巷。這些通常可以在CPython中偶然使用累贤,但不受語(yǔ)言規(guī)范的保證叠穆。警告建議用戶使用相等測(cè)試。

Python API的變化

該函數(shù)platform.popen()已被刪除臼膏,自Python 3.3以來(lái)已被棄用:os.popen()改為使用硼被。

statistics.mode()給定多模態(tài)數(shù)據(jù)時(shí),該函數(shù)不再引發(fā)異常渗磅。相反嚷硫,它返回輸入數(shù)據(jù)中遇到的第一個(gè)模式。
該類的selection()方法 tkinter.ttk.Treeview不再需要參數(shù)始鱼。在Python 3.6中不推薦使用帶有參數(shù)來(lái)更改選擇仔掸。使用專門的方法,如selection_set()更改選擇医清。

writexml()起暮,toxml()并且toprettyxml()所述的方法 xml.dom.minidom模塊,和xml.etree現(xiàn)在保存由用戶指定的屬性順序会烙。(
-dbm.dumb使用flags打開(kāi)的數(shù)據(jù)庫(kù)'r'現(xiàn)在是只讀的负懦。 dbm.dumb.open()帶有標(biāo)志'r','w'如果不存在則不再創(chuàng)建數(shù)據(jù)庫(kù)柏腻。

將不再調(diào)用doctype()子類中定義的方法纸厉, XMLParser并且將導(dǎo)致發(fā)出a RuntimeWarning而不是a DeprecationWarning。doctype()在目標(biāo)上定義用于處理XML doctype聲明的方法五嫂。

一個(gè)RuntimeError是現(xiàn)在時(shí)引發(fā)自定義的元類不提供classcell__傳入的名稱空間項(xiàng) type.__new颗品。A DeprecationWarning是在Python 3.6-3.7中發(fā)出的。

在cProfile.Profile類現(xiàn)在可以作為一個(gè)上下文管理器沃缘。

shutil.copyfile()躯枢,shutil.copy(),shutil.copy2()槐臀, shutil.copytree()并shutil.move()使用特定于平臺(tái)的“快速?gòu)?fù)制”的系統(tǒng)調(diào)用

shutil.copyfile()Windows上的默認(rèn)緩沖區(qū)大小從16 KiB更改為1 MiB闺金。

PyGC_Head結(jié)構(gòu)完全改變了。觸及struct成員的所有代碼都應(yīng)該被重寫峰档。

PyInterpreterState結(jié)構(gòu)已被移入“內(nèi)部”頭文件(特別是Include / internal / pycore_pystate.h)败匹。opaque PyInterpreterState仍然可用作公共API(和穩(wěn)定的ABI)的一部分寨昙。文檔表明struct的字段都不公開(kāi),所以我們希望沒(méi)有人使用它們掀亩。但是舔哪,如果您確實(shí)依賴于一個(gè)或多個(gè)私有字段而沒(méi)有其他選擇,那么請(qǐng)打開(kāi)一個(gè)BPO問(wèn)題槽棍。我們將努力幫助您進(jìn)行調(diào)整(可能包括向公共API添加訪問(wèn)器功能)捉蚤。

ASYNCIO任務(wù)現(xiàn)在可以命名,或者通過(guò)將name關(guān)鍵字參數(shù)asyncio.create_task()或create_task()事件循環(huán)的方法炼七,或者通過(guò)調(diào)用set_name()任務(wù)對(duì)象的方法缆巧。任務(wù)名稱在repr()輸出中可見(jiàn),asyncio.Task也可以使用該get_name()方法檢索豌拙。

mmap.flush()方法現(xiàn)在返回None成功并在所有平臺(tái)下引發(fā)錯(cuò)誤異常陕悬。以前,它的行為是平臺(tái)依賴的:成功時(shí)返回非零值; 在Windows下錯(cuò)誤返回零按傅。成功返回零值; 在Unix下出現(xiàn)異常錯(cuò)誤捉超。

該函數(shù)math.factorial()不再接受非int類的參數(shù)。

xml.dom.minidom和xml.sax模塊默認(rèn)不再處理外部實(shí)體唯绍。

從只讀dbm數(shù)據(jù)庫(kù)(dbm.dumb拼岳, dbm.gnu或dbm.ndbm)中刪除密鑰會(huì)引發(fā)error(dbm.dumb.error, dbm.gnu.error或dbm.ndbm.error)而不是KeyError况芒。

expanduser()在Windows上現(xiàn)在更喜歡 USERPROFILE 環(huán)境變量惜纸,不使用 HOME,通常不為常規(guī)用戶帳戶設(shè)置绝骚。

使用#在分析或建筑價(jià)值的形式變體(例如 PyArg_ParseTuple()堪簿,Py_BuildValue(),PyObject_CallFunction()沒(méi)有等)PY_SSIZE_T_CLEAN定義提出了DeprecationWarning現(xiàn)在皮壁。它將在3.10或4.0中刪除。閱讀解析參數(shù)并為細(xì)節(jié)構(gòu)建值哪审。(由Inada Naoki在bpo-36381供稿蛾魄。)

C API的變化

-堆分配類型的實(shí)例(例如用其創(chuàng)建的實(shí)例 PyType_FromSpec())保存對(duì)其類型對(duì)象的引用。增加這些類型對(duì)象的引用計(jì)數(shù)已從 PyType_GenericAlloc()更低級(jí)別的函數(shù)移動(dòng)湿滓, PyObject_Init()并且PyObject_INIT()滴须。這使得通過(guò)PyType_FromSpec()托管代碼中的其他類行為創(chuàng)建類型。

靜態(tài)分配的類型不受影響叽奥。

對(duì)于絕大多數(shù)情況扔水,應(yīng)該沒(méi)有副作用。但是朝氓,在分配實(shí)例(可能是為了解決bug)之后手動(dòng)增加引用計(jì)數(shù)的類型現(xiàn)在可能變得不朽魔市。為避免這種情況主届,這些類需要在實(shí)例釋放期間在類型對(duì)象上調(diào)用Py_DECREF。

要將這些類型正確移植到3.8待德,請(qǐng)應(yīng)用以下更改:

Py_INCREF分配實(shí)例后刪除類型對(duì)象 - 如果有的話君丁。這可能打完電話后發(fā)生的PyObject_New(), PyObject_NewVar()将宪,PyObject_GC_New()绘闷, PyObject_GC_NewVar(),或使用任何其他自定義分配器 PyObject_Init()或PyObject_INIT()较坛。

例:

1static foo_struct *
2foo_new(PyObject *type) {
3    foo_struct *foo = PyObject_GC_New(foo_struct, (PyTypeObject *) type);
4    if (foo == NULL)
5        return NULL;
6#if PY_VERSION_HEX < 0x03080000
7    // Workaround for Python issue 35810; no longer necessary in Python 3.8
8    PY_INCREF(type)
9#endif
10    return foo;
11}

確保 tp_dealloc堆分配類型的所有自定義函數(shù)都減少了類型的引用計(jì)數(shù)印蔗。

例:

1 static void
2foo_dealloc(foo_struct *instance) {
3    PyObject *type = Py_TYPE(instance);
4    PyObject_GC_Del(instance);
5#if PY_VERSION_HEX >= 0x03080000
6    // This was not needed before Python 3.8 (Python issue 35810)
7    Py_DECREF(type);
8#endif
9}

CPython字節(jié)碼更改

通過(guò)移動(dòng)將塊堆棧展開(kāi)到編譯器中的邏輯,簡(jiǎn)化了解釋器循環(huán)丑勤。編譯器現(xiàn)在發(fā)出顯式指令华嘹,用于調(diào)整值堆棧并調(diào)用清理代碼break,continue和 return确封。

刪除操作碼BREAK_LOOP除呵,CONTINUE_LOOP, SETUP_LOOP和SETUP_EXCEPT爪喘。增加了新的操作碼ROT_FOUR颜曾,BEGIN_FINALLY,CALL_FINALLY和 POP_FINALLY秉剑。改變了END_FINALLY和WITH_CLEANUP_START泛豪。 添加了新的操作碼,END_ASYNC_FOR`用于處理在等待循環(huán)中的下一個(gè)項(xiàng)目時(shí)引發(fā)的異常侦鹏。

這是我的個(gè)人站點(diǎn)——一路香蕉皮诡曙,有興趣可以點(diǎn)擊查看下,里面有軟件略水,教程价卤,圖片福利分享

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市渊涝,隨后出現(xiàn)的幾起案子慎璧,更是在濱河造成了極大的恐慌,老刑警劉巖跨释,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胸私,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡鳖谈,警方通過(guò)查閱死者的電腦和手機(jī)岁疼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)缆娃,“玉大人捷绒,你說(shuō)我怎么就攤上這事瑰排。” “怎么了疙驾?”我有些...
    開(kāi)封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵凶伙,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我它碎,道長(zhǎng)函荣,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任扳肛,我火速辦了婚禮傻挂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘挖息。我一直安慰自己金拒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布套腹。 她就那樣靜靜地躺著绪抛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪电禀。 梳的紋絲不亂的頭發(fā)上幢码,一...
    開(kāi)封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音尖飞,去河邊找鬼症副。 笑死,一個(gè)胖子當(dāng)著我的面吹牛政基,可吹牛的內(nèi)容都是我干的贞铣。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼沮明,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼辕坝!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起荐健,我...
    開(kāi)封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤酱畅,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后摧扇,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡挚歧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年扛稽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滑负。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡在张,死狀恐怖用含,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情帮匾,我是刑警寧澤啄骇,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站瘟斜,受9級(jí)特大地震影響缸夹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜螺句,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一虽惭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蛇尚,春花似錦芽唇、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至谱邪,卻和暖如春炮捧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背虾标。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工寓盗, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人璧函。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓傀蚌,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蘸吓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子善炫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • C++調(diào)用python 在C/C++中嵌入Python,可以使用Python提供的強(qiáng)大功能库继,通過(guò)嵌入Python可...
    Bruce_Szh閱讀 13,773評(píng)論 1 7
  • http://python.jobbole.com/85231/ 關(guān)于專業(yè)技能寫完項(xiàng)目接著寫寫一名3年工作經(jīng)驗(yàn)的J...
    燕京博士閱讀 7,557評(píng)論 1 118
  • Python是一門功能強(qiáng)大的高級(jí)腳本語(yǔ)言箩艺,它的強(qiáng)大不僅表現(xiàn)在其自身的功能上,而且還表現(xiàn)在其良好的可擴(kuò)展性上宪萄,正因如...
    蝴蝶蘭玫瑰閱讀 1,629評(píng)論 0 17
  • 一個(gè)很全的在線手冊(cè)中心:https://docs.pythontab.com/《Intermediate Pyth...
    下里巴人也閱讀 1,845評(píng)論 0 5
  • 豬肝豌豆泥是一款營(yíng)養(yǎng)艺谆、開(kāi)胃,葷素搭配得宜的輔食拜英,適合八個(gè)月以上的寶寶食用静汤。 營(yíng)養(yǎng): 豬肝含有豐富的鐵和維生素K,能...
    麻辣貓糧閱讀 1,255評(píng)論 4 2