Python 3.9

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

ฟีเจอร์

สถานะ

PEP 573

การเข้าถึงสถานะโมดูลอย่างรวดเร็วจากเมธอดของประเภท C extension

ไม่เกี่ยวข้อง

PEP 584

เพิ่ม union operators ให้กับ dict

สมบูรณ์ [1]

PEP 585

Type hinting generics ใน standard collections

PEP 593

คำอธิบาย annotation ของฟังก์ชันและตัวแปรแบบยืดหยุ่น

PEP 602

CPython ใช้รอบการเปิดตัวประจำปี แทนที่จะเป็นประจำปี มุ่งหมายให้มีรอบการเปิดตัวสองเดือน

ไม่เกี่ยวข้อง

PEP 614

ผ่อนคลายข้อจำกัดไวยากรณ์สำหรับ decorator

PEP 615

ฐานข้อมูล IANA Time Zone ขณะนี้อยู่ใน standard library ในโมดูล zoneinfo

PEP 616

เมธอด String สำหรับลบ prefix และ suffix

PEP 617

CPython ขณะนี้ใช้ parser ใหม่ที่อิงกับ PEG

ไม่เกี่ยวข้อง

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

__import__() ขณะนี้แสดง ImportError แทน ValueError

สมบูรณ์

Python ขณะนี้รับเส้นทางสัมบูรณ์ของชื่อไฟล์สคริปต์ที่ระบุในบรรทัดคำสั่ง (เช่น: python3 script.py): attribute __file__ ของโมดูล __main__ กลายเป็นเส้นทางสัมบูรณ์แทนที่จะเป็นเส้นทางสัมพัทธ์

ตามค่าเริ่มต้นเพื่อประสิทธิภาพสูงสุด อาร์กิวเมนต์ errors จะถูกตรวจสอบเฉพาะในข้อผิดพลาดการเข้ารหัส/ถอดรหัสครั้งแรก และอาร์กิวเมนต์ encoding บางครั้งจะถูกละเว้นสำหรับสตริงว่าง

"".replace("", s, n) ขณะนี้ส่งคืน s แทนสตริงว่างสำหรับ n ที่ไม่ใช่ศูนย์ทั้งหมด ซึ่งขณะนี้สอดคล้องกับ "".replace("", s)

ขณะนี้นิพจน์ที่ถูกต้องใดๆ สามารถใช้เป็น decorator ได้ ก่อนหน้านี้ไวยากรณ์มีข้อจำกัดมากกว่า

การรัน aclose() / asend() / athrow() แบบขนานกันขณะนี้ถูกห้าม และ ag_running ขณะนี้สะท้อนสถานะการรันจริงของ async generator

ข้อผิดพลาดที่ไม่คาดคิดในการเรียกเมธอด __iter__ ไม่ถูกปิดบังด้วย TypeError ในตัวดำเนินการ in และฟังก์ชัน contains(), indexOf() และ countOf() ของโมดูล operator อีกต่อไป

นิพจน์ lambda ที่ไม่มีวงเล็บไม่สามารถเป็นส่วนนิพจน์ใน clause if ใน comprehensions และ generator expressions อีกต่อไป

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

asyncio

เนื่องจากข้อกังวลด้านความปลอดภัยที่สำคัญ พารามิเตอร์ reuse_address ของ asyncio.loop.create_datagram_endpoint() ไม่ได้รับการรองรับอีกต่อไป

เพิ่ม coroutine ใหม่ shutdown_default_executor() ที่กำหนดการ shutdown สำหรับ default executor ที่รอให้ ThreadPoolExecutor ปิดการทำงาน นอกจากนี้ asyncio.run() ได้รับการอัปเดตให้ใช้ coroutine ใหม่นี้

เพิ่ม asyncio.PidfdChildWatcher ซึ่งเป็นการนำ child watcher เฉพาะ Linux ไปใช้งานที่ poll file descriptors ของกระบวนการ

เพิ่ม coroutine ใหม่ asyncio.to_thread()

เมื่อยกเลิกงานเนื่องจาก timeout asyncio.wait_for() จะรอจนกว่าการยกเลิกจะเสร็จสมบูรณ์ในกรณีที่ timeout <= 0 ด้วย เช่นเดียวกับที่ทำกับ timeout ที่เป็นบวก

asyncio ขณะนี้แสดง TyperError เมื่อเรียกเมธอดที่ไม่เข้ากันกับ socket ssl.SSLSocket

gc

Garbage collection ไม่บล็อกบนอ็อบเจ็กต์ที่ฟื้นคืนชีพ

เพิ่มฟังก์ชันใหม่ gc.is_finalized() เพื่อตรวจสอบว่าอ็อบเจ็กต์ได้รับการ finalized โดย garbage collector แล้วหรือไม่

math

ขยายฟังก์ชัน math.gcd() ให้รองรับหลายอาร์กิวเมนต์ ก่อนหน้านี้รองรับเพียงสองอาร์กิวเมนต์

เพิ่ม math.lcm(): ส่งคืนตัวคูณร่วมน้อยของอาร์กิวเมนต์ที่ระบุ

เพิ่ม math.nextafter(): ส่งคืนค่า floating-point ถัดไปหลังจาก x ในทิศทางของ y

เพิ่ม math.ulp(): ส่งคืนค่าของบิตที่มีนัยสำคัญน้อยที่สุดของ float

os

เปิดเผย os.pidfd_open() และ os.P_PIDFD เฉพาะ Linux

ฟังก์ชัน os.unsetenv() ขณะนี้พร้อมใช้งานบน Windows ด้วย

สมบูรณ์

ฟังก์ชัน os.putenv() และ os.unsetenv() ขณะนี้พร้อมใช้งานเสมอ

สมบูรณ์

เพิ่มฟังก์ชัน os.waitstatus_to_exitcode(): แปลง wait status เป็น exit code

random

เพิ่มเมธอด random.Random.randbytes ใหม่: สร้างไบต์แบบสุ่ม

sys

เพิ่ม attribute ใหม่ sys.platlibdir: ชื่อของไดเรกทอรี library เฉพาะแพลตฟอร์ม

ก่อนหน้านี้ sys.stderr เป็นแบบ block-buffered เมื่อไม่ใช่ interactive ขณะนี้ stderr ค่าเริ่มต้นจะเป็นแบบ line-buffered เสมอ

หมายเหตุ