หลังจากหนึ่งปีของการพัฒนา ภาษาการเขียนโปรแกรม Python 3.12 รุ่นสำคัญก็ได้รับการเผยแพร่ สาขาใหม่จะได้รับการสนับสนุนเป็นเวลาหนึ่งปีครึ่ง หลังจากนั้นอีกสามปีครึ่ง จะมีการสร้างการแก้ไขเพื่อขจัดช่องโหว่
ในเวลาเดียวกัน การทดสอบอัลฟ่าของสาขา Python 3.13 ได้เริ่มต้นขึ้น ซึ่งแนะนำโหมดการสร้าง CPython โดยไม่มีการล็อคล่ามส่วนกลาง (GIL, Global Interpreter Lock) สาขา Python 3.13 จะเป็นรุ่นอัลฟ่าเป็นเวลาเจ็ดเดือน ในระหว่างนั้นจะมีการเพิ่มคุณสมบัติใหม่และแก้ไขข้อบกพร่อง (ตามกำหนดการพัฒนาใหม่ การทำงานในสาขาใหม่จะเริ่มต้นห้าเดือนก่อนการเปิดตัวสาขาก่อนหน้าและภายใน เวลาของการเปิดตัวครั้งต่อไปจะถึงขั้นตอนการทดสอบอัลฟ่า) หลังจากนี้ เวอร์ชันเบต้าจะได้รับการทดสอบเป็นเวลาสามเดือน ในระหว่างนี้จะมีการห้ามการเพิ่มคุณสมบัติใหม่ๆ และเราจะให้ความสนใจทั้งหมดเพื่อแก้ไขข้อบกพร่อง ในช่วงสองเดือนที่ผ่านมาก่อนการเปิดตัว สาขาจะอยู่ในขั้นตอนการเปิดตัวซึ่งจะดำเนินการรักษาเสถียรภาพขั้นสุดท้าย
สิ่งที่เพิ่มเติมใหม่ใน Python 3.12 ได้แก่:
- ความยืดหยุ่นในการแยกวิเคราะห์ f-strings (ตัวอักษรที่จัดรูปแบบด้วยคำนำหน้า 'f') เพิ่มขึ้น ช่วยให้เรากำจัดข้อจำกัดมากมายได้ ตัวอย่างเช่น f-strings สามารถมีนิพจน์ที่ถูกต้องของ Python ได้แล้ว รวมถึงนิพจน์หลายบรรทัด ความคิดเห็น แบ็กสแลช และลำดับหลีก Unicode นอกจากนี้ สตริงด้านในยังอนุญาตให้ใช้เครื่องหมายคำพูดเดิมซ้ำเป็น f-string ล้อมรอบได้ (นั่นคือ สามารถใช้เครื่องหมายคำพูดคู่ภายในได้โดยไม่ต้องสลับไปใช้เครื่องหมายคำพูดเดี่ยว) เนื้อหาข้อมูลของข้อความแสดงข้อผิดพลาดใน f-lines เพิ่มขึ้น ซึ่งขณะนี้ระบุตำแหน่งที่แน่นอนในบรรทัดที่ทำให้เกิดข้อผิดพลาดแล้ว
ตัวอย่างเช่น ใน Python 3.12 อนุญาตให้ใช้โครงสร้างต่อไปนี้: print(f"นี่คือเพลย์ลิสต์: {"\n".join(songs)}") print(f"นี่คือเพลย์ลิสต์: {"\N{BLACK HEART SUIT}". join(songs)}") print(f"นี่คือเพลย์ลิสต์: {", ".join([ … 'Take me back to Eden', # ฉัน ของฉัน ดวงตาเหล่านั้นเหมือนไฟ … 'อัลคาไลน์' , # ไม่เป็นกรดหรือด่าง … 'Ascensionism' # ไปสู่ท้องฟ้าที่แตกสลายในที่สุด … ])}")
- เพื่อเพิ่มประสิทธิภาพการใช้ทรัพยากรบนระบบมัลติคอร์ จึงมีการนำการสนับสนุนล่ามย่อยแบบแยกและการล็อคโกลบอลแยกกัน (GIL, Global Interpreter Lock) สำหรับล่ามที่แตกต่างกันภายในกระบวนการ (CPython อนุญาตให้คุณเรียกใช้ล่ามหลายตัวพร้อมกันใน กระบวนการหนึ่ง) ในรูปแบบปัจจุบัน คุณลักษณะนี้มีให้บริการผ่าน C-API เท่านั้น (การสนับสนุน Python API จะปรากฏในสาขาสำคัญถัดไป)
- เพิ่มความสามารถในการใช้โปรโตคอลบัฟเฟอร์ลงในโค้ด Python แล้ว คลาสที่มีเมธอด "__buffer__()" สามารถใช้เป็นประเภทที่ดำเนินการกับข้อมูลไบนารี่ในหน่วยความจำได้โดยตรง
- โมดูล sys.monitoring ได้รับการเสนอสำหรับการดีบักและการทำโปรไฟล์ ซึ่งช่วยให้คุณตรวจสอบเหตุการณ์ใน CPython เช่น การเรียกใช้ การส่งคืนฟังก์ชัน การดำเนินการบรรทัดโค้ดที่กำหนดเอง ข้อยกเว้นและการเปลี่ยนโดยมีค่าใช้จ่ายน้อยที่สุด
- ตัวแปลภาษาจะให้การสนับสนุนสำหรับระบบย่อยเคอร์เนล Linux perf เป็นเครื่องมือที่ช่วยให้คุณระบุชื่อของฟังก์ชัน Python เมื่อทำการวิเคราะห์ประสิทธิภาพโดยใช้ยูทิลิตี้ perf (ก่อนหน้านี้ สามารถระบุได้เฉพาะชื่อของฟังก์ชัน C ในการติดตามเท่านั้น)
- เนื้อหาข้อมูลของข้อความแสดงข้อผิดพลาดได้รับการเพิ่มขึ้น และขอบเขตของข้อยกเว้นได้ขยายออกไป โดยเสนอคำแนะนำในการขจัดการพิมพ์ผิด ตัวอย่างเช่น คำแนะนำสำหรับการนำเข้าโมดูลที่ถูกลืมของไลบรารีมาตรฐานจะแสดงขึ้น และคำแนะนำในการเพิ่มคำนำหน้า "self" จะปรากฏขึ้น ในวิธีการต่างๆ การเขียน "import x from y" ถูกกำหนดแทน "from y import x" เป็นต้น sys.version_info NameError: ชื่อ 'sys' ไม่ได้ถูกกำหนดไว้ คุณลืมนำเข้า 'sys' หรือไม่? somethin = blech NameError: ไม่ได้กำหนดชื่อ 'blech' คุณหมายถึง: 'self.blech'? import ayz จาก byz SyntaxError: คุณหมายถึงใช้ 'จาก … นำเข้า …' แทนหรือไม่ จากคอลเลกชันนำเข้า chainmap ImportError: ไม่สามารถนำเข้าชื่อ 'chainmap' จาก 'collections' คุณหมายถึง: 'ChainMap'?
- ทำงานอย่างต่อเนื่องเพื่อเพิ่มประสิทธิภาพการทำงาน ประสิทธิภาพโดยรวมที่เพิ่มขึ้นอันเป็นผลมาจากการเพิ่มประสิทธิภาพที่เพิ่มเข้ามานั้นประมาณไว้ที่ 5%
- มีการเพิ่มการสนับสนุนการทดลองสำหรับเครื่องมือเพิ่มประสิทธิภาพไบนารี BOLT ในกระบวนการสร้าง ซึ่งเพิ่มประสิทธิภาพได้ 1-5%
- การใช้งานการรวมรายการแบบอินไลน์ (ความเข้าใจ) ได้ถูกนำมาใช้ ซึ่งช่วยเร่งการทำงานกับการรวมรายการได้ถึงสองเท่า (สำหรับโค้ดที่ใช้การรวมรายการอย่างแข็งขัน การทดสอบพบว่าประสิทธิภาพโดยรวมเพิ่มขึ้น 11%)
- ขนาดของวัตถุ Unicode ลดลง 8-16 ไบต์
- การดำเนินการกับนิพจน์ทั่วไป re.sub(), re.subn() และ re.Pattern ได้รับการเร่งให้เร็วขึ้น
- การดำเนินการตรวจสอบ isinstance() สำหรับบางโปรโตคอลได้รับการเร่งจาก 2 เป็น 20 ครั้ง
- ประสิทธิภาพของแพ็คเกจ asyncio ได้รับการปรับปรุงอย่างมีนัยสำคัญ (การทดสอบบางอย่างแสดงการเร่งความเร็ว 75%)
- การสร้างคลาส asyncio.Task ได้รับการเร่งแล้ว
- อย่างมีนัยสำคัญ (ในการทดสอบบางอย่างถึง 64%) ฟังก์ชัน tokenize.tokenize() และ tokenize.generate_tokens() ได้รับการเร่งอย่างมีนัยสำคัญ
- การโหลดแอตทริบิวต์และการเรียกใช้เมธอด super() ได้รับการเร่งความเร็วแล้ว
- มีการเสนอไวยากรณ์คำอธิบายประกอบชนิดใหม่ที่กะทัดรัดยิ่งขึ้นสำหรับคลาสและฟังก์ชันทั่วไป def สูงสุด [T] (args: Iterable [T]) -> T: ... รายการคลาส [T]: def __getitem__ (ตนเอง, ดัชนี: int, /) -> T: ... def ผนวก (ตนเอง, องค์ประกอบ : T) - >ไม่มี: ...
- ให้วิธีใหม่ในการกำหนดนามแฝงประเภทโดยใช้นิพจน์ "ประเภท" ประเภท Point = tuple[float, float] ประเภท Point[T] = tuple[T, T]
- มีการเพิ่ม @override มัณฑนากรใหม่ลงในโมดูลการพิมพ์เพื่อแจ้งให้ระบบการตรวจสอบประเภททราบว่าวิธีการในคลาสย่อยมีจุดประสงค์เพื่อแทนที่วิธีการหรือคุณลักษณะในซูเปอร์คลาส มัณฑนากรสามารถใช้เพื่อตรวจจับข้อผิดพลาดที่เกิดจากวิธีการที่ตั้งใจจะแทนที่โดยไม่ดำเนินการใดๆ class Base: def log_status(self) -> ไม่มี: … class Sub(Base): @override def log_status(self) -> None: # ตกลง แทนที่ Base.log_status … @override def เสร็จแล้ว (self) -> ไม่มี: # ระบบตรวจสอบประเภทจะตรวจจับข้อผิดพลาด...
- เพื่อเพิ่มความปลอดภัย การใช้งานในตัวของอัลกอริธึม SHA1, SHA3, SHA2-384, SHA2-512 และ MD5 ใน hashlib ได้ถูกแทนที่ด้วยตัวเลือกที่ได้รับการตรวจสอบอย่างเป็นทางการจากโครงการ HACL* (การใช้งานในตัวจะใช้เท่านั้น หากไม่มี OpenSSL)
- Python มีการป้องกันสแต็กล้น
- คลาส pathlib.Path รองรับคลาสย่อย
- โมดูลระบบปฏิบัติการได้ขยายการรองรับแพลตฟอร์มแล้ว Windowsตัวอย่างเช่น เมื่อทำงานใน Windows เพิ่มการรองรับสำหรับเมธอด os.listdrives(), os.listvolumes() และ os.listmounts() และปรับปรุงความแม่นยำของ os.stat() และ os.lstat()
- เพิ่มอินเทอร์เฟซบรรทัดคำสั่งให้กับโมดูล sqlite3 และ uuid (“python -m sqlite3” และ “python -m uuid”)
- C-API ได้เพิ่มการสนับสนุนสำหรับวัตถุ "อมตะ" ซึ่งไม่ได้ใช้การนับอ้างอิง
- แนวคิดของระดับ C API ที่ไม่เสถียรได้ถูกนำไปใช้แล้ว โดยมีจุดประสงค์เพื่อใช้ในดีบักเกอร์ คอมไพเลอร์ JIT และเครื่องมือระดับต่ำอื่นๆ
- ทำความสะอาดคุณสมบัติที่ล้าสมัย
- โมดูล asynchat, asyncore, smtpd, imp และ distutils ได้ถูกลบออกแล้ว (สามารถใช้โมดูล distutils จากแพ็คเกจ setuptools)
- คุณสมบัติ wstr และ wstr_length ถูกลบออกจากการใช้งาน C ของอ็อบเจ็กต์ Unicode
- ลบวิธีการที่เลิกใช้แล้วในโมดูล unittest
- ลบฟังก์ชัน คลาส และเมธอดที่ล้าสมัยหรือไม่สามารถใช้งานได้แล้ว รวมถึง locale.format() และ io.OpenWrapper ด้วย SSL.RAND_pseudo_bytes(), ElementTree.Element.copy(), hashlib.pbkdf2_hmac(), gzip.GzipFile, เป็นต้น
- โมดูลเว็บเบราว์เซอร์ไม่รองรับเบราว์เซอร์รุ่นเก่าอีกต่อไป รวมถึง Grail, Mosaic, Netscape, Galeon, Skipstone, Iceape, Firebird และ Firefox จนถึงเวอร์ชัน 36
- เพื่อเตรียมพร้อมสำหรับการปรับให้เหมาะสมในอนาคต การแสดงจำนวนเต็มภายในมีการเปลี่ยนแปลง
ที่มา: opennet.ru
