Python 3.8

Python 3.8.0 (final) ได้เปิดตัวเมื่อวันที่ 14 ตุลาคม 2019 ฟีเจอร์สำหรับ 3.8 ถูกกำหนดไว้ใน PEP 569 และคำอธิบายโดยละเอียดของการเปลี่ยนแปลงสามารถดูได้ใน What's New in Python 3.8.

ฟีเจอร์

สถานะ

PEP 570

อาร์กิวเมนต์แบบตำแหน่งเท่านั้น

PEP 572

Assignment Expressions

สมบูรณ์

PEP 574

Pickle protocol 5 พร้อมข้อมูล out-of-band

PEP 578

Runtime audit hooks

PEP 587

การกำหนดค่าการเริ่มต้น Python

PEP 590

Vectorcall: โปรโตคอลการเรียกที่รวดเร็วสำหรับ CPython

เบ็ดเตล็ด

f-strings รองรับ = สำหรับ self-documenting expressions และการดีบัก

สมบูรณ์

การเปลี่ยนแปลงภาษาอื่นๆ:

คำสั่ง continue ไม่ได้รับอนุญาตใน clause finally เนื่องจากปัญหาในการนำไปใช้งาน ข้อจำกัดนี้ถูกยกเลิกใน Python 3.8

สมบูรณ์

ประเภท bool, int และ fractions.Fraction ขณะนี้มีเมธอด as_integer_ratio() เช่นเดียวกับที่พบใน float และ decimal.Decimal

Constructor ของ int, float และ complex ขณะนี้จะใช้เมธอดพิเศษ __index__() หากมีให้ใช้งาน และเมธอดที่เกี่ยวข้อง __int__(), __float__() หรือ __complex__() ไม่พร้อมใช้งาน

เพิ่มการรองรับ N{name} escapes ในนิพจน์ปกติ

Dict และ dictviews ขณะนี้สามารถวนซ้ำในลำดับการแทรกแบบย้อนกลับโดยใช้ reversed()

ไวยากรณ์ที่อนุญาตสำหรับชื่อ keyword ในการเรียกฟังก์ชันถูกจำกัดเพิ่มเติม โดยเฉพาะอย่างยิ่ง f((keyword)=arg) ไม่ได้รับอนุญาตอีกต่อไป

การแกะ iterable ทั่วไปใน yield และ return statements ไม่จำเป็นต้องมีวงเล็บล้อมรอบอีกต่อไป

เมื่อขาด comma ในโค้ดเช่น [(10, 20) (30, 40)] คอมไพเลอร์จะแสดง SyntaxWarning พร้อมคำแนะนำที่เป็นประโยชน์

การดำเนินการทางคณิตศาสตร์ระหว่าง subclasses ของ datetime.date หรือ datetime.datetime กับอ็อบเจ็กต์ datetime.timedelta ขณะนี้ส่งคืนอินสแตนซ์ของ subclass แทนที่จะเป็นคลาสฐาน

เมื่อ Python interpreter ถูกขัดจังหวะด้วย Ctrl-C (SIGINT) และข้อยกเว้น KeyboardInterrupt ที่เกิดขึ้นไม่ถูก catch กระบวนการ Python จะออกผ่านสัญญาณ SIGINT หรือด้วย exit code ที่ถูกต้องเพื่อให้กระบวนการที่เรียกสามารถตรวจจับได้ว่ามันสิ้นสุดลงเนื่องจาก Ctrl-C

รูปแบบการเขียนโปรแกรมขั้นสูงบางอย่างต้องการการอัปเดตอ็อบเจ็กต์ types.CodeType สำหรับฟังก์ชันที่มีอยู่

สำหรับจำนวนเต็ม รูปแบบสามอาร์กิวเมนต์ของฟังก์ชัน pow() ขณะนี้อนุญาตให้ exponent เป็นลบในกรณีที่ base เป็น relatively prime กับ modulus

Dict comprehensions ถูกซิงค์กับ dict literals เพื่อให้ key ถูกคำนวณก่อนและ value ที่สอง

เมธอด object.__reduce__() ขณะนี้สามารถส่งคืน tuple ที่มีสองถึงหกองค์ประกอบ

การเปลี่ยนแปลงในโมดูลบิวต์อิน:

asyncio

asyncio.run() ได้เลื่อนจาก API เบื้องต้นไปเป็น API ที่เสถียร

สมบูรณ์

การรัน python -m asyncio จะเปิด REPL แบบอะซิงโครนัสโดยกำเนิด

ข้อยกเว้น asyncio.CancelledError ขณะนี้สืบทอดจาก BaseException แทน Exception และไม่สืบทอดจาก concurrent.futures.CancelledError อีกต่อไป

สมบูรณ์

เพิ่ม asyncio.Task.get_coro() สำหรับรับ coroutine ที่ถูกล้อมรับภายใน asyncio.Task

ขณะนี้งาน Asyncio สามารถตั้งชื่อได้ ไม่ว่าจะผ่านการส่ง keyword argument name ไปยัง asyncio.create_task() หรือเมธอด event loop create_task() หรือโดยการเรียกเมธอด set_name() บนอ็อบเจ็กต์งาน

เพิ่มการรองรับ Happy Eyeballs ให้กับ asyncio.loop.create_connection() เพื่อระบุพฤติกรรม ได้เพิ่มพารามิเตอร์ใหม่สองตัว: happy_eyeballs_delay และ interleave

gc

get_objects() ขณะนี้สามารถรับพารามิเตอร์ generation ที่เป็นตัวเลือกเพื่อระบุ generation ที่จะรับอ็อบเจ็กต์ (แต่โปรดทราบว่าแม้ว่า gc เป็นบิวต์อิน get_objects() ไม่ได้ถูกนำไปใช้งานสำหรับ MicroPython)

math

เพิ่มฟังก์ชันใหม่ math.dist() สำหรับคำนวณระยะทาง Euclidean ระหว่างจุดสองจุด

ขยายฟังก์ชัน math.hypot() ให้รองรับหลายมิติ

เพิ่มฟังก์ชันใหม่ math.prod() เป็นฟังก์ชันที่คล้ายกับ sum() ที่ส่งคืนผลคูณของค่า "start" (ค่าเริ่มต้น: 1) คูณกับ iterable ของตัวเลข

เพิ่มฟังก์ชัน combinatoric ใหม่สองตัว math.perm() และ math.comb()

เพิ่มฟังก์ชันใหม่ math.isqrt() สำหรับคำนวณรากที่สองของจำนวนเต็มที่แม่นยำโดยไม่ต้องแปลงเป็น floating point

ฟังก์ชัน math.factorial() ไม่รับอาร์กิวเมนต์ที่ไม่ใช่ int-like อีกต่อไป

สมบูรณ์

sys

เพิ่มฟังก์ชัน sys.unraisablehook() ใหม่ที่สามารถ override ได้เพื่อควบคุมวิธีจัดการกับ "unraisable exceptions"