中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python3.9新特性有哪些

發布時間:2021-11-20 14:20:02 來源:億速云 閱讀:167 作者:iii 欄目:編程語言

本篇內容介紹了“Python3.9新特性有哪些”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

1、使用 Python 進行相對導包的時候,__import__ 出現異常時類型由原來的 ValueError 變成了 ImportError。(由 Ngalim Siregar 在 bpo-37444 中貢獻)

"""Resolve a relative module name to an absolute one."""
 bits = package.rsplit('.', level - 1)
 if len(bits) < level:
- raise ValueError('attempted relative import beyond top-level package')
+ raise ImportError('attempted relative import beyond top-level package')
 base = bits[0]
 return '{}.{}'.format(base, name) if name else base

-:github 中的刪除

+:github 中的增加

補充知識:

__import__() 函數一般用于動態加載類和函數。

代碼示例

r = __import__('requests_html', globals(), locals(), ['HTMLSession'], 0) 
session = r.HTMLSession()
print(session.get("http://www.baidu.com"))
#globals() 函數會以字典類型返回當前位置的全部全局變量。
#locals() 函數會以字典類型返回當前位置的全部局部變量。

ImportError 觸發異常原因:在涉及到相對導入時,package 所對應的文件夾必須正確的被 python 解釋器視作 package ,而不是普通文件夾。否則由于不被視作 package,無法利用 package 之間的嵌套關系實現 Python 中包的相對導入。

2、Python 現在獲取在命令行上指定的腳本文件名的絕對路徑(例如:python script.py:__main__ 模塊的 __file__ 屬性,sys.argv[0] 和 sys.path[0] 顯示的也是絕對路徑,而不是相對路徑 (這地方之前提出了一個 bug),通過 os.chdir()更改當前目錄后,這些路徑仍然有效。但是現在出現異常 traceback 信息的時候還會顯示

__main__模塊的絕對路徑。(由 Victor Stinner 在 bpo-20443 中貢獻。)

通過命令行執行文件的時候

import sys
print(f"{__file__=}")
print(f"{sys.argv=}")
print(f"{sys.path[0]=}")

運行

$ ./python3 script.py

結果

__file__='/Users/chenxiangan/cpython/script.py'
sys.argv=['/Users/chenxiangan/cpython/script.py']
sys.path[0]='/Users/chenxiangan/cpython'

但是對于下面這段代碼,這段代碼請在 Python3.8 下運行

script.js
import sys
import os
modname = 'relpath'
filename = modname + '.py'
sys.path.insert(0, os.curdir)
with open(filename, "w") as fp:
 print("import sys", file=fp)
 print("mod = sys.modules[__name__]", file=fp)
 print("print(f'{__file__=}')", file=fp)
 print("print(f'{mod.__file__=}')", file=fp)
 print("print(f'{mod.__cached__=}')", file=fp)
__import__(modname)
os.unlink(filename)

這個代碼意思是動態生產下面的代碼

import sys
mod = sys.modules[__name__]
print(f'{__file__=}')
print(f'{mod.__file__=}')
print(f'{mod.__cached__=}')

然后執行完上面的代碼,通過 os.unlink 刪除。

輸出下面的結果

__file__='./relpath.py'
mod.__file__='./relpath.py'
mod.__cached__='./__pycache__/relpath.cpython-38.pyc'

可以看到還是相對路徑,這問題是 Cpython 的 Moudles/getpath.c 的一個 bug 修改內容如下

* absolutize() should help us out below
*/
 else if(0 == _NSGetExecutablePath(execpath, &nsexeclength) &&
- _Py_isabs(execpath))
+ (wchar_t) execpath[0] == SEP)
 {
 size_t len;
 wchar_t *path = Py_DecodeLocale(execpath, &len);

3、在開發模式和調試模式中,使用 encoding 和 decoding 操作的時候加入 encoding 和 errors 兩個關鍵字參數,errors 是聲明在編碼或者解碼的時候出現錯誤要如何處理。

例如 str.encode() 和 bytes.decode()。它們的語法結構分別是

str.encode(encoding="utf-8", errors="strict")
bytes.decode(encoding="utf-8", errors="strict")?

改進的模塊

classmethod

類方法現在可以裝飾其他描述符了,比如property()。

class C:
 @classmethod
 def f(cls): 
 pass
 @classmethod
 @property
 def age(cls):
 print("haha")
if __name__ == "__main__":
 c=C()
 c.age
 print("over")

輸出

haha
over

asyncio

loop.shutdown_default_executor()

調度默認執行程序的關閉,并等待它連接ThreadPoolExecutor中的所有線程。調用此方法后,如果在使用默認執行程序時調用executor()中的loop.run,則會引發RuntimeError。

注意,使用asyncio.run()時不需要調用這個函數。

loop.shutdown_default_executor()

threading

在子解釋器中,生成守護進程線程現在會引發異常。子解釋器中從不支持守護進程線程。在此之前,如果守護進程線程仍然在運行,則子解釋器終止過程會出現 Python 致命錯誤。(來自 Victor Stinner 提出的 bpo-37266.)方法release,在3.9版本中更改,添加了n參數來同時釋放多個等待的線程。

loop.set_default_executor(executor)

將executor設置為executor()中的run使用的默認執行程序。executor應該是ThreadPoolExecutor的一個實例。

從3.8版開始就不推薦:不推薦使用不是ThreadPoolExecutor實例的執行程序,Python 3.9中會觸發異常。要求executor必須是concurrent.futures.ThreadPoolExecutor的實例。

all_tasks

從3.7版開始就被棄用了,3.9版中將會刪除:不要把它作為任務方法調用。使用asyncio.all_tasks()函數取代。同樣的current_task也是用函數asyncio.current_task()取代。

pprint

pprint 現在可以打印漂亮的 types.SimpleNamespace。

補充說明:

SimpleNamespace 繼承自 object,其作用用來代替 class X: pass 語句

代碼:

import types
import pprint
o = types.SimpleNamespace( the=0,
 quick=1,
 brown=2,
 fox=3,
 jumped=4,
 over=5,
 a=6,
 lazy=7,
 dog=8)
pprint.pprint(o)

改版前輸出

namespace(a=6, brown=2, dog=8, fox=3, jumped=4, lazy=7, over=5, quick=1, the=0)

改版后輸出:

namespace(the=0,
 quick=1,
 brown=2,
 fox=3,
 jumped=4,
 over=5,
 a=6,
 lazy=7,
 dog=8,
 c=3)

importlib

提高與 import 語句的一致性 importlib.util.resolve_name() 的異常類型也該為了 ImportError 以前是 ValueError。

不再推薦使用的模塊用法

  • parse 模塊已被棄用,并將在未來的 Python 版本中刪除。對于大多數用例,用戶可以使用 ast 模塊利用抽象語法樹 (AST) 生成和編譯階段。

  • random 模塊之前接受任何的 hashable 類型作為種子值,不幸的是,其中一些類型不能保證具有確定性的散列值。Python3.9 中種子值將只接受 None, int, float, str, bytes, and bytearray 類型。

移除的模塊用法

  • math.factorial(x)

從3.9版本開始不贊成,帶有整數值的浮點數(比如5.0)。下面代碼示例

>>> import math
>>> math.factorial(3)
6
>>> math.factorial(3.0)
<stdin>:1: DeprecationWarning: Using factorial() with floats is deprecated
6
  • collection.abc 里面的抽象基類[https://docs.python.org/3.9/library/collections.abc.html#collections-abstract-base-classes],將不在常規的 collection 模塊中公開,這有助于在具體類和抽象基類之間創建更清晰的區別。

  • 刪除了從 Python 3.2 開始就棄用的 sys.getcheckinterval() 和 sys.setcheckinterval() 函數。它使用 sys.getswitchinterval() 和 sys.setswitchinterval() 來代替。主要作用分別是返回和設置解釋器的 “線程切換時間間隔”。

  • 刪除了從 Python 3.8 開始不再推薦使用的 threading.Thread 的 isAlive() 方法,使用 is_alive() 代替。

  • 移除 ElementTree 中在 Python3.2 就已經廢棄的方法,getchildren() 和 getiterator(),以 list() 和 iter() 代替。同時刪除 xml.etree.cElementTree 方法。

  • 刪除 3.4 中不支持的舊 plistlib 模塊的實現。使用 load(), loads(), dump(), and dumps() 方法。此外,use_builtin_types 參數已刪除,始終使用標準字節對象代替。

補充說明:

這個模塊提供了一個接口來讀寫蘋果使用的屬性列表文件,主要是在 macOS 和 iOS 上。該模塊支持二進制和 XML plist 文件。

  • 修正了當 AssertionError 被隱藏時斷言語句的錯誤行為。加入 LOAD_ASSERTION_ERROR 操作碼。

“Python3.9新特性有哪些”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

贡觉县| 乐亭县| 镇平县| 浦江县| 荃湾区| 鸡东县| 云霄县| 奉化市| 东港市| 巴彦淖尔市| 清涧县| 得荣县| 鄄城县| 丰镇市| 革吉县| 南靖县| 民勤县| 灯塔市| 贵定县| 泰宁县| 会东县| 图木舒克市| 博爱县| 阿拉善右旗| 湄潭县| 恭城| 新营市| 平泉县| 湛江市| 独山县| 唐山市| 长白| 南部县| 渭南市| 保山市| 成都市| 临泉县| 大名县| 渝北区| 孟津县| 冀州市|