انتشار زبان برنامه نویسی پایتون 3.9

پس از یک سال توسعه ارایه شده انتشار قابل توجه زبان برنامه نویسی پایتون 3.9. پایتون 3.9 اولین نسخه پس از آن بود انتقال پروژه در چرخه جدید آماده سازی و پشتیبانی از انتشار. نسخه های اصلی جدید اکنون سالی یک بار تولید می شوند و به روز رسانی های اصلاحی هر دو ماه یکبار منتشر می شوند. هر شعبه قابل توجهی به مدت یک سال و نیم پشتیبانی می شود و پس از آن سه سال و نیم دیگر برای رفع آسیب پذیری ها توسعه می یابد.

کار بر روی یک شعبه جدید اکنون پنج ماه قبل از انتشار شعبه بعدی آغاز می شود، یعنی. همزمان با انتشار پایتون 3.9 آغاز شد تست آلفا شاخه پایتون 3.10. شعبه Python 3.10 به مدت هفت ماه در آلفا منتشر خواهد شد و در طی آن ویژگی‌های جدید اضافه شده و باگ‌ها برطرف می‌شوند. پس از این، نسخه‌های بتا به مدت سه ماه تست می‌شوند و در این مدت افزودن ویژگی‌های جدید ممنوع و تمام توجه به رفع باگ‌ها معطوف خواهد شد. دو ماه آخر قبل از انتشار، شعبه در مرحله کاندید آزادی خواهد بود که در آن تثبیت نهایی انجام می شود.

در میان اضافه نوآوری ها در پایتون 3.9:

  • در دیکشنری هایی که با استفاده از کلاس dict داخلی تعریف شده اند، ظاهر شد پشتیبانی از عملگرهای ادغام "|" و "|=" به روز رسانی، که مکمل روش های {**d1، **d2} و dict.update هستند که قبلا برای ادغام فرهنگ لغت ها پیشنهاد شده بود.

    >>> x = {"key1": "value1 from x"، "key2": "value2 from x"}
    >>> y = {"key2": "value2 from y"، "key3": "value3 from y"}

    >>> x | y
    {'key1': 'value1 from x', 'key2': 'value2 from y', 'key3': 'value3 from y'}

    >>> y | ایکس
    {'key2': 'value2 from x', 'key3': 'value3 from y', 'key1': 'value1 from x'}

  • مجموعه داخلی انواع شامل list، dict و tuple است که بدون وارد کردن از ماژول تایپ می‌توان به عنوان انواع پایه استفاده کرد. آن ها به جای typing.List، typing.Dict و typing.Tuple اکنون می توانید مشخص کنید
    فقط فهرست، دیکته و تاپیک:

    def greet_all(names: list[str]) -> هیچ:
    برای نام در اسامی:
    چاپ ("سلام"، نام)

  • ارائه شده است ابزارهای انعطاف پذیر برای حاشیه نویسی توابع و متغیرها. برای پیوست کردن حاشیه‌نویسی، یک نوع Annotated جدید به ماژول تایپ اضافه شده است، که انواع موجود را با ابرداده‌های اضافی که می‌توانند برای تحلیل استاتیک یا بهینه‌سازی زمان اجرا مورد استفاده قرار گیرند، گسترش می‌دهد. برای دسترسی به ابرداده از طریق کد، پارامتر include_extras به متد typing.get_type_hints() اضافه شده است.

    charType = حاشیه‌نویسی[int, ctype("char")] UnsignedShort = حاشیه‌نویسی[int, struct2.ctype('H')]

  • کمرنگ شد الزامات دستوری برای دکوراتورها - هر عبارتی که برای استفاده در بلوک‌های if و while مناسب است، اکنون می‌تواند به عنوان دکوراتور استفاده شود. این تغییر به طور قابل توجهی خوانایی کد PyQt5 را بهبود بخشید و نگهداری این ماژول را ساده کرد:

    این بود:
    button_0 = دکمه ها[0] @button_0.clicked.connect

    حالا می توانید بنویسید:
    @buttons[0].clicked.connect

  • به کتابخانه استاندارد اضافه ماژول zoneinfo، که شامل اطلاعات پایگاه داده منطقه زمانی IANA است.

    >>> از zoneinfo واردات ZoneInfo
    >>> از datetime import datetime, timedelta
    >>> # زمان تابستان
    >>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
    >>> چاپ (dt)
    2020-10-31 12:00:00-07:00

    >>> dt.tzname()
    'PDT'

    >>> # زمان استاندارد
    >>> dt += زمان دلتا (روز = 7)
    >>> چاپ (dt)
    2020-11-07 12:00:00-08:00

    >>> print(dt.tzname())
    PST

  • ماژول graphlib اضافه شد که در آن اجرا شد پشتیبانی از مرتب‌سازی توپولوژیکی نمودارها
  • پیشنهاد شده روش های جدید برای حذف پیشوندها و انتهای خط - str.removeprefix (پیشوند) و str.removesuffix (پسوند). متدها به اشیاء str، byte، bytearray و collections.UserString اضافه شده است.

    >>> s = "FooBar"
    >>> s.removeprefix("Foo")
    'بار'

  • گرفتار تجزیه کننده جدید PEG (Parsing Expression Grammar) که جایگزین تجزیه کننده شد LL (1). استفاده از تجزیه‌کننده جدید خلاص شدن از شر برخی از "هک‌های" مورد استفاده برای دور زدن محدودیت‌های موجود در LL(1) را ممکن کرد و هزینه‌های نیروی کار برای نگهداری تجزیه‌کننده را به‌طور قابل‌توجهی کاهش داد. از نظر کارایی، تجزیه کننده جدید تقریباً در همان سطح قبلی است، اما از نظر انعطاف پذیری به طور قابل توجهی از آن جلوتر است که به شما امکان می دهد هنگام طراحی ویژگی های زبان جدید احساس آزادی بیشتری داشته باشید. کد تجزیه کننده قدیمی در حال حاضر حفظ شده است و می تواند با استفاده از پرچم "-X oldparser" یا متغیر محیطی "PYTHONOLDPARSER=1" برگردانده شود، اما در نسخه 3.10 حذف خواهد شد.
  • ارائه شده است توانایی روش های پسوند C برای دسترسی به وضعیت ماژول هایی که در آنها تعریف شده اند با استفاده از اشاره گر مستقیم به جای جستجوی وضعیت ماژول با استفاده از تابع PyState_FindModule. این تغییر به شما این امکان را می دهد که با کاهش یا حذف کامل سربار بررسی وضعیت ماژول، عملکرد ماژول های C را افزایش دهید. برای مرتبط کردن یک ماژول با یک کلاس، تابع C PyType_FromModuleAndSpec() پیشنهاد شده است، برای به دست آوردن ماژول و وضعیت آن، توابع C PyType_GetModule() و PyType_GetModuleState() پیشنهاد شده است، و برای ارائه روشی با دسترسی به کلاس پیشنهاد می شود. که در آن تعریف شده است، تابع C PyCMethod و پرچم METH_METHOD پیشنهاد شده است.
  • زباله روب تحویل داده شده از مجموعه‌های قفل‌شده حاوی اشیاء بازسازی‌شده که پس از اجرای نهایی‌کننده به‌صورت خارجی در دسترس باقی می‌مانند.
  • روش اضافه شده os.pidfd_open، که به زیرسیستم هسته لینوکس "pidfd" اجازه می دهد تا برای مدیریت وضعیت استفاده مجدد PID استفاده شود (pidfd با یک فرآیند خاص مرتبط است و تغییر نمی کند، در حالی که یک PID می تواند پس از پایان فرآیند فعلی مرتبط با آن PID با فرآیند دیگری مرتبط شود. ).
  • پشتیبانی از مشخصات یونیکد به نسخه 13.0.0 به روز شده است.
  • حذف شد نشت حافظه هنگام راه اندازی مجدد مفسر پایتون در همان فرآیند.
  • عملکرد انواع داخلی، تاپل، مجموعه، منجمد، لیست و دیکت بهینه شده است. اجرا شد از طریق استفاده از پروتکل میانبر Vectorcall برای دسترسی سریعتر به اشیاء نوشته شده به زبان C.
  • ماژول‌های _abc، audioop، _bz2، _codecs، _contextvars، _crypt، _functools، _json، _locale، عملگر، منبع، زمان و _weakref از اولیه سازی در چند مرحله.
  • ماژول های استاندارد کتابخانه audioop، ast، grp، _hashlib، pwd، _posixsubprocess، random، select، struct، termios و zlib به استفاده محدود تبدیل شده اند. ABI پایدار، که مشکل عملکرد مجموعه های ماژول های افزونه را برای نسخه های مختلف پایتون حل می کند (در هنگام به روز رسانی نسخه، نیازی به بازسازی ماژول های افزونه نیست و ماژول های کامپایل شده برای 3.9 می توانند در شاخه 3.10 کار کنند).
  • ماژول asyncio به دلیل مشکلات امنیتی احتمالی، پشتیبانی از پارامتر reuse_address را منسوخ کرده است (استفاده از SO_REUSEADDR برای UDP در لینوکس به فرآیندهای مختلف اجازه می دهد تا سوکت های گوش دادن را به یک پورت UDP متصل کنند).
  • بهینه‌سازی‌های جدیدی اضافه شده‌اند، به‌عنوان مثال، بهبود عملکرد کنترل‌کننده‌های سیگنال در برنامه‌های چند رشته‌ای، افزایش سرعت ماژول فرعی در محیط FreeBSD، و تخصیص سریع‌تر متغیرهای موقت (تخصیص یک متغیر در عبارت «for y در [expr ]” اکنون به اندازه عبارت “y = expr” است. به طور کلی اکثر تست ها نشان دادن کاهش عملکرد نسبت به شاخه 3.8 (سرعت فقط در تست‌های write_local و write_deque مشاهده می‌شود):

    پایتون نسخه 3.4 3.5 3.6 3.7 3.8 3.9
    ———————————

    دسترسی خواندن متغیر و ویژگی:
    read_local 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_class 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

    دسترسی خواندن ساختار داده:
    read_list 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
    read_strdict 22.6 24.3 19.5 21.2 18.9 21.6

    دسترسی به نوشتن ساختار داده:
    write_list 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_popleft 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 که قبلاً منسوخ شده بودند و منجر به هشدار Deprecation در نسخه قبلی شدند، از جمله متد 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

اضافه کردن نظر