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

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

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

ในหมู่ เพิ่ม นวัตกรรม ในหลาม 3.9:

  • ในพจนานุกรมที่กำหนดโดยใช้คลาส dict ในตัว ปรากฏ รองรับตัวดำเนินการผสาน '|' และการอัปเดต "|=" ซึ่งเสริมวิธีการ {**d1, **d2} และ dict.update ที่เสนอไว้ก่อนหน้านี้สำหรับการรวมพจนานุกรม

    >>> x = {"key1": "value1 จาก x", "key2": "value2 จาก x"}
    >>> y = {"key2": "value2 จาก y", "key3": "value3 จาก y"}

    >>> x | ย
    {'key1': 'value1 จาก x', 'key2': 'value2 จาก y', 'key3': 'value3 จาก y'}

    >>> ย | x
    {'key2': 'value2 จาก x', 'key3': 'value3 จาก y', 'key1': 'value1 จาก x'}

  • คอลเลกชันประเภทที่มีอยู่แล้วภายในประกอบด้วยรายการ dict และ tuple ซึ่งสามารถใช้เป็นประเภทพื้นฐานโดยไม่ต้องนำเข้าจากโมดูลการพิมพ์ เหล่านั้น. แทนที่จะพิมพ์.รายการ, พิมพ์.Dict และพิมพ์.Tuple ตอนนี้คุณสามารถระบุได้
    เพียงรายการ dict และ tuple:

    def wait_all (ชื่อ: รายการ [str]) -> ไม่มี:
    สำหรับชื่อในชื่อ:
    พิมพ์ ("สวัสดี" ชื่อ)

  • ถูกจัดหา เครื่องมือที่ยืดหยุ่นสำหรับใส่คำอธิบายประกอบฟังก์ชันและตัวแปร สำหรับการแนบคำอธิบายประกอบ จะมีการเพิ่มประเภทคำอธิบายประกอบใหม่ลงในโมดูลการพิมพ์ ซึ่งขยายประเภทที่มีอยู่ด้วยข้อมูลเมตาเพิ่มเติมที่สามารถใช้สำหรับการวิเคราะห์แบบคงที่หรือสำหรับการเพิ่มประสิทธิภาพรันไทม์ หากต้องการเข้าถึงข้อมูลเมตาจากโค้ด พารามิเตอร์ include_extras ได้ถูกเพิ่มลงในเมธอดการพิมพ์ get_type_hints()

    charType = คำอธิบายประกอบ [int, ctype ("char")] UnsignedShort = คำอธิบายประกอบ [int, struct2.ctype ('H')]

  • ลดสีลง ข้อกำหนดทางไวยากรณ์สำหรับนักตกแต่ง - สำนวนใดๆ ที่เหมาะสมสำหรับใช้ในบล็อก if และ while ตอนนี้สามารถใช้เป็นมัณฑนากรได้ การเปลี่ยนแปลงนี้ปรับปรุงความสามารถในการอ่านโค้ด PyQt5 ได้อย่างมาก และทำให้การบำรุงรักษาโมดูลนี้ง่ายขึ้น:

    มันเป็น:
    button_0 = ปุ่ม[0] @button_0.clicked.connect

    ตอนนี้คุณสามารถเขียน:
    @buttons[0].คลิก.เชื่อมต่อ

  • ไปยังห้องสมุดมาตรฐาน เพิ่ม โมดูล โซนอินโฟซึ่งรวมถึงข้อมูลจากฐานข้อมูลโซนเวลา IANA

    >>> จากการนำเข้า Zoneinfo ZoneInfo
    >>> จาก datetime นำเข้า datetime, timedelta
    >>> #ช่วงฤดูร้อน
    >>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("อเมริกา/ลอส_แองเจลิส"))
    >>> พิมพ์(dt)
    2020-10-31 12:00:00-07:00

    >>> dt.tzname()
    'พีดีที'

    >>> #เวลามาตรฐาน
    >>> dt += เดลต้าเวลา(วัน=7)
    >>> พิมพ์(dt)
    2020-11-07 12:00:00-08:00

    >>> พิมพ์(dt.tzname())
    PST

  • เพิ่มโมดูล Graphlib ซึ่งในนั้น นำไปใช้ รองรับการเรียงลำดับโทโพโลยีของกราฟ
  • เสนอ วิธีการใหม่ในการลบคำนำหน้าและการลงท้ายบรรทัด - str.removeprefix(คำนำหน้า) และ str.removesuffix(คำต่อท้าย) มีการเพิ่มวิธีการให้กับวัตถุ str, bytes, bytearray และ collections.UserString

    >>> s = "ฟูบาร์"
    >>> s.removeprefix("ฟู")
    'บาร์'

  • ที่เกี่ยวข้อง ตัวแยกวิเคราะห์ใหม่ PEG (Parsing Expression Grammar) ซึ่งเข้ามาแทนที่พาร์เซอร์ LL(1). การใช้ parser ใหม่ทำให้สามารถกำจัด “แฮ็ก” บางส่วนที่ใช้เพื่อหลีกเลี่ยงข้อจำกัดใน LL(1) ได้ และลดต้นทุนค่าแรงในการบำรุงรักษา parser ลงอย่างมาก ในแง่ของประสิทธิภาพ parser ใหม่นั้นอยู่ในระดับเดียวกับรุ่นก่อนหน้าโดยประมาณ แต่เหนือกว่าอย่างมากในแง่ของความยืดหยุ่น ซึ่งช่วยให้คุณรู้สึกอิสระมากขึ้นเมื่อออกแบบคุณสมบัติภาษาใหม่ รหัส parser เก่ายังคงอยู่ในขณะนี้และสามารถส่งคืนได้โดยใช้แฟล็ก "-X oldparser" หรือตัวแปรสภาพแวดล้อม "PYTHONOLDPARSER=1" แต่จะถูกลบออกในรีลีส 3.10
  • ที่ให้ไว้ ความสามารถสำหรับวิธีการขยาย C ในการเข้าถึงสถานะของโมดูลที่ถูกกำหนดโดยใช้การอ้างอิงตัวชี้โดยตรงแทนการค้นหาสถานะของโมดูลโดยใช้ฟังก์ชัน PyState_FindModule การเปลี่ยนแปลงนี้ช่วยให้คุณสามารถเพิ่มประสิทธิภาพของโมดูล C ได้โดยการลดหรือขจัดค่าใช้จ่ายในการตรวจสอบสถานะของโมดูลโดยสิ้นเชิง ในการเชื่อมโยงโมดูลกับคลาส มีการเสนอฟังก์ชัน C PyType_FromModuleAndSpec() เพื่อรับโมดูลและสถานะของโมดูล จึงเสนอฟังก์ชัน C PyType_GetModule() และ PyType_GetModuleState() และเพื่อให้วิธีการเข้าถึงคลาส ซึ่งมีการกำหนดไว้ มีการเสนอฟังก์ชัน C-function PyCMethod และธง METH_METHOD
  • คนเก็บขยะ ส่ง จากการล็อกคอลเลกชั่นที่มีวัตถุที่สร้างชีวิตใหม่ซึ่งยังคงสามารถเข้าถึงได้จากภายนอกหลังจากที่ Finalizer ทำงาน
  • เพิ่มวิธีการ os.pidfd_openซึ่งอนุญาตให้ใช้ระบบย่อยเคอร์เนล Linux "pidfd" เพื่อจัดการกับสถานการณ์การนำ PID มาใช้ซ้ำ (pidfd เชื่อมโยงกับกระบวนการเฉพาะและไม่เปลี่ยนแปลง ในขณะที่ PID สามารถเชื่อมโยงกับกระบวนการอื่นได้หลังจากกระบวนการปัจจุบันที่เกี่ยวข้องกับ PID นั้นสิ้นสุดลง ).
  • การสนับสนุนข้อกำหนด Unicode ได้รับการอัพเดตเป็นเวอร์ชัน 13.0.0
  • ตกรอบแล้ว หน่วยความจำรั่ว เมื่อเริ่มต้นล่าม Python ใหม่ในกระบวนการเดียวกัน
  • ประสิทธิภาพของช่วงประเภททูเพิล ชุด ชุดแช่แข็ง รายการ และ dict ได้รับการปรับให้เหมาะสมแล้ว ดำเนินการ ผ่านการใช้โปรโตคอลทางลัด Vectorcall เพื่อการเข้าถึงวัตถุที่เขียนด้วยภาษา C ได้เร็วขึ้น
  • โมดูล _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, ตัวดำเนินการ, ทรัพยากร, เวลา และ _weakref ถูกโหลดจาก การเริ่มต้นในหลายขั้นตอน.
  • โมดูลไลบรารีมาตรฐาน audioop, ast, grp, _hashlib, pwd, _posixsubprocess, สุ่ม, เลือก, struct, termios และ zlib ได้รับการแปลงให้ใช้แบบจำกัด เอบีไอที่มั่นคงซึ่งแก้ปัญหาการทำงานของแอสเซมบลีของโมดูลส่วนขยายสำหรับ Python เวอร์ชันต่างๆ (เมื่ออัปเดตเวอร์ชัน ไม่จำเป็นต้องสร้างโมดูลส่วนขยายขึ้นใหม่ และโมดูลที่คอมไพล์สำหรับ 3.9 จะสามารถทำงานได้ในสาขา 3.10)
  • โมดูล asyncio ได้เลิกรองรับพารามิเตอร์ reuse_address เนื่องจากปัญหาด้านความปลอดภัยที่อาจเกิดขึ้น (การใช้ SO_REUSEADDR สำหรับ UDP บน Linux อนุญาตให้กระบวนการต่างๆ แนบซ็อกเก็ตการฟังเข้ากับพอร์ต UDP)
  • มีการเพิ่มประสิทธิภาพใหม่ เช่น ปรับปรุงประสิทธิภาพของตัวจัดการสัญญาณในแอปพลิเคชันแบบมัลติเธรด ความเร็วที่เพิ่มขึ้นของโมดูลกระบวนการย่อยในสภาพแวดล้อม FreeBSD และการกำหนดตัวแปรชั่วคราวให้เร็วขึ้น (การกำหนดตัวแปรในนิพจน์ “สำหรับ y ใน [expr” ]” มีประสิทธิภาพเทียบเท่ากับนิพจน์ “y = expr” ") โดยทั่วไปแล้วการทดสอบส่วนใหญ่ แสดง ประสิทธิภาพลดลงเมื่อเทียบกับสาขา 3.8 (การเร่งความเร็วจะสังเกตได้ในการทดสอบ write_local และ write_deque เท่านั้น):

    หลามเวอร์ชัน 3.4 3.5 3.6 3.7 3.8 3.9
    ————— — — — — — —

    การเข้าถึงการอ่านตัวแปรและแอตทริบิวต์:
    อ่าน_ท้องถิ่น 7.1 7.1 5.4 5.1 3.9 4.0
    read_nonlocal 7.1 8.1 5.8 5.4 4.4 4.8
    read_global 15.5 19.0 14.3 13.6 7.6 7.7
    read_builtin 21.1 21.6 18.5 19.0 7.5 7.7
    read_classvar_from_คลาส 25.6 26.5 20.7 19.5 18.4 18.6
    read_classvar_from_instance 22.8 23.5 18.8 17.1 16.4 20.1
    read_instancevar 32.4 33.1 28.0 26.3 25.4 27.7
    read_instancevar_slots 27.8 31.3 20.8 20.8 20.2 24.5
    read_namedtuple 73.8 57.5 45.0 46.8 18.4 23.2
    read_boundmethod 37.6 37.9 29.6 26.9 27.7 45.9

    การเข้าถึงการเขียนตัวแปรและแอตทริบิวต์:
    write_local 8.7 9.3 5.5 5.3 4.3 4.2
    write_nonlocal 10.5 11.1 5.6 5.5 4.7 4.9
    write_global 19.7 21.2 18.0 18.0 15.8 17.2
    write_classvar 92.9 96.0 104.6 102.1 39.2 43.2
    write_instancevar 44.6 45.8 40.0 38.9 35.5 40.7
    write_instancevar_slots 35.6 36.1 27.3 26.6 25.7 27.7

    การเข้าถึงการอ่านโครงสร้างข้อมูล:
    อ่าน_รายการ 24.2 24.5 20.8 20.8 19.0 21.1
    read_deque 24.7 25.5 20.2 20.6 19.8 21.6
    read_dict 24.3 25.7 22.3 23.0 21.0 22.5
    อ่าน_strdict 22.6 24.3 19.5 21.2 18.9 21.6

    การเข้าถึงการเขียนโครงสร้างข้อมูล:
    เขียน_รายการ 27.1 28.5 22.5 21.6 20.0 21.6
    write_deque 28.7 30.1 22.7 21.8 23.5 23.2
    write_dict 31.4 33.3 29.3 29.2 24.7 27.8
    write_strdict 28.4 29.9 27.5 25.2 23.1 29.8

    การดำเนินการสแต็ก (หรือคิว):
    list_append_pop 93.4 112.7 75.4 74.2 50.8 53.9
    deque_append_pop 43.5 57.0 49.4 49.2 42.5 45.5
    deque_append_popซ้าย 43.7 57.3 49.7 49.7 42.8 45.5

    วงจรจับเวลา:
    ลูป_โอเวอร์เฮด 0.5 0.6 0.4 0.3 0.3 0.3

  • ลบแล้ว ฟังก์ชันและวิธีการของ Python 2.7 จำนวนมากที่เลิกใช้แล้วก่อนหน้านี้และส่งผลให้เกิด DeprecationWarning ในรีลีสก่อนหน้า รวมถึงเมธอด unescape() ใน html.parser.HTMLParser
    tostring() และ fromstring() ใน array.array, isAlive() ใน threading.Thread, getchildren() และ getiterator() ใน ElementTree, sys.getcheckinterval(), sys.setcheckinterval(), asyncio.Task.current_task(), asyncio.Task.all_tasks(), base64.encodestring() และ base64.decodestring()

ที่มา: opennet.ru

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