Python 3.10

Python 3.10.0 (รุ่นสมบูรณ์) เผยแพร่เมื่อวันที่ 4 ตุลาคม 2021 ลักษณะเด่นของ 3.10 ถูกกำหนดไว้ใน PEP 619 และคำอธิบายโดยละเอียดของการเปลี่ยนแปลงสามารถดูได้ที่ What's New in Python 3.10

ลักษณะไวยากรณ์ใหม่

สถานะ

PEP 634

การจับคู่รูปแบบโครงสร้าง: ข้อกำหนด

[1]

PEP 635

การจับคู่รูปแบบโครงสร้าง: แรงจูงใจและเหตุผล

[1]

PEP 636

การจับคู่รูปแบบโครงสร้าง: บทช่วยสอน

[1]

bpo-12782

ตัวจัดการบริบทแบบมีวงเล็บได้รับอนุญาตอย่างเป็นทางการแล้ว

ลักษณะใหม่ในไลบรารีมาตรฐาน

PEP 618

เพิ่มการตรวจสอบความยาวแบบเลือกใช้ใน zip

การปรับปรุงตัวแปลภาษา

PEP 626

หมายเลขบรรทัดที่แม่นยำสำหรับการดีบักและเครื่องมืออื่น ๆ

ลักษณะการกำหนดชนิดข้อมูลใหม่

PEP 604

อนุญาตให้เขียนชนิดรวม (union type) เป็น X | Y

PEP 613

นามแฝงชนิดข้อมูลแบบชัดเจน

PEP 612

ตัวแปรข้อกำหนดพารามิเตอร์

การเลิกใช้งาน การลบออก หรือข้อจำกัดที่สำคัญ

PEP 644

กำหนดให้ใช้ OpenSSL 1.1.1 หรือใหม่กว่า

PEP 632

เลิกใช้งานโมดูล distutils

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

PEP 623

เลิกใช้งานและเตรียมลบสมาชิก wstr ใน PyUnicodeObject

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

PEP 624

ลบ Py_UNICODE encoder APIs

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

PEP 597

เพิ่ม EncodingWarning แบบเลือกใช้

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

ชนิด int มีเมธอดใหม่ int.bit_count() สำหรับคืนค่าจำนวนบิตที่เป็น 1 ในการแสดงผลเลขฐานสองของจำนวนเต็มที่กำหนด ซึ่งรู้จักกันในชื่อ population count

วิวที่ส่งคืนโดย dict.keys(), dict.values() และ dict.items() ในขณะนี้ล้วนมีแอตทริบิวต์ mapping ที่ให้อ็อบเจกต์ types.MappingProxyType ครอบพจนานุกรมต้นฉบับ

PEP 618: ฟังก์ชัน zip() มีแฟล็ก strict แบบเลือกใช้แล้ว ซึ่งใช้เพื่อกำหนดให้ iterable ทั้งหมดมีความยาวเท่ากัน

ฟังก์ชัน built-in และฟังก์ชันส่วนขยายที่รับอาร์กิวเมนต์จำนวนเต็มจะไม่รับ Decimals, Fractions และอ็อบเจกต์อื่น ๆ ที่แปลงเป็นจำนวนเต็มได้เฉพาะกับการสูญเสียข้อมูล (เช่น มีเมธอด __int__() แต่ไม่มีเมธอด __index__()) อีกต่อไป

หาก object.__ipow__() คืนค่า NotImplemented ตัวดำเนินการจะสำรองไปยัง object.__pow__() และ object.__rpow__() อย่างถูกต้องตามที่คาดไว้

ขณะนี้นิพจน์การกำหนดค่าสามารถใช้โดยไม่มีวงเล็บภายในลิเทอรัลเซตและ set comprehension รวมถึงในดัชนีลำดับ (แต่ไม่ใช่ slice)

ฟังก์ชันมีแอตทริบิวต์ __builtins__ ใหม่ที่ใช้ค้นหาสัญลักษณ์ built-in เมื่อฟังก์ชันถูกเรียกใช้ แทนการค้นหาใน __globals__['__builtins__'] แอตทริบิวต์นี้ถูกกำหนดค่าเริ่มต้นจาก __globals__["__builtins__"] หากมีอยู่ ไม่เช่นนั้นจะกำหนดจาก built-ins ปัจจุบัน

ฟังก์ชัน built-in ใหม่สองตัว -- aiter() และ anext() ถูกเพิ่มเข้ามาเพื่อให้เป็นคู่ asynchronous ของ iter() และ next() ตามลำดับ

เมธอดแบบสแตติก (@staticmethod) และเมธอดแบบคลาส (@classmethod) ในขณะนี้สืบทอดแอตทริบิวต์เมธอด (__module__, __name__, __qualname__, __doc__, __annotations__) และมีแอตทริบิวต์ __wrapped__ ใหม่ ยิ่งกว่านั้น เมธอดแบบสแตติกสามารถเรียกใช้เป็นฟังก์ชันธรรมดาได้แล้ว

Annotations สำหรับเป้าหมายที่ซับซ้อน (ทุกอย่างนอกจากเป้าหมาย simple name ที่กำหนดโดย PEP 526) จะไม่ก่อให้เกิดผลข้างเคียงในรันไทม์กับ from __future__ import annotations อีกต่อไป

อ็อบเจกต์คลาสและโมดูลตอนนี้สร้าง dict ของ annotations ว่างเปล่าแบบ lazy เมื่อต้องการ dict ของ annotations จะถูกจัดเก็บใน __dict__ ของอ็อบเจกต์เพื่อความเข้ากันได้กับรุ่นก่อนหน้า ซึ่งช่วยปรับปรุงแนวปฏิบัติที่ดีในการทำงานกับ __annotations__

Annotations ที่ประกอบด้วย yield, yield from, await หรือนิพจน์ที่มีชื่อถูกห้ามภายใต้ from __future__ import annotations เนื่องจากผลข้างเคียง

การใช้ตัวแปรที่ไม่ถูกผูกค่า, super() และนิพจน์อื่น ๆ ที่อาจเปลี่ยนแปลงการประมวลผลของตารางสัญลักษณ์เป็น annotations จะไม่มีผลใด ๆ ภายใต้ from __future__ import annotations

แฮชของค่า NaN ทั้งชนิด float และชนิด decimal.Decimal ขณะนี้ขึ้นอยู่กับตัวตนของอ็อบเจกต์ ก่อนหน้านี้ค่าแฮชจะเป็น 0 เสมอแม้ว่าค่า NaN จะไม่เท่ากันซึ่งกันและกัน ซึ่งทำให้เกิดพฤติกรรมรันไทม์แบบยกกำลังสองที่อาจเกิดขึ้นเนื่องจากการชนกันของแฮชมากเกินไปเมื่อสร้างพจนานุกรมและเซตที่มี NaN หลายค่า

จะเกิด SyntaxError (แทน NameError) เมื่อลบค่าคงที่ __debug__

ข้อยกเว้น SyntaxError ในขณะนี้มีแอตทริบิวต์ end_lineno และ end_offset ค่าเหล่านี้จะเป็น None หากไม่สามารถระบุได้

การเปลี่ยนแปลงในโมดูล built-in:

asyncio

เพิ่มเมธอด connect_accepted_socket() ที่ขาดหายไป

array

เมธอด index() ของ array.array ในขณะนี้มีพารามิเตอร์ start และ stop แบบเลือกใช้

gc

เพิ่ม audit hooks สำหรับ gc.get_objects(), gc.get_referrers() และ gc.get_referents()

hashlib

โมดูล hashlib ต้องการ OpenSSL 1.1.1 หรือใหม่กว่า

โมดูล hashlib มีการรองรับเบื้องต้นสำหรับ OpenSSL 3.0.0

การสำรองแบบ pure-Python ของ pbkdf2_hmac() ถูกเลิกใช้งานแล้ว ในอนาคต PBKDF2-HMAC จะใช้ได้เฉพาะเมื่อ Python ถูกสร้างด้วยการรองรับ OpenSSL

os

เพิ่มการรองรับ os.cpu_count() สำหรับ VxWorks RTOS

เพิ่มฟังก์ชันใหม่ os.eventfd() และตัวช่วยที่เกี่ยวข้องเพื่อครอบ syscall eventfd2 บน Linux

เพิ่ม os.splice() ที่อนุญาตให้ย้ายข้อมูลระหว่าง file descriptor สองตัวโดยไม่ต้องคัดลอกระหว่างพื้นที่ address space ของเคอร์เนลและผู้ใช้ โดยที่ file descriptor ตัวใดตัวหนึ่งต้องอ้างอิงถึง pipe

เพิ่ม O_EVTONLY, O_FSYNC, O_SYMLINK และ O_NOFOLLOW_ANY สำหรับ macOS

platform

เพิ่ม platform.freedesktop_os_release() เพื่อดึงข้อมูลการระบุระบบปฏิบัติการจากไฟล์มาตรฐาน freedesktop.org os-release

socket

ข้อยกเว้น socket.timeout ตอนนี้เป็นนามแฝงของ TimeoutError

เพิ่มตัวเลือกในการสร้าง MPTCP sockets ด้วย IPPROTO_MPTCP

เพิ่มตัวเลือก IP_RECVTOS เพื่อรับชนิดของบริการ (ToS) หรือฟิลด์ DSCP/ECN

ssl

โมดูล ssl ต้องการ OpenSSL 1.1.1 หรือใหม่กว่า

โมดูล ssl มีการรองรับเบื้องต้นสำหรับ OpenSSL 3.0.0 และตัวเลือกใหม่ OP_IGNORE_UNEXPECTED_EOF

ฟังก์ชันที่เลิกใช้และการใช้ค่าคงที่ที่เลิกใช้แล้วจะส่งผล DeprecationWarning ในขณะนี้ ssl.SSLContext.options มีการตั้งค่า OP_NO_SSLv2 และ OP_NO_SSLv3 เป็นค่าเริ่มต้น จึงไม่สามารถแจ้งเตือนเมื่อตั้งค่าแฟล็กซ้ำ

โมดูล ssl ตอนนี้มีการตั้งค่าความปลอดภัยเริ่มต้นที่เข้มงวดยิ่งขึ้น cipher ที่ไม่มี forward secrecy หรือ SHA-1 MAC ถูกปิดใช้งานโดยค่าเริ่มต้น ระดับความปลอดภัย 2 ห้ามคีย์ RSA, DH และ ECC ที่อ่อนแอที่มีความปลอดภัยน้อยกว่า 112 บิต SSLContext ค่าเริ่มต้นเป็นโปรโตคอลขั้นต่ำ TLS 1.2 การตั้งค่าอ้างอิงจากงานวิจัยของ Hynek Schlawack

โปรโตคอลที่เลิกใช้งานแล้ว SSL 3.0, TLS 1.0 และ TLS 1.1 ไม่ได้รับการรองรับอย่างเป็นทางการอีกต่อไป Python ไม่ได้บล็อกโปรโตคอลเหล่านี้อย่างจริงจัง อย่างไรก็ตาม ตัวเลือก build ของ OpenSSL การกำหนดค่า distro แพตช์ของผู้จำหน่าย และชุด cipher อาจป้องกันการ handshake ที่สำเร็จ

เพิ่มพารามิเตอร์ timeout ให้กับฟังก์ชัน ssl.get_server_certificate()

โมดูล ssl ใช้ heap-types และการเริ่มต้นแบบหลายขั้นตอน

แฟล็กการตรวจสอบใหม่ VERIFY_X509_PARTIAL_CHAIN ถูกเพิ่มเข้ามา

sys

เพิ่มแอตทริบิวต์ sys.orig_argv: รายการอาร์กิวเมนต์บรรทัดคำสั่งต้นฉบับที่ส่งให้กับ Python executable

เพิ่ม sys.stdlib_module_names ซึ่งประกอบด้วยรายการชื่อโมดูลในไลบรารีมาตรฐาน

_thread

_thread.interrupt_main() ตอนนี้รับหมายเลขสัญญาณเลือกใช้สำหรับจำลอง (ค่าเริ่มต้นยังคงเป็น signal.SIGINT)

หมายเหตุ