การเปิดตัวภาษาการเขียนโปรแกรม Python 3.11

หลังจากหนึ่งปีของการพัฒนา ภาษาการเขียนโปรแกรม Python 3.11 รุ่นสำคัญก็ได้รับการเผยแพร่ สาขาใหม่จะได้รับการสนับสนุนเป็นเวลาหนึ่งปีครึ่ง หลังจากนั้นอีกสามปีครึ่ง จะมีการสร้างการแก้ไขเพื่อขจัดช่องโหว่

ในเวลาเดียวกัน การทดสอบอัลฟ่าของสาขา Python 3.12 ได้เริ่มต้นขึ้น (ตามกำหนดการพัฒนาใหม่ การทำงานในสาขาใหม่จะเริ่มขึ้นห้าเดือนก่อนการเปิดตัวสาขาก่อนหน้า และถึงขั้นตอนการทดสอบอัลฟ่าภายในเวลาของการเปิดตัวครั้งถัดไป ). สาขา Python 3.12 จะเปิดตัวรุ่นอัลฟ่าเป็นเวลาเจ็ดเดือน ในระหว่างนี้จะมีการเพิ่มคุณสมบัติใหม่และแก้ไขข้อบกพร่อง หลังจากนี้ เวอร์ชันเบต้าจะได้รับการทดสอบเป็นเวลาสามเดือน ในระหว่างนี้จะมีการห้ามการเพิ่มคุณสมบัติใหม่ๆ และเราจะให้ความสนใจทั้งหมดเพื่อแก้ไขข้อบกพร่อง ในช่วงสองเดือนที่ผ่านมาก่อนการเปิดตัว สาขาจะอยู่ในขั้นตอนการเปิดตัวซึ่งจะดำเนินการรักษาเสถียรภาพขั้นสุดท้าย

สิ่งที่เพิ่มเติมใหม่ใน Python 3.11 ได้แก่:

  • มีการทำงานที่สำคัญเพื่อเพิ่มประสิทธิภาพการทำงาน สาขาใหม่ประกอบด้วยการเปลี่ยนแปลงที่เกี่ยวข้องกับการเร่งความเร็วและการปรับใช้การเรียกใช้ฟังก์ชันแบบอินไลน์ การใช้ล่ามที่รวดเร็วของการดำเนินการมาตรฐาน (x+x, x*x, xx, a[i], a[i] = z, f(arg) C( arg), o.method(), o.attr = z, *seq) รวมถึงการเพิ่มประสิทธิภาพที่จัดทำโดยโครงการ Cinder และ HotPy ความเร็วในการประมวลผลโค้ดเพิ่มขึ้น 10-60% ขึ้นอยู่กับประเภทของโหลด โดยเฉลี่ยแล้ว ประสิทธิภาพในชุดทดสอบ pyPerformance เพิ่มขึ้น 25%

    กลไกการแคช bytecode ได้รับการออกแบบใหม่ ซึ่งลดเวลาการเริ่มต้นล่ามลง 10-15% ขณะนี้ออบเจ็กต์ที่มีโค้ดและโค้ดไบต์ได้รับการจัดสรรแบบคงที่โดยล่าม ซึ่งทำให้สามารถกำจัดขั้นตอนของการยกเลิกการจัดเรียงโค้ดไบต์ที่แยกออกจากแคชและการแปลงวัตถุด้วยโค้ดที่จะวางในหน่วยความจำแบบไดนามิก

  • เมื่อแสดงการติดตามการโทรในข้อความวินิจฉัย ขณะนี้สามารถแสดงข้อมูลเกี่ยวกับนิพจน์ที่ทำให้เกิดข้อผิดพลาดได้ (ก่อนหน้านี้ เฉพาะบรรทัดเท่านั้นที่ถูกไฮไลต์โดยไม่ระบุรายละเอียดว่าส่วนใดของบรรทัดที่ทำให้เกิดข้อผิดพลาด) ข้อมูลการติดตามเพิ่มเติมสามารถรับได้ผ่าน API และใช้ในการแมปคำสั่งไบต์โค้ดแต่ละรายการกับตำแหน่งเฉพาะในซอร์สโค้ดโดยใช้เมธอด codeobject.co_positions() หรือฟังก์ชัน C API PyCode_Addr2Location() การเปลี่ยนแปลงนี้ช่วยให้แก้ปัญหาได้ง่ายขึ้นมากด้วยออบเจ็กต์พจนานุกรมที่ซ้อนกัน การเรียกใช้ฟังก์ชันหลายรายการ และนิพจน์ทางคณิตศาสตร์ที่ซับซ้อน Traceback (การโทรล่าสุดครั้งล่าสุด): ไฟล์ "calculation.py" บรรทัด 54 ผลลัพธ์ = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: การหารด้วยศูนย์
  • เพิ่มการรองรับกลุ่มข้อยกเว้น ทำให้โปรแกรมสามารถสร้างและประมวลผลข้อยกเว้นต่างๆ หลายรายการได้ในคราวเดียว หากต้องการจัดกลุ่มข้อยกเว้นหลายรายการและรวมเข้าด้วยกัน จึงมีการเสนอประเภทข้อยกเว้นใหม่ ExceptionGroup และ BaseExceptionGroup และเพิ่มนิพจน์ "ยกเว้น*" เพื่อเน้นข้อยกเว้นแต่ละรายการจากกลุ่ม
  • เพิ่มเมธอด add_note() ให้กับคลาส BaseException แล้ว ทำให้คุณสามารถแนบบันทึกย่อข้อความเข้ากับข้อยกเว้นได้ เช่น การเพิ่มข้อมูลบริบทที่ไม่พร้อมใช้งานเมื่อมีการส่งข้อยกเว้น
  • เพิ่มประเภทตนเองพิเศษเพื่อแสดงถึงคลาสส่วนตัวในปัจจุบัน Self สามารถใช้เพื่อใส่คำอธิบายประกอบวิธีการที่ส่งคืนอินสแตนซ์ของคลาสด้วยวิธีที่ง่ายกว่าการใช้ TypeVar คลาส MyLock: def __enter__(self) -> Self: self.lock() กลับตัวเอง
  • เพิ่มประเภท LiteralString พิเศษที่สามารถรวมเฉพาะตัวอักษรสตริงที่เข้ากันได้กับประเภท LiteralString (เช่น สตริงเปล่าและสตริง LiteralString แต่ไม่ใช่สตริง str โดยพลการหรือรวมกัน) ประเภท LiteralString สามารถใช้เพื่อจำกัดการส่งผ่านอาร์กิวเมนต์สตริงไปยังฟังก์ชัน การทดแทนส่วนต่างๆ ของสตริงโดยพลการซึ่งอาจนำไปสู่ช่องโหว่ได้ เช่น เมื่อสร้างสตริงสำหรับการสืบค้น SQL หรือคำสั่งเชลล์ def run_query(sql: LiteralString) -> ... ... def ผู้โทร (arbitrary_string: str, query_string: LiteralString, table_name: LiteralString, ) -> ไม่มี: run_query("SELECT * FROM students") # ok run_query(literal_string) # ok run_query( "SELECT * FROM" + literal_string) # ok run_query(arbitrary_string) # Error run_query( # Error f"SELECT * FROM students WHERE name = {arbitrary_string}" )
  • มีการเพิ่มประเภท TypeVarTuple ทำให้สามารถใช้ตัวแปรทั่วไปได้ ซึ่งแตกต่างจาก TypeVar ซึ่งไม่ครอบคลุมประเภทใดประเภทหนึ่ง แต่ครอบคลุมประเภทตามจำนวนที่กำหนด
  • ไลบรารีมาตรฐานประกอบด้วยโมดูล tomllib พร้อมฟังก์ชันสำหรับแยกวิเคราะห์รูปแบบ TOML
  • คุณสามารถทำเครื่องหมายองค์ประกอบแต่ละส่วนของพจนานุกรมที่พิมพ์ (TypedDict) ด้วยป้ายกำกับ Required และ NotRequired เพื่อกำหนดฟิลด์บังคับและฟิลด์เสริม (โดยค่าเริ่มต้น ฟิลด์ที่ประกาศทั้งหมดจำเป็น หากพารามิเตอร์ทั้งหมดไม่ได้ตั้งค่าเป็น False) คลาสภาพยนตร์ (TypedDict): ชื่อ: str ปี: NotRequired[int] m1: ภาพยนตร์ = {"title": "Black Panther", "ปี": 2018} # ตกลง m2: ภาพยนตร์ = {"title": "Star Wars" } # OK (ระบุฟิลด์ปีหรือไม่ก็ได้) m3: ภาพยนตร์ = {“ปี”: 2022} # เกิดข้อผิดพลาด ไม่ได้กรอกฟิลด์ชื่อเรื่องที่ต้องการ)
  • เพิ่มคลาส TaskGroup ลงในโมดูล asyncio ด้วยการใช้งานตัวจัดการบริบทแบบอะซิงโครนัสที่รอให้กลุ่มงานเสร็จสมบูรณ์ การเพิ่มงานในกลุ่มทำได้โดยใช้เมธอด create_task() async def main(): async กับ asyncio.TaskGroup() as tg: task1 = tg.create_task(some_coro(...)) task2 = tg.create_task(another_coro(...)) print("ทั้งสองงานเสร็จสิ้นแล้วตอนนี้ ")
  • เพิ่ม @dataclass_transform มัณฑนากรสำหรับคลาส เมธอด และฟังก์ชัน เมื่อระบุ ระบบการตรวจสอบประเภทคงที่จะถือว่าอ็อบเจ็กต์ราวกับว่าใช้ @dataclasses.dataclass มัณฑนากร ในตัวอย่างด้านล่าง คลาส CustomerModel เมื่อตรวจสอบประเภท จะถูกประมวลผลคล้ายกับคลาสที่มี @dataclasses.dataclass มัณฑนากร กล่าวคือ ว่ามีเมธอด __init__ ที่ยอมรับตัวแปร id และชื่อ @dataclass_transform() คลาส ModelBase: ... คลาส CustomerModel (ModelBase): id: ชื่อ int: str
  • ในนิพจน์ทั่วไป ความสามารถในการใช้การจัดกลุ่มแบบอะตอมมิก ((?>...)) และปริมาณเชิงครอบครอง (*+, ++, ?+, {m,n}+) ได้ถูกเพิ่มเข้าไปแล้ว
  • เพิ่มตัวเลือกบรรทัดคำสั่ง "-P" และตัวแปรสภาพแวดล้อม PYTHONSAFEPATH เพื่อปิดใช้งานการแนบเส้นทางไฟล์ที่อาจไม่ปลอดภัยโดยอัตโนมัติไปยัง sys.path
  • ยูทิลิตี้ py.exe สำหรับแพลตฟอร์ม Windows ได้รับการปรับปรุงอย่างมีนัยสำคัญ โดยเพิ่มการรองรับไวยากรณ์ “-V:” / " นอกเหนือจาก "- . "
  • มาโครจำนวนมากใน C API จะถูกแปลงเป็นฟังก์ชันอินไลน์แบบปกติหรือแบบคงที่
  • โมดูล uu, cgi, ไปป์, crypt, aifc, chunk, msilib, telnetlib, audioop, nis, sndhdr, imghdr, nntplib, spwd, xdrlib, cgitb, mailcap, ossaudiodev และ sunau โมดูลเลิกใช้แล้วและจะถูกลบออกใน Python 3.13 ปล่อย ลบฟังก์ชัน PyUnicode_Encode* แล้ว

ที่มา: opennet.ru

เพิ่มความคิดเห็น