日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python3.8 了解的差不多了吧,Python3.9 新特性了解一下!

發布時間:2023/12/10 python 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python3.8 了解的差不多了吧,Python3.9 新特性了解一下! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

"Python學習開發",一個值得加星標的公眾號。

正文共:4946 字 1 圖

預計閱讀時間:13 分鐘

作者:陳祥安

原文有刪改:https://docs.python.org/3.9/whatsnew/3.9.html

本文將解釋 Python 3.9 中的新特性,而不是 3.8。有關完整的詳細信息,請參見更改日志。

目前官網只有 3.8 的下載包,3.9 需要自己編譯 Cpython,可以參考我之前的文章里面有編譯部分的內容,

語言上的變化

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 中的刪除

補充知識:__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 信息的時候還會顯示

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

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(encoding="utf-8",?errors="strict") bytes.decode(encoding="utf-8",?errors="strict")?

改進的模塊

classmethod

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

class?C:@classmethoddef?f(cls):?pass@classmethod@propertydef?age(cls):print("haha")if?__name__?==?"__main__":c=C()c.ageprint("over")

輸出

haha over

asyncio

loop.shutdown_default_executor()

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

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

loop.shutdown_default_executor()

threading

loop.set_default_executor(executor)

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

all_tasks

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

pprint

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)

importlibimportlib.util.resolve_name() 的異常類型也該為了 ImportError 以前是 ValueError。

不再推薦使用的模塊用法

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

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

移除的模塊用法

  • math.factorial(x)

>>>?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 參數已刪除,始終使用標準字節對象代替。

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

后記

需要注意的是這個文檔目前只是個草稿格式,隨著 Python3.9 的正式發布,一些特性可能還會添加或刪除。下面我們看看語言上的變化。

推薦閱讀

添加微信[gopython3].回復:回復 Go 或者 Python 加對應技術群。

總結

以上是生活随笔為你收集整理的Python3.8 了解的差不多了吧,Python3.9 新特性了解一下!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。