تازه‌های پایتون 3.9

ویرایشگر:

Łukasz Langa

این مقاله ویژگی‌های جدید پایتون 3.9 را در مقایسه با 3.8 توضیح می‌دهد. پایتون 3.9 در ۵ اکتبر ۲۰۲۰ منتشر شد. برای جزئیات کامل، فهرست تغییرات را ببینید.

همچنین ملاحظه نمائید

PEP 596 - زمان‌بندی انتشار پایتون 3.9

خلاصه -- نکات برجسته‌ی انتشار

ویژگی‌های جدید سینتکس:

  • PEP 584، عملگرهای اجتماع به dict افزوده شد؛

  • PEP 585، عام‌های راهنمای نوع در کالکشن‌های استاندارد؛

  • PEP 614، محدودیت‌های نحوی دکوراتورها را تعدیل کرد.

قابلیت‌های جدید توکار:

  • PEP 616، متدهای رشته برای حذف پیشوندها و پسوندها.

ویژگی‌های جدید در کتابخانه استاندارد:

  • PEP 593، حاشیه‌نویسی انعطاف‌پذیر تابع و متغیر؛

  • os.pidfd_open() افزوده شد که امکان مدیریت فرایندها را بدون رقابت و سیگنال‌ها فراهم می‌کند.

بهبودهای مفسر:

  • PEP 573، دسترسی سریع به وضعیت ماژول از متدهای نوع‌های توسعه‌ای C؛

  • PEP 617، سی‌پایتون اکنون از یک پارسر جدید مبتنی بر PEG استفاده می‌کند؛

  • تعدادی از توکارهای پایتون (range, tuple, set, frozenset, list, dict) اکنون با استفاده از PEP 590 vectorcall سریع‌تر شده‌اند؛

  • زباله‌روبی روی اشیاء احیاشده (resurrected) مسدود نمی‌شود؛

  • تعدادی از ماژول‌های پایتون (_abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, math, operator, resource, time, _weakref) اکنون از مقداردهی اولیه چندمرحله‌ای به‌گونه‌ای که در PEP 489 تعریف شده است، استفاده می‌کنند؛

  • تعدادی از ماژول‌های کتابخانه استاندارد (audioop، ast، grp، _hashlib، pwd، _posixsubprocess، random، select، struct، termios، zlib) اکنون از رابط دودویی پایدار (ABI) تعریف‌شده در PEP 384 استفاده می‌کنند.

ماژول‌های جدید کتابخانه:

  • PEP 615، پایگاه داده منطقه‌های زمانی IANA اکنون در ماژول zoneinfo از کتابخانه استاندارد موجود است؛

  • پیاده‌سازی مرتب‌سازی توپولوژیکی یک گراف اکنون در ماژول جدید graphlib ارائه شده است.

تغییرات فرایند انتشار:

  • PEP 602، سی‌پایتون یک چرخه انتشار سالانه را اتخاذ می‌کند.

شما باید در کد خودتان وجود DeprecationWarning را بررسی کنید

وقتی پایتون 2.7 هنوز پشتیبانی می‌شد، بسیاری از قابلیت‌های پایتون 3 برای سازگاری به عقب با پایتون 2.7 نگه داشته می‌شدند. با پایان پشتیبانی از پایتون 2، این لایه‌های سازگاری به عقب حذف شده‌اند یا به‌زودی حذف خواهند شد. بیشترِ آن‌ها طی چند سال هشدار DeprecationWarning منتشر می‌کردند. برای مثال، استفاده از collections.Mapping به جای collections.abc.Mapping از زمان انتشار پایتون 3.3 در سال ۲۰۱۲ هشدار DeprecationWarning منتشر می‌کند.

برنامه‌ی خود را با گزینه‌ی خط فرمان -W default آزمایش کنید تا DeprecationWarning و PendingDeprecationWarning را ببینید، یا حتی با -W error آن‌ها را به‌عنوان خطا در نظر بگیرید. از فیلتر هشدارها می‌توان برای نادیده گرفتن هشدارهای کد شخص ثالث استفاده کرد.

پایتون 3.9 آخرین نسخه‌ای است که این لایه‌های سازگاری با پایتون 2 را فراهم می‌کند تا نگهدارندگان پروژه‌های پایتون زمان بیشتری برای سازماندهی حذف پشتیبانی از پایتون 2 و افزودن پشتیبانی از پایتون 3.9 داشته باشند.

نام‌های مستعاری که در ماژول collections به کلاس‌های پایه انتزاعی اشاره می‌کنند — مانند collections.Mapping که نامی مستعار برای collections.abc.Mapping است — برای سازگاری با نسخه‌های قبلی، تنها برای یک نسخه‌ی آخر حفظ شده‌اند. آن‌ها از پایتون 3.10 حذف خواهند شد.

به‌طور کلی‌تر، سعی کنید آزمون‌های خود را در حالت توسعه پایتون اجرا کنید؛ این حالت به آماده‌سازی کد شما کمک می‌کند تا با نسخه بعدی پایتون سازگار باشد.

یادداشت: تعدادی از موارد پیش‌تر منسوخ‌شده نیز در این نسخه از پایتون حذف شده‌اند. به بخش حذف‌شده مراجعه کنید.

قابلیت‌های جدید

عملگرهای ادغام و به‌روزرسانی دیکشنری

عملگرهای ادغام (|) و به‌روزرسانی (|=) به کلاس توکار dict افزوده شده‌اند. این عملگرها مکمل روش‌های موجود dict.update و {**d1, **d2} برای ادغام دیکشنری‌ها هستند.

مثال:

>>> 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 | x
{'key2': 'value2 from x', 'key3': 'value3 from y', 'key1': 'value1 from x'}

برای توضیح کامل به PEP 584 مراجعه کنید. (مشارکت از Brandt Bucher در bpo-36144.)

متدهای جدید رشته برای حذف پیشوندها و پسوندها

str.removeprefix(prefix) و str.removesuffix(suffix) اضافه شده‌اند تا بتوان به‌سادگی یک پیشوند یا پسوند غیرضروری را از یک رشته حذف کرد. متدهای متناظر bytes، bytearray و collections.UserString نیز اضافه شده‌اند. برای توضیح کامل به PEP 616 مراجعه کنید. (ارائه‌شده توسط Dennis Sweeney در bpo-39939.)

نوع‌های عام برای راهنمایی نوع در مجموعه‌های استاندارد

در حاشیه‌نویسی‌های نوع اکنون می‌توانید از نوع‌های مجموعه‌ای توکار مانند list و dict به‌عنوان نوع‌های عام استفاده کنید، به‌جای اینکه نوع‌های متناظر با حرف بزرگ (مثلاً List یا Dict) را از typing ایمپورت کنید. برخی دیگر از نوع‌ها در کتابخانه‌ی استاندارد نیز اکنون عام هستند، برای مثال queue.Queue.

مثال:

def greet_all(names: list[str]) -> None:
    for name in names:
        print("Hello", name)

برای جزئیات بیشتر به PEP 585 مراجعه کنید. (مشارکت‌شده توسط گیدو ون‌روسوم، ایتن اسمیت و باتوهان تاشکایا در bpo-39481.)

پارسر جدید

پایتون 3.9 از یک پارسر جدید استفاده می‌کند که به‌جای LL(1) مبتنی بر PEG است. کارایی پارسر جدید تقریباً با کارایی پارسر قدیمی برابری می‌کند، اما هنگام طراحی قابلیت‌های جدید زبان، صورت‌گرایی PEG انعطاف‌پذیرتر از LL(1) است. استفاده از این انعطاف‌پذیری را از پایتون 3.10 به بعد آغاز خواهیم کرد.

ماژول ast از پارسر جدید استفاده می‌کند و همان AST‌ای را تولید می‌کند که پارسر قدیمی تولید می‌کند.

در پایتون 3.10، پارسر قدیمی حذف خواهد شد و تمام قابلیت‌هایی که به آن وابسته‌اند نیز حذف خواهند شد (عمدتاً ماژول parser که مدت‌هاست منسوخ شده است). تنها در پایتون 3.9 می‌توانید با استفاده از یک سوییچ خط فرمان (-X oldparser) یا یک متغیر محیطی (PYTHONOLDPARSER=1) به پارسر LL(1) بازگردید.

برای جزئیات بیشتر به PEP 617 مراجعه کنید. (مشارکت‌شده توسط Guido van Rossum، Pablo Galindo و Lysandros Nikolaou در bpo-40334.)

سایر تغییرات زبان

  • تابع __import__() اکنون به‌جای ValueError (که پیش‌تر هنگام فراتر رفتن یک ایمپورت نسبی از بسته‌ی سطح‌بالای خود رخ می‌داد)، ImportError ایجاد می‌کند. (مشارکت‌شده توسط Ngalim Siregar در bpo-37444.)

  • پایتون اکنون مسیر مطلق نام پرونده‌ی اسکریپتی که در خط فرمان مشخص شده را به دست می‌آورد (مثال: python3 script.py): ویژگی __file__ ماژول __main__ به مسیری مطلق تبدیل شد، نه مسیری نسبی. این مسیرها اکنون پس از تغییر پوشه‌ی جاری توسط os.chdir() معتبر باقی می‌مانند. به‌عنوان یک اثر جانبی، ردگیری نیز در این حالت مسیر مطلق را برای فریم‌های ماژول __main__ نمایش می‌دهد. (مشارکت‌شده توسط Victor Stinner در bpo-20443.)

  • در حالت توسعه پایتون و در ساخت‌ دیباگ، آرگومان‌های encoding و errors اکنون در عملیات کدگذاری و کدگشایی رشته بررسی می‌شوند. مثال‌ها: open()، str.encode() و bytes.decode().

    به‌طور پیش‌فرض، برای بهترین عملکرد، آرگومان errors تنها در نخستین خطای کدگذاری/کدگشایی بررسی می‌شود و آرگومان encoding گاهی برای رشته‌های خالی نادیده گرفته می‌شود. (ارائه‌شده توسط Victor Stinner در bpo-37388.)

  • "".replace("", s, n) اکنون برای همه‌ی مقدارهای غیرصفرِ n، به‌جای رشته‌ی خالی، s را برمی‌گرداند. این رفتار اکنون با "".replace("", s) سازگار است. تغییرهای مشابهی برای اشیاء bytes و bytearray وجود دارد. (مشارکت Serhiy Storchaka در bpo-28029.)

  • اکنون هر عبارت معتبر می‌تواند به‌عنوان دکوراتور استفاده شود. پیش‌تر، دستور زبان بسیار محدودتر بود. برای جزئیات به PEP 614 مراجعه کنید. (با مشارکت Brandt Bucher در bpo-39702.)

  • بهبود راهنمای ماژول typing. اکنون رشته‌های مستند برای همه‌ی فرم‌های ویژه و مستعارهای عام ویژه (مانند Union و List) نمایش داده می‌شوند. استفاده از help() با مستعار عامی مانند List[int]، راهنمای نوع عینی متناظر (در این مورد list) را نمایش می‌دهد. (مشارکت‌شده توسط Serhiy Storchaka در bpo-40257.)

  • اجرای موازی aclose() / asend() / athrow() اکنون ممنوع است و ag_running اکنون وضعیت واقعی اجرای تولیدگر ناهمگام را منعکس می‌کند. (مشارکت‌شده توسط Yury Selivanov در bpo-30773.)

  • خطاهای غیرمنتظره در فراخوانی متد __iter__ دیگر در عملگر in و توابع contains()، indexOf() و countOf() از ماژول operator توسط TypeError پنهان نمی‌شوند. (با مشارکت Serhiy Storchaka در bpo-40824.)

  • عبارت‌های لامبدای بی‌پرانتز دیگر نمی‌توانند در درک‌ها و عبارت‌های تولیدگر، بخش عبارت در بند if باشند. برای جزئیات به bpo-41848 و bpo-43755 مراجعه کنید.

ماژول‌های جدید

zoneinfo

ماژول zoneinfo پشتیبانی از پایگاه داده منطقه‌های زمانی IANA را به کتابخانه استاندارد می‌آورد. این ماژول zoneinfo.ZoneInfo را می‌افزاید؛ یک پیاده‌سازی عینی از datetime.tzinfo که مبتنی بر داده‌های منطقه زمانی سیستم است.

مثال:

>>> from zoneinfo import ZoneInfo
>>> import datetime as dt

>>> # Daylight saving time
>>> when = dt.datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
>>> print(when)
2020-10-31 12:00:00-07:00
>>> when.tzname()
'PDT'

>>> # Standard time
>>> when += dt.timedelta(days=7)
>>> print(when)
2020-11-07 12:00:00-08:00
>>> print(when.tzname())
PST

به‌عنوان منبع جایگزین داده‌ها برای پلتفرم‌هایی که پایگاه داده‌ی IANA را ارائه نمی‌کنند، ماژول tzdata به‌صورت یک بسته‌ی طرف اول (first-party) منتشر شد — بسته‌ای که از طریق PyPI توزیع می‌شود و توسط تیم اصلی سی‌پایتون نگهداری می‌شود.

همچنین ملاحظه نمائید

PEP 615 -- پشتیبانی از پایگاه داده‌ی مناطق زمانی IANA در کتابخانه استاندارد

PEP (پیشنهاد بهبود پایتون) توسط Paul Ganssle نوشته و پیاده‌سازی‌شده است

graphlib

ماژول جدیدی به نام graphlib اضافه شد که شامل کلاس graphlib.TopologicalSorter برای ارائه‌ی قابلیت انجام مرتب‌سازی توپولوژیکی گراف‌ها است. (با مشارکت Pablo Galindo، Tim Peters و Larry Hastings در bpo-17005.)

ماژول‌های بهبودیافته

ast

گزینه‌ی indent به dump() افزوده شد که به آن امکان می‌دهد خروجی چندسطری با تورفتگی تولید کند. (مشارکت سرهی استورچاکا در bpo-37995.)

تابع ast.unparse() به‌عنوان تابعی در ماژول ast افزوده شد که می‌توان از آن برای تجزیه‌گشایی (unparse) یک شیء ast.AST و تولید رشته‌ای حاوی کدی استفاده کرد که هنگام تجزیه، شیء ast.AST معادلی تولید می‌کند. (مشارکت‌شده توسط پابلو گالیندو و باتوهان تاسکایا در bpo-38870.)

به گره‌های AST رشته‌های مستندی اضافه شد که امضای ASDL مورد استفاده برای ساخت آن گره را شامل می‌شوند. (نوشته‌شده توسط Batuhan Taskaya در bpo-39638.)

asyncio

به دلیل نگرانی‌های امنیتی جدی، پارامتر reuse_address در asyncio.loop.create_datagram_endpoint() دیگر پشتیبانی نمی‌شود. دلیل این امر، رفتار گزینه‌ی سوکت SO_REUSEADDR در UDP است. برای جزئیات بیشتر، به مستندات loop.create_datagram_endpoint() مراجعه کنید. (با مشارکت کایل استنلی، آنتوان پی‌ترو و یوری سلیوانوف در bpo-37228.)

یک هم‌روال جدید به نام shutdown_default_executor() افزوده شد که خاتمه‌ی اجراکننده‌ی پیش‌فرض را زمان‌بندی می‌کند و منتظر می‌ماند تا ThreadPoolExecutor به‌طور کامل بسته شود. همچنین، asyncio.run() به‌روزرسانی شده است تا از هم‌روال جدید استفاده کند. (مشارکت‌شده توسط کایل استنلی در bpo-34037.)

asyncio.PidfdChildWatcher افزوده شد؛ یک پیاده‌سازی دیده‌بان فرزند (child watcher) مخصوص لینوکس که توصیف‌گرهای پرونده‌ی فرایند را پایش می‌کند. (bpo-38692)

یک هم‌روال جدید به نام asyncio.to_thread() اضافه شد. این هم‌روال عمدتاً برای اجرای توابع محدود به IO در یک نخ جداگانه به‌کار می‌رود تا از مسدود شدن حلقه رویداد جلوگیری شود، و اساساً به‌عنوان نسخه سطح بالایی از run_in_executor() کار می‌کند که می‌تواند مستقیماً آرگومان‌های کلیدواژه‌ای بپذیرد. (مشارکت کایل استنلی و یوری سلیوانوف در bpo-32309.)

هنگام لغو وظیفه به دلیل اتمام مهلت زمانی، asyncio.wait_for() اکنون در حالتی که timeout <= 0 است نیز، همان‌طور که با مهلت‌های زمانی مثبت انجام می‌دهد، تا کامل‌شدن لغو منتظر می‌ماند. (مشارکت‌شده توسط Elvis Pranskevichus در bpo-32751.)

asyncio اکنون هنگام فراخوانی متدهای نا‌سازگار با سوکتِ ssl.SSLSocket، استثنای TypeError را مطرح می‌کند. (مشارکت‌شده توسط Ido Michael در bpo-37404.)

compileall

امکان جدیدی اضافه شد تا از پیوندهای سخت برای پرونده‌های .pyc تکراری استفاده شود: پارامتر hardlink_dupes و گزینه‌ی خط فرمان --hardlink-dupes. (مشارکت‌شده توسط Lumír 'Frenzy' Balhar در bpo-40495.)

گزینه‌های جدیدی برای دستکاری مسیر در پرونده‌های .pyc حاصل اضافه شد: پارامترهای stripdir، prependdir و limit_sl_dest و گزینه‌های خط فرمان -s، -p و -e. امکان تعیین گزینه مربوط به یک سطح بهینه‌سازی به تعداد دفعات متعدد اضافه شد. (مشارکت‌شده توسط Lumír 'Frenzy' Balhar در bpo-38112.)

concurrent.futures

پارامتر جدید cancel_futures به concurrent.futures.Executor.shutdown() اضافه شد که همه‌ی آینده‌نماهای در انتظاری که هنوز اجرایشان آغاز نشده است را لغو می‌کند، به‌جای آن‌که پیش از خاموش کردن اجراکننده منتظر کامل شدن آن‌ها بماند. (با مشارکت کایل استنلی در bpo-39349.)

نخ‌های دِیمِن از ThreadPoolExecutor و ProcessPoolExecutor حذف شدند. این امر سازگاری با زیرمفسرها و پیش‌بینی‌پذیری در فرایندهای خاموش‌شدن آن‌ها را بهبود می‌بخشد. (مشارکت‌شده توسط کایل استنلی در bpo-39812.)

کارگرهای ProcessPoolExecutor اکنون به‌صورت درخواستی ایجاد می‌شوند، تنها زمانی که هیچ کارگر بیکاری برای استفاده مجدد در دسترس نباشد. این کار سربار راه‌اندازی را بهینه‌سازی می‌کند و مقدار زمان CPU تلف‌شده به‌دلیل کارگرهای بیکار را کاهش می‌دهد. (ارائه‌شده توسط کایل استنلی در bpo-39207.)

curses

توابع curses.get_escdelay()، curses.set_escdelay()، curses.get_tabsize() و curses.set_tabsize() افزوده شدند. (مشارکت توسط آنتونی ساتیل در bpo-38312.)

datetime

متدهای isocalendar() از datetime.date و isocalendar() از datetime.datetime اکنون به‌جای tuple یک namedtuple() بازمی‌گردانند. (مشارکت Donghee Na در bpo-24416.)

distutils

فرمان upload اکنون چکیده‌های هش SHA2-256 و Blake2b-256 را ایجاد می‌کند. در پلتفرم‌هایی که چکیده MD5 را مسدود می‌کنند، از MD5 صرف‌نظر می‌کند. (مشارکت‌شده توسط Christian Heimes در bpo-40698.)

fcntl

ثابت‌های fcntl.F_OFD_GETLK، fcntl.F_OFD_SETLK و fcntl.F_OFD_SETLKW اضافه شدند. (مشارکت‌شده توسط Donghee Na در bpo-38602.)

ftplib

FTP و FTP_TLS اکنون در صورتی که مهلت زمانی داده‌شده برای سازنده‌شان صفر باشد، برای جلوگیری از ایجاد سوکت غیر‌مسدودکننده، استثنای ValueError ایجاد می‌کنند. (مشارکت‌شده توسط دونگ‌هی نا در bpo-39259.)

gc

وقتی زباله‌روب جمع‌آوری‌ای انجام می‌دهد که در آن برخی اشیاء باززنده می‌شوند (پس از اجرای نهایی‌سازها، از بیرون چرخه‌های ایزوله قابل دسترس‌اند)، جمع‌آوری تمام اشیایی که همچنان غیرقابل دسترس‌اند را مسدود نمی‌کند. (با مشارکت Pablo Galindo و Tim Peters در bpo-38379.)

تابع جدید gc.is_finalized() برای بررسی اینکه آیا یک شیء توسط زباله‌روب نهایی‌سازی شده است یا خیر، اضافه شد. (مشارکت‌شده توسط پابلو گالیندو در bpo-39322.)

hashlib

ماژول hashlib اکنون می‌تواند در صورت موجود بودن OpenSSL، از هش‌های SHA3 و SHAKE XOF آن استفاده کند. (مشارکت‌شده توسط کریستین هایمز در bpo-37630.)

اکنون می‌توان ماژول‌های هش توکار را با ./configure --without-builtin-hashlib-hashes غیرفعال کرد یا به‌صورت انتخابی، مثلاً با ./configure --with-builtin-hashlib-hashes=sha3,blake2، فعال کرد تا استفاده از پیاده‌سازی مبتنی بر OpenSSL اجباری شود. (مشارکت Christian Heimes در bpo-40479)

http

کدهای وضعیت HTTP 103 EARLY_HINTS، 418 IM_A_TEAPOT و 425 TOO_EARLY به http.HTTPStatus افزوده شدند. (مشارکت Donghee Na در bpo-39509 و Ross Rhodes در bpo-39507.)

IDLE و idlelib

گزینه‌ای برای خاموش کردن چشمک‌زدن مکان‌نما اضافه شد. (با مشارکت Zackery Spytz در bpo-4603.)

کلید Escape اکنون پنجره‌های تکمیل IDLE را می‌بندد. (مشارکت از سوی Johnny Najera در bpo-38944.)

کلیدواژه‌ها به فهرست تکمیل نام ماژول افزوده شدند. (مشارکت‌شده توسط Terry J. Reedy در bpo-37765.)

جدید در نسخه‌های نگهداری 3.9

IDLE اکنون sys.excepthook() را فراخوانی می‌کند (وقتی بدون '-n' اجرا شود). قلاب‌های کاربر پیش‌تر نادیده گرفته می‌شدند. (ارائه‌شده توسط Ken Hilton در bpo-43008.)

تغییرات فوق به نسخه‌های نگهداری 3.8 بک‌پورت شده‌اند.

پنجره تنظیمات بازآرایی شد. زبانه General به زبانه‌های Windows و Shell/Ed تقسیم شد. منابع راهنما که منوی Help را گسترش می‌دهند، به زبانه Extensions منتقل شدند. برای گزینه‌های جدید فضا ایجاد شد و پنجره کوتاه‌تر شد. دومی باعث می‌شود پنجره تنظیمات با صفحه‌های نمایش کوچک بهتر متناسب شود. (مشارکت Terry Jan Reedy در bpo-40468.) تنظیم فضای تورفتگی از زبانه Font به زبانه جدید Windows منتقل شد. (مشارکت Mark Roseman و Terry Jan Reedy در bpo-33962.)

اعمال برجسته‌سازی نحوی بر پرونده‌های .pyi. (مشارکت‌شده توسط Alex Waygood و Terry Jan Reedy در bpo-45447.)

imaplib

کلاس‌های IMAP4 و IMAP4_SSL اکنون پارامتر اختیاری timeout برای سازنده‌های خود دارند. همچنین، متد open() با این تغییر اکنون پارامتر اختیاری timeout دارد. این تغییر بر متدهای بازنویسی‌شده‌ی IMAP4_SSL و IMAP4_stream نیز اعمال شد. (مشارکت Donghee Na در bpo-38615.)

imaplib.IMAP4.unselect() اضافه شد. imaplib.IMAP4.unselect() منابع سرور مربوط به صندوق پستی انتخاب‌شده را آزاد می‌کند و سرور را به وضعیت احراز هویت‌شده برمی‌گرداند. این دستور همان اقدامات imaplib.IMAP4.close() را انجام می‌دهد، با این تفاوت که هیچ پیامی به‌طور دائمی از صندوق پستی انتخاب‌شده‌ی فعلی حذف نمی‌شود. (مشارکت: Donghee Na در bpo-40375.)

importlib

برای بهبود سازگاری با دستورهای ایمپورت، importlib.util.resolve_name() اکنون برای تلاش‌های نامعتبر ایمپورت نسبی، به جای ValueError استثنای ImportError ایجاد می‌کند. (مشارکت‌شده توسط Ngalim Siregar در bpo-37444.)

بارگذارهای ایمپورت که اشیاء ماژول تغییرناپذیر منتشر می‌کنند، اکنون می‌توانند علاوه بر ماژول‌های منفرد، بسته‌های تغییرناپذیر نیز منتشر کنند. (با مشارکت Dino Viehland در bpo-39336.)

تابع importlib.resources.files() با پشتیبانی از زیرپوشه‌ها در داده‌های بسته اضافه شد که با بک‌پورت در نسخه 1.5 importlib_resources مطابقت دارد. (با مشارکت Jason R. Coombs در bpo-39791.)

importlib.metadata از importlib_metadata نسخه‌ی 1.6.1 به‌روزرسانی شد.

inspect

inspect.BoundArguments.arguments از OrderedDict به دیکشنری معمولی تغییر کرده است. (با مشارکت Inada Naoki در bpo-36350 و bpo-39775.)

ipaddress

ipaddress اکنون نشانی‌های محدوده‌دار IPv6 (نشانی IPv6 با پسوند %<scope_id>) را پشتیبانی می‌کند.

نشانی‌های IPv6 دارای محدوده را می‌توان با استفاده از ipaddress.IPv6Address تجزیه کرد. در صورت وجود، شناسه ناحیه محدوده (scope zone ID) از طریق ویژگی scope_id در دسترس است. (مشارکت‌شده توسط Oleksandr Pavliuk در bpo-34788.)

از پایتون 3.9.5 به بعد، ماژول ipaddress دیگر هیچ صفرِ ابتدایی‌ای را در رشته‌های آدرس IPv4 نمی‌پذیرد. (مشارکت‌شده توسط کریستین هایمز در bpo-36384).

math

تابع math.gcd() برای مدیریت آرگومان‌های متعدد گسترش یافت. پیش‌تر، این تابع تنها از دو آرگومان پشتیبانی می‌کرد. (مشارکت‌شده توسط Serhiy Storchaka در bpo-39648.)

math.lcm() اضافه شد: کمترین مضرب مشترک آرگومان‌های مشخص‌شده را برمی‌گرداند. (مشارکت‌شده توسط مارک دیکنسون، آنانتاکریشنان و سرهی استورچاکا در bpo-39479 و bpo-39648.)

تابع math.nextafter() اضافه شد: مقدار ممیز شناور بعدی پس از x به سمت y را برمی‌گرداند. (مشارکت‌شده توسط Victor Stinner در bpo-39288.)

تابع math.ulp() افزوده شد: مقدار کم‌ارزش‌ترین بیت یک عدد اعشاری را برمی‌گرداند. (مشارکت‌شده توسط Victor Stinner در bpo-39310.)

چندپردازشی (multiprocessing)

کلاس multiprocessing.SimpleQueue متد جدید close() را برای بستن صریح صف دارد. (مشارکت Victor Stinner در bpo-30966.)

nntplib

NNTP و NNTP_SSL اکنون در صورتی که مهلت زمانی داده‌شده برای سازنده‌ی آن‌ها صفر باشد، برای جلوگیری از ایجاد سوکت غیرمسدودکننده، استثنای ValueError را ایجاد می‌کنند. (مشارکت‌شده توسط دونگ‌هی نا در bpo-39259.)

os

CLD_KILLED و CLD_STOPPED برای si_code اضافه شدند. (مشارکت‌شده توسط Donghee Na در bpo-38493.)

قابلیت‌های مخصوص لینوکس os.pidfd_open() (bpo-38692) و os.P_PIDFD (bpo-38713) برای مدیریت فرایند با توصیف‌گرهای پرونده در دسترس قرار گرفتند.

تابع os.unsetenv() اکنون در ویندوز نیز در دسترس است. (ارائه‌شده توسط ویکتور استینر در bpo-39413.)

توابع os.putenv() و os.unsetenv() اکنون همیشه دسترس‌پذیر هستند. (مشارکت‌شده توسط Victor Stinner در bpo-39395.)

تابع os.waitstatus_to_exitcode() اضافه شد: یک وضعیت انتظار را به کد خروج تبدیل می‌کند. (مشارکت‌شده توسط Victor Stinner در bpo-40094.)

pathlib

متد pathlib.Path.readlink() افزوده شد که مشابه os.readlink() عمل می‌کند. (مشارکت‌شده توسط Girts Folkmanis در bpo-30618)

pdb

اکنون در ویندوز Pdb از ~/.pdbrc پشتیبانی می‌کند. (ارائه‌شده توسط Tim Hopper و Dan Lidral-Porter در bpo-20523.)

poplib

POP3 و POP3_SSL اکنون اگر مهلت زمانی داده‌شده برای سازنده‌شان صفر باشد، یک ValueError ایجاد می‌کنند تا از ساخت سوکت غیرمسدودکننده جلوگیری شود. (ارائه‌شده توسط Donghee Na در bpo-39259.)

pprint

pprint اکنون می‌تواند types.SimpleNamespace را به‌طور زیبا (pretty-print) چاپ کند. (با مشارکت کارل بوردوم هانسن در bpo-37376.)

pydoc

رشته مستند اکنون نه‌تنها برای کلاس، تابع، متد و غیره، بلکه برای هر شیئی که ویژگی __doc__ مخصوص به خود را داشته باشد نمایش داده می‌شود. (مشارکت Serhiy Storchaka در bpo-40257.)

random

متد جدید random.Random.randbytes() اضافه شد: تولید بایت‌های تصادفی. (مشارکت‌شده توسط Victor Stinner در bpo-40286.)

signal

تابع مخصوص لینوکس signal.pidfd_send_signal() برای ارسال سیگنال‌ها به یک فرایند با استفاده از توصیف‌گر پرونده به‌جای شناسه‌ی فرایند (pid) افشا شد. (bpo-38712)

smtplib

SMTP و SMTP_SSL اکنون در صورتی که مهلت زمانی داده‌شده برای سازنده‌شان صفر باشد، برای جلوگیری از ساخت سوکت غیرمسدودکننده، یک ValueError ایجاد می‌کنند. (مشارکت دونگ‌هی نا در bpo-39259.)

سازنده‌ی LMTP اکنون یک پارامتر اختیاری timeout دارد. (مشارکت‌شده توسط Donghee Na در bpo-39329.)

socket

ماژول socket اکنون ثابت CAN_RAW_JOIN_FILTERS را روی لینوکس 4.1 و بالاتر اکسپورت می‌کند. (مشارکت‌شده توسط استفان تاتشنر و زاکری اسپیتز در bpo-25780.)

ماژول socket اکنون پروتکل CAN_J1939 را روی پلتفرم‌هایی که از آن پشتیبانی می‌کنند، پشتیبانی می‌کند. (مشارکت‌شده توسط Karl Ding در bpo-40291.)

ماژول socket اکنون دارای توابع socket.send_fds() و socket.recv_fds() است. (مشارکت‌شده توسط Joannah Nanjekye، Shinya Okano و Victor Stinner در bpo-28724.)

time

در AIX، thread_time() اکنون با thread_cputime() پیاده‌سازی شده است که وضوح نانوثانیه‌ای دارد، به جای clock_gettime(CLOCK_THREAD_CPUTIME_ID) که وضوح آن ۱۰ میلی‌ثانیه است. (مشارکت Batuhan Taskaya در bpo-40192)

sys

ویژگی جدید sys.platlibdir افزوده شد: نام پوشه کتابخانه مخصوص پلتفرم. از آن برای ساخت مسیر کتابخانه استاندارد و مسیرهای ماژول‌های توسعه‌ای نصب‌شده استفاده می‌شود. در بیشتر پلتفرم‌ها برابر "lib" است. در فدورا و SuSE، در پلتفرم‌های ۶۴ بیتی برابر "lib64" است. (با مشارکت Jan Matějek، Matěj Cepl، Charalampos Stratakis و Victor Stinner در bpo-1294959.)

پیش‌تر، sys.stderr در حالت غیرتعاملی بافر بلوکی داشت. اکنون stderr به‌طور پیش‌فرض همیشه بافر سطری دارد. (مشارکت‌شده توسط Jendrik Seipp در bpo-13601.)

tracemalloc

تابع tracemalloc.reset_peak() افزوده شد تا اندازه اوج بلوک‌های حافظه‌ی ردیابی‌شده به اندازه فعلی تنظیم شود تا بتوان اوج تکه‌های خاصی از کد را اندازه‌گیری کرد. (ارائه‌شده توسط Huon Wilson در bpo-40630.)

typing

PEP 593 نوع typing.Annotated را برای تزئین نوع‌های موجود با فراداده‌های خاصِ زمینه، و پارامتر جدید include_extras را در typing.get_type_hints() برای دسترسی به فراداده‌ها در زمان اجرا معرفی کرد. (مشارکت: Till Varoquaux و Konstantin Kashin.)

unicodedata

پایگاه داده یونیکد به نسخه‌ی 13.0.0 به‌روزرسانی شده است. (bpo-39926).

venv

اسکریپت‌های فعال‌سازی ارائه‌شده توسط venv اکنون همگی سفارشی‌سازی اعلان خود را به‌طور سازگار مشخص می‌کنند و همیشه از مقدار تعیین‌شده توسط __VENV_PROMPT__ استفاده می‌کنند. پیش‌تر برخی از اسکریپت‌ها بدون قید و شرط از __VENV_PROMPT__ استفاده می‌کردند، برخی دیگر تنها در صورتی که اتفاقاً تنظیم شده بود (که حالت پیش‌فرض همین بود)، و یکی نیز به‌جای آن از __VENV_NAME__ استفاده می‌کرد. (مشارکت‌شده توسط Brett Cannon در bpo-37663.)

xml

نویسه‌های فضای سفید درون ویژگی‌ها اکنون هنگام سریال‌سازی xml.etree.ElementTree به پرونده XML حفظ می‌شوند. نویسه‌های پایان سطر (EOLN) دیگر به "n" نرمال نمی‌شوند. این نتیجه‌ی بحث درباره‌ی نحوه‌ی تفسیر بخش ۲.۱۱ مشخصات XML است. (مشارکت‌شده توسط Mefistotelis در bpo-39011.)

بهینه‌سازی‌ها

  • الگوی رایج انتساب یک متغیر موقت در درک‌ها بهینه‌سازی شد. اکنون for y in [expr] در درک‌ها به اندازه‌ی یک انتساب ساده‌ی y = expr سریع است. برای مثال:

    sums = [s for s in [0] for x in data for s in [s + x]]

    برخلاف عملگر :=، این شیوه متغیری را به محدوده بیرونی نشت نمی‌دهد.

    (مشارکت Serhiy Storchaka در bpo-32856.)

  • مدیریت سیگنال در برنامه‌های چندنخی بهینه‌سازی شد. اگر نخی غیر از نخ اصلی سیگنالی دریافت کند، حلقه‌ی ارزیابی بایت‌کد دیگر در هر دستور بایت‌کد برای بررسی سیگنال‌های در انتظاری که نمی‌توان آن‌ها را مدیریت کرد، متوقف نمی‌شود. فقط نخ اصلی مفسر اصلی می‌تواند سیگنال‌ها را مدیریت کند.

    پیش‌تر، حلقه‌ی ارزیابی بایت‌کد در هر دستورالعمل قطع می‌شد تا زمانی که نخ اصلی سیگنال‌ها را مدیریت کند. (مشارکت‌شده توسط Victor Stinner در bpo-40010.)

  • ماژول subprocess در FreeBSD با استفاده از closefrom() بهینه‌سازی شد. (مشارکت‌شده توسط Ed Maste، Conrad Meyer، Kyle Evans، Kubilay Kocak و Victor Stinner در bpo-38061.)

  • PyLong_FromDouble() اکنون برای مقادیری که در long جای می‌گیرند، تا ۱٫۸۷ برابر سریع‌تر شده است. (مشارکت‌شده توسط Sergey Fedoseev در bpo-37986.)

  • تعدادی از توکارهای پایتون (range، tuple، set، frozenset، list، dict) اکنون با استفاده از پروتکل vectorcall معرفی‌شده در PEP 590 سریع‌تر شده‌اند. (مشارکت‌شده توسط Donghee Na، Mark Shannon، Jeroen Demeyer و Petr Viktorin در bpo-37207.)

  • بهینه‌سازی set.difference_update() برای حالتی که مجموعه‌ی دیگر بسیار بزرگ‌تر از مجموعه‌ی پایه باشد. (پیشنهاد Evgeny Kapun و کد نوشته‌شده توسط Michele Orrù در bpo-8425.)

  • تخصیص‌دهنده‌ی اشیاء کوچک پایتون (obmalloc.c) اکنون اجازه می‌دهد (حداکثر) یک آرنای خالی (arena) برای استفاده‌ی مجدد فوری در دسترس باقی بماند، بدون بازگرداندن آن به سیستم‌عامل. این امر از تلاطم (thrashing) در حلقه‌های ساده‌ای که در آن‌ها یک آرنا می‌توانست در هر پیمایش از نو ایجاد و نابود شود، جلوگیری می‌کند. (نوشته‌ی تیم پیترز در bpo-37257.)

  • عملیات تقسیم کف روی اعداد اعشاری اکنون کارایی بهتری دارد. همچنین پیام ZeroDivisionError برای این عملیات به‌روزرسانی شده است. (مشارکت‌شده توسط Donghee Na در bpo-39434.)

  • کدگشایی رشته‌های کوتاه اسکی با کدک‌های UTF-8 و ascii اکنون حدود ۱۵ درصد سریع‌تر شده است. (مشارکت Inada Naoki در bpo-37348.)

در ادامه، خلاصه‌ای از بهبودهای عملکرد از پایتون 3.4 تا پایتون 3.9 آمده است:

Python version                       3.4     3.5     3.6     3.7     3.8    3.9
--------------                       ---     ---     ---     ---     ---    ---

Variable and attribute read access:
    read_local                       7.1     7.1     5.4     5.1     3.9    3.9
    read_nonlocal                    7.1     8.1     5.8     5.4     4.4    4.5
    read_global                     15.5    19.0    14.3    13.6     7.6    7.8
    read_builtin                    21.1    21.6    18.5    19.0     7.5    7.8
    read_classvar_from_class        25.6    26.5    20.7    19.5    18.4   17.9
    read_classvar_from_instance     22.8    23.5    18.8    17.1    16.4   16.9
    read_instancevar                32.4    33.1    28.0    26.3    25.4   25.3
    read_instancevar_slots          27.8    31.3    20.8    20.8    20.2   20.5
    read_namedtuple                 73.8    57.5    45.0    46.8    18.4   18.7
    read_boundmethod                37.6    37.9    29.6    26.9    27.7   41.1

Variable and attribute write access:
    write_local                      8.7     9.3     5.5     5.3     4.3    4.3
    write_nonlocal                  10.5    11.1     5.6     5.5     4.7    4.8
    write_global                    19.7    21.2    18.0    18.0    15.8   16.7
    write_classvar                  92.9    96.0   104.6   102.1    39.2   39.8
    write_instancevar               44.6    45.8    40.0    38.9    35.5   37.4
    write_instancevar_slots         35.6    36.1    27.3    26.6    25.7   25.8

Data structure read access:
    read_list                       24.2    24.5    20.8    20.8    19.0   19.5
    read_deque                      24.7    25.5    20.2    20.6    19.8   20.2
    read_dict                       24.3    25.7    22.3    23.0    21.0   22.4
    read_strdict                    22.6    24.3    19.5    21.2    18.9   21.5

Data structure write access:
    write_list                      27.1    28.5    22.5    21.6    20.0   20.0
    write_deque                     28.7    30.1    22.7    21.8    23.5   21.7
    write_dict                      31.4    33.3    29.3    29.2    24.7   25.4
    write_strdict                   28.4    29.9    27.5    25.2    23.1   24.5

Stack (or queue) operations:
    list_append_pop                 93.4   112.7    75.4    74.2    50.8   50.6
    deque_append_pop                43.5    57.0    49.4    49.2    42.5   44.2
    deque_append_popleft            43.7    57.3    49.7    49.7    42.8   46.4

Timing loop:
    loop_overhead                    0.5     0.6     0.4     0.3     0.3    0.3

این نتایج از اسکریپت بنچمارک دسترسی به متغیر موجود در Tools/scripts/var_access_benchmark.py تولید شده‌اند. این اسکریپت بنچمارک زمان‌ها را به نانوثانیه نمایش می‌دهد. این بنچمارک‌ها روی یک پردازنده‌ی Intel® Core™ i7-4960HQ که در حال اجرای نسخه‌های ۶۴بیتی macOS موجود در python.org بود، اندازه‌گیری شده‌اند.

منسوخ

  • دستور bdist_msi در distutils اکنون منسوخ شده است؛ به‌جای آن از bdist_wheel (بسته‌های wheel) استفاده کنید. (مشارکت‌شده توسط هوگو فان کمِناده در bpo-39586.)

  • در حال حاضر math.factorial() نمونه‌های float با مقادیر صحیح نامنفی (مانند 5.0) را می‌پذیرد. برای اعداد اعشاری غیرصحیح و منفی، استثنای ValueError ایجاد می‌کند. این رفتار اکنون منسوخ شده است. در نسخه‌های آینده پایتون، برای همه اعداد اعشاری استثنای TypeError ایجاد خواهد کرد. (نوشته‌ی Serhiy Storchaka در bpo-37315.)

  • ماژول‌های parser و symbol منسوخ شده‌اند و در نسخه‌های آینده پایتون حذف خواهند شد. برای اکثر موارد استفاده، کاربران می‌توانند با استفاده از ماژول ast از مرحله‌ی تولید و کامپایل درخت سینتکس انتزاعی (AST) بهره ببرند.

  • توابع عمومی API زبان C یعنی PyParser_SimpleParseStringFlags()، PyParser_SimpleParseStringFlagsFilename()، PyParser_SimpleParseFileFlags() و PyNode_Compile() منسوخ شده‌اند و در Python 3.10 همراه با پارسر قدیمی حذف خواهند شد.

  • استفاده از NotImplemented در زمینه‌ی بولی منسوخ شده است، زیرا این کار تقریباً به‌طور انحصاری نتیجه‌ی پیاده‌سازی‌های نادرست مقایسه‌گرهای غنی (rich comparator) است. در نسخه‌ای از پایتون در آینده، این کار به TypeError تبدیل خواهد شد. (مشارکت Josh Rosenberg در bpo-35712.)

  • ماژول random در حال حاضر هر نوع هش‌پذیر را به‌عنوان یک مقدار بذر ممکن می‌پذیرد. متأسفانه، تضمینی وجود ندارد که برخی از این نوع‌ها مقدار هش قطعی داشته باشند. پس از Python 3.9، این ماژول بذرهای خود را به None، int، float، str، bytes و bytearray محدود خواهد کرد.

  • باز کردن پرونده GzipFile برای نوشتن بدون مشخص کردن آرگومان mode منسوخ شده است. در نسخه‌های آینده پایتون، این پرونده همیشه به‌طور پیش‌فرض برای خواندن باز خواهد شد. برای باز کردن آن به منظور نوشتن و ساکت کردن هشدار، آرگومان mode را مشخص کنید. (مشارکت‌شده توسط Serhiy Storchaka در bpo-28286.)

  • متد split() از _tkinter.TkappType به نفع متد splitlist() که رفتاری سازگارتر و پیش‌بینی‌پذیرتر دارد، منسوخ شد. (مشارکت‌شده توسط Serhiy Storchaka در bpo-38371.)

  • گذراندن صریح اشیای هم‌روال به asyncio.wait() منسوخ شده است و در نسخه 3.11 حذف خواهد شد. (مشارکت Yury Selivanov و Kyle Stanley در bpo-34790.)

  • استانداردهای binhex4 و hexbin4 اکنون منسوخ شده‌اند. ماژول binhex و توابع زیر از binascii اکنون منسوخ شده‌اند:

    • b2a_hqx(), a2b_hqx()

    • rlecode_hqx(), rledecode_hqx()

    (مشارکت توسط Victor Stinner در bpo-39353.)

  • کلاس‌های ast یعنی slice، Index و ExtSlice منسوخ در نظر گرفته می‌شوند و در نسخه‌های آینده‌ی پایتون حذف خواهند شد. به جای Index(value) باید از خود value استفاده شود. به جای ExtSlice(slices) باید از Tuple(slices, Load()) استفاده شود. (با مشارکت Serhiy Storchaka در bpo-34822.)

  • کلاس‌های Suite، Param، AugLoad و AugStore در ast منسوخ در نظر گرفته می‌شوند و در نسخه‌های آینده پایتون حذف خواهند شد. این کلاس‌ها توسط پارسر تولید نمی‌شدند و در پایتون ۳ توسط تولیدگر کد پذیرفته نمی‌شدند. (مشارکت‌شده توسط Batuhan Taskaya در bpo-39639 و bpo-39969 و Serhiy Storchaka در bpo-39988.)

  • توابع PyEval_InitThreads() و PyEval_ThreadsInitialized() اکنون منسوخ شده‌اند و در Python 3.11 حذف خواهند شد. فراخوانی PyEval_InitThreads() اکنون هیچ کاری انجام نمی‌دهد. GIL از Python 3.7 به بعد توسط Py_Initialize() مقداردهی اولیه می‌شود. (مشارکت‌شده توسط Victor Stinner در bpo-39877.)

  • گذر دادن None به‌عنوان آرگومان اول به تابع shlex.split() منسوخ شده است. (مشارکت‌شده توسط Zackery Spytz در bpo-33262.)

  • smtpd.MailmanProxy() اکنون منسوخ شده است، زیرا بدون ماژول خارجی mailman قابل استفاده نیست. (مشارکت‌شده توسط Samuel Colvin در bpo-35800.)

  • ماژول lib2to3 اکنون یک PendingDeprecationWarning منتشر می‌کند. پایتون 3.9 به پارسر PEG تغییر کرد (به PEP 617 مراجعه کنید)، و ممکن است پایتون 3.10 شامل سینتکس جدیدی از زبان باشد که پارسر LL(1) ماژول lib2to3 نمی‌تواند آن را پارس کند. ممکن است ماژول lib2to3 در یک نسخه‌ی آینده‌ی پایتون از کتابخانه استاندارد حذف شود. جایگزین‌های شخص ثالثی مانند LibCST یا parso را در نظر بگیرید. (مشارکت‌شده توسط Carl Meyer در bpo-40360.)

  • پارامتر random در random.shuffle() منسوخ شده است. (مشارکت‌شده توسط Raymond Hettinger در bpo-40465)

حذف‌شده

  • نسخه‌ی نادرست در unittest.mock.__version__ حذف شد.

  • nntplib.NNTP: متدهای xpath() و xgtitle() حذف شده‌اند. این متدها از پایتون 3.3 منسوخ شده‌اند. به طور کلی، این توسعه‌ها توسط مدیران سرورهای NNTP پشتیبانی نمی‌شوند یا فعال نمی‌شوند. برای xgtitle()، لطفاً به جای آن از nntplib.NNTP.descriptions() یا nntplib.NNTP.description() استفاده کنید. (مشارکت‌شده توسط Donghee Na در bpo-39366.)

  • array.array: متدهای tostring() و fromstring() حذف شده‌اند. این متدها نام‌های مستعاری برای tobytes() و frombytes() بودند که از پایتون 3.2 منسوخ شده بودند. (با مشارکت ویکتور استینر در bpo-38916.)

  • تابع مستندسازی‌نشده sys.callstats() حذف شده است. از پایتون 3.7، این تابع منسوخ بود و همیشه None را برمی‌گرداند. این تابع به گزینه‌ی ساخت خاص CALL_PROFILE نیاز داشت که پیش‌تر در پایتون 3.7 حذف شده بود. (مشارکت‌شده توسط Victor Stinner در bpo-37414.)

  • توابع sys.getcheckinterval() و sys.setcheckinterval() حذف شده‌اند. این توابع از پایتون 3.2 منسوخ شده بودند. به جای آن‌ها از sys.getswitchinterval() و sys.setswitchinterval() استفاده کنید. (مشارکت‌شده توسط ویکتور استینر در bpo-37392.)

  • تابع C با نام PyImport_Cleanup() حذف شده است. در مستندات چنین آمده بود: «جدول ماژول را خالی می‌کند. فقط برای استفاده داخلی.» (مشارکت‌شده توسط Victor Stinner در bpo-36710.)

  • ماژول‌های _dummy_thread و dummy_threading حذف شده‌اند. این ماژول‌ها از پایتون 3.7 که به پشتیبانی نخ‌بندی نیاز دارد، منسوخ شده بودند. (مشارکت توسط Victor Stinner در bpo-37312.)

  • نام‌های مستعار aifc.openfp() برای aifc.open()، sunau.openfp() برای sunau.open() و wave.openfp() برای wave.open() حذف شده‌اند. این‌ها از پایتون 3.7 منسوخ شده بودند. (مشارکت‌شده توسط Victor Stinner در bpo-37320.)

  • متد isAlive() از threading.Thread حذف شده است. این متد از پایتون 3.8 منسوخ شده بود. به‌جای آن از is_alive() استفاده کنید. (با مشارکت Donghee Na در bpo-37804.)

  • متدهای getchildren() و getiterator() از کلاس‌های ElementTree و Element در ماژول ElementTree حذف شده‌اند. این متدها در پایتون 3.2 منسوخ شده بودند. به جای x.getchildren() از iter(x) یا list(x) و به جای x.getiterator() از x.iter() یا list(x.iter()) استفاده کنید. (مشارکت‌شده توسط Serhiy Storchaka در bpo-36543.)

  • API قدیمی plistlib حذف شده است؛ این API از پایتون 3.4 منسوخ شده بود. از توابع load()، loads()، dump() و dumps() استفاده کنید. علاوه بر این، پارامتر use_builtin_types حذف شد و در عوض همیشه از اشیای استاندارد bytes استفاده می‌شود. (مشارکت‌شده توسط جان جانزن در bpo-36409.)

  • تابع C PyGen_NeedsFinalizing حذف شده است. این تابع پس از پیاده‌سازی PEP 442 در هیچ‌جای سی‌پایتون مستند، آزمایش یا استفاده نشده بود. وصل توسط Joannah Nanjekye. (مشارکت‌شده توسط Joannah Nanjekye در bpo-15088)

  • base64.encodestring() و base64.decodestring()، نام‌های مستعاری که از پایتون 3.1 منسوخ شده بودند، حذف شده‌اند: به جای آن‌ها از base64.encodebytes() و base64.decodebytes() استفاده کنید. (ارائه‌شده توسط Victor Stinner در bpo-39351.)

  • تابع fractions.gcd() حذف شده است؛ این تابع از پایتون 3.5 (bpo-22486) منسوخ شده بود: به‌جای آن از math.gcd() استفاده کنید. (مشارکت‌شده توسط Victor Stinner در bpo-39350.)

  • پارامتر buffering از bz2.BZ2File حذف شده است. از پایتون 3.0 به بعد، این پارامتر نادیده گرفته می‌شد و استفاده از آن یک DeprecationWarning تولید می‌کرد. برای کنترل نحوه‌ی باز شدن پرونده، یک شیء پرونده‌ی باز ارسال کنید. (مشارکت ویکتور استینر در bpo-39357.)

  • پارامتر encoding از json.loads() حذف شده است. این پارامتر از پایتون 3.1 منسوخ بود و نادیده گرفته می‌شد؛ استفاده از آن از پایتون 3.8 موجب صدور DeprecationWarning شده است. (ارائه‌شده توسط Inada Naoki در bpo-39377)

  • دستورهای with (await asyncio.lock): و with (yield from asyncio.lock): دیگر پشتیبانی نمی‌شوند؛ به‌جای آن از async with lock استفاده کنید. همین موضوع برای asyncio.Condition و asyncio.Semaphore نیز صادق است. (مشارکت‌شده توسط Andrew Svetlov در bpo-34793.)

  • تابع sys.getcounts()، گزینه‌ی خط فرمان -X showalloccount و فیلد show_alloc_count از ساختار C PyConfig حذف شده‌اند. این موارد نیازمند ساخت‌ خاص پایتون با تعریف ماکروی COUNT_ALLOCS بودند. (مشارکت‌شده توسط ویکتور استینر در bpo-39489.)

  • ویژگی _field_types از کلاس typing.NamedTuple حذف‌شده است. این ویژگی از پایتون 3.8 منسوخ شده بود. به‌جای آن از ویژگی __annotations__ استفاده کنید. (مشارکت‌شده توسط Serhiy Storchaka در bpo-40182.)

  • متد symtable.SymbolTable.has_exec() حذف شده است. این متد از سال ۲۰۰۶ منسوخ بوده و هنگام فراخوانی فقط False برمی‌گرداند. (مشارکت‌شده توسط Batuhan Taskaya در bpo-40208)

  • متدهای asyncio.Task.current_task() و asyncio.Task.all_tasks() حذف شده‌اند. این متدها از پایتون 3.7 منسوخ شده بودند و می‌توانید به جای آن‌ها از asyncio.current_task() و asyncio.all_tasks() استفاده کنید. (مشارکت Rémi Lapeyre در bpo-40967)

  • متد unescape() در کلاس html.parser.HTMLParser حذف شده است (از پایتون 3.4 منسوخ شده بود). برای تبدیل ارجاع‌های نویسه به نویسه‌های یونیکد متناظر، باید از html.unescape() استفاده کرد.

انتقال به پایتون 3.9

این بخش، تغییراتی که پیش‌تر شرح داده‌شده‌اند و سایر رفع اشکال‌هایی را که ممکن است مستلزم تغییراتی در کد شما باشند، فهرست می‌کند.

تغییرات در API پایتون

  • __import__() و importlib.util.resolve_name() اکنون به جای ValueError که قبلاً پرتاب می‌کردند، ImportError پرتاب می‌کنند. فراخوانندگانی که نوع استثنای مشخص را می‌گیرند و هم پایتون 3.9 و هم نسخه‌های پیشین را پشتیبانی می‌کنند، باید هر دو را با استفاده از except (ImportError, ValueError): بگیرند.

  • اسکریپت‌های فعال‌سازی venv دیگر هنگامی که __VENV_PROMPT__ برابر "" تنظیم شده باشد، مورد خاصی در نظر نمی‌گیرند.

  • متد select.epoll.unregister() دیگر خطای EBADF را نادیده نمی‌گیرد. (مشارکت‌شده توسط Victor Stinner در bpo-39239.)

  • پارامتر compresslevel در bz2.BZ2File فقط‌کلیدواژه‌ای شد، زیرا پارامتر buffering حذف شده است. (مشارکت‌شده توسط Victor Stinner در bpo-39357.)

  • AST ساده‌شده برای :[subscription term]. اندیس‌های ساده با مقدار خود و اسلایس‌های توسعه‌یافته به‌صورت تاپل نمایش داده خواهند شد. Index(value) خودِ value را برمی‌گرداند و ExtSlice(slices) مقدار Tuple(slices, Load()) را برمی‌گرداند. (با مشارکت Serhiy Storchaka در bpo-34822.)

  • ماژول importlib اکنون متغیر محیطی PYTHONCASEOK را هنگام استفاده از گزینه‌های خط فرمان -E یا -I نادیده می‌گیرد.

  • پارامتر encoding به‌عنوان یک پارامتر فقط-کلیدواژه‌ای به کلاس‌های ftplib.FTP و ftplib.FTP_TLS افزوده شده است، و کدگذاری پیش‌فرض برای پیروی از RFC 2640 از Latin-1 به UTF-8 تغییر یافته است.

  • asyncio.loop.shutdown_default_executor() به AbstractEventLoop افزوده شده است؛ به این معنا که حلقه‌های رویداد جایگزینی که از آن ارث‌بری می‌کنند، باید این متد را تعریف کرده باشند. (ارائه‌شده توسط Kyle Stanley در bpo-34037.)

  • مقادیر ثابت پرچم‌های آینده در ماژول __future__ به‌منظور جلوگیری از تداخل با پرچم‌های کامپایلر به‌روزرسانی شده‌اند. پیش‌تر PyCF_ALLOW_TOP_LEVEL_AWAIT با CO_FUTURE_DIVISION تداخل داشت. (مشارکت‌شده توسط Batuhan Taskaya در bpo-39562)

  • array('u') اکنون به‌جای Py_UNICODE از wchar_t به‌عنوان نوع C استفاده می‌کند. این تغییر بر رفتار آن تأثیری ندارد، زیرا Py_UNICODE از پایتون 3.3 به بعد نام مستعار wchar_t است. (مشارکت‌شده توسط Inada Naoki در bpo-34538.)

  • API logging.getLogger() اکنون هنگامی که نام 'root' به آن داده شود، گزارش‌گیر ریشه را بازمی‌گرداند، در حالی که پیش‌تر گزارش‌گیر غیرریشه‌ای با نام 'root' را بازگرداند. این می‌تواند بر مواردی تأثیر بگذارد که در آن‌ها کد کاربر به‌طور صریح یک گزارش‌گیر غیرریشه با نام 'root' را می‌خواهد، یا در ماژول سطح بالایی به نام 'root.py' با استفاده از logging.getLogger(__name__) یک گزارش‌گیر نمونه‌سازی می‌کند. (مشارکت‌شده توسط وینای ساجیپ در bpo-37742.)

  • مدیریت تقسیم PurePath اکنون هنگامی که چیزی غیر از نمونه‌ای از str یا PurePath به آن ارسال شود، به جای ایجاد TypeError، NotImplemented را برمی‌گرداند. این امکان را فراهم می‌کند تا کلاس‌های سازگاری ایجاد کنید که از انواع ذکرشده ارث‌بری نمی‌کنند. (ارائه‌شده توسط Roger Aiudi در bpo-34775).

  • از پایتون 3.9.5 به بعد، ماژول ipaddress دیگر هیچ صفر ابتدایی‌ای در رشته‌های نشانی IPv4 نمی‌پذیرد. صفرهای ابتدایی مبهم هستند و توسط برخی کتابخانه‌ها به‌عنوان نمادگذاری مبنای هشت تفسیر می‌شوند. برای مثال، تابع قدیمی socket.inet_aton() صفرهای ابتدایی را به‌عنوان نمادگذاری مبنای هشت در نظر می‌گیرد. پیاده‌سازی glibc از تابع مدرن inet_pton() هیچ صفر ابتدایی‌ای را نمی‌پذیرد. (مشارکت‌شده توسط Christian Heimes در bpo-36384).

  • codecs.lookup() اکنون نام کدگذاری را به همان روش encodings.normalize_encoding() نرمال‌سازی می‌کند، با این تفاوت که codecs.lookup() نام را به حروف کوچک نیز تبدیل می‌کند. برای مثال، نام کدگذاری "latex+latin1" اکنون به "latex_latin1" نرمال‌سازی می‌شود. (مشارکت‌شده توسط Jordon Xu در bpo-37751.)

تغییرات در API زبان C

  • از پایتون 3.8 به بعد، نمونه‌های نوع‌های تخصیص‌یافته در هیپ (مانند نوع‌هایی که با PyType_FromSpec() و APIهای مشابه ایجاد می‌شوند) به شیء نوع خود ارجاع نگه می‌دارند. همان‌طور که در «تغییرات در API زبان C» پایتون 3.8 اشاره شده است، در اکثریت قاطع موارد نباید هیچ اثر جانبی وجود داشته باشد، اما برای نوع‌هایی که تابع سفارشی tp_traverse دارند، اطمینان حاصل کنید که تمام توابع سفارشی tp_traverse نوع‌های تخصیص‌یافته در هیپ، نوع شیء را بازدید می‌کنند.

    مثال:

    int
    foo_traverse(PyObject *self, visitproc visit, void *arg)
    {
    // Rest of the traverse function
    #if PY_VERSION_HEX >= 0x03090000
        // This was not needed before Python 3.9 (Python issue 35810 and 40217)
        Py_VISIT(Py_TYPE(self));
    #endif
    }
    

    اگر تابع پیمایش شما کار خود را به tp_traverse کلاس پایه‌اش (یا نوع دیگری) واگذاری می‌کند، اطمینان حاصل کنید که Py_TYPE(self) فقط یک‌بار بازدید شود. توجه داشته باشید که انتظار می‌رود تنها نوع‌های هیپ نوع را در tp_traverse بازدید کنند.

    برای مثال، اگر تابع tp_traverse شما شامل موارد زیر باشد:

    base->tp_traverse(self, visit, arg)
    

    سپس اضافه کنید:

    #if PY_VERSION_HEX >= 0x03090000
        // این مورد پیش از پایتون 3.9 لازم نبود (bpo-35810 و bpo-40217)
        if (base->tp_flags & Py_TPFLAGS_HEAPTYPE) {
            // در نوع‌های هیپ، tp_traverse از قبل Py_TYPE(self) را بازدید کرده است
        } else {
            Py_VISIT(Py_TYPE(self));
        }
    #else
    

    (برای اطلاعات بیشتر به bpo-35810 و bpo-40217 مراجعه کنید.)

  • توابع PyEval_CallObject، PyEval_CallFunction، PyEval_CallMethod و PyEval_CallObjectWithKeywords منسوخ شده‌اند. به جای آن‌ها از PyObject_Call() و گونه‌های آن استفاده کنید. (برای جزئیات بیشتر به bpo-29548 مراجعه کنید.)

تغییرات بایت‌کد سی‌پایتون

  • آپ‌کد LOAD_ASSERTION_ERROR برای مدیریت دستور assert افزوده شد. پیش‌تر، اگر استثنای AssertionError پوشانده شده بود، دستور assert به‌درستی کار نمی‌کرد. (مشارکت‌شده توسط Zackery Spytz در bpo-34880.)

  • آپ‌کد COMPARE_OP به چهار دستور مجزا تفکیک شد:

    • COMPARE_OP برای مقایسه‌های غنی (rich comparison)

    • IS_OP برای آزمون‌های 'is' و 'is not'

    • CONTAINS_OP برای آزمون‌های 'in' و 'not in'

    • JUMP_IF_NOT_EXC_MATCH برای بررسی استثناها در دستورهای 'try-except'.

    (با مشارکت Mark Shannon در bpo-39156.)

تغییرات ساخت

  • گزینه‌ی --with-platlibdir به اسکریپت configure اضافه شد: نام پوشه‌ی کتابخانه‌ی خاص پلتفرم، که در ویژگی جدید sys.platlibdir ذخیره می‌شود. برای اطلاعات بیشتر، ویژگی sys.platlibdir را ببینید. (مشارکت Jan Matějek، Matěj Cepl، Charalampos Stratakis و Victor Stinner در bpo-1294959.)

  • ماکروی ساخت‌ ویژه COUNT_ALLOCS حذف شده است. (مشارکت‌شده توسط Victor Stinner در bpo-39489.)

  • در پلتفرم‌های غیر ویندوزی، توابع setenv() و unsetenv() اکنون برای ساخت پایتون الزامی هستند. (ارائه‌شده توسط Victor Stinner در bpo-39395.)

  • در پلتفرم‌های غیر ویندوزی، ایجاد نصب‌کننده‌های bdist_wininst اکنون به‌طور رسمی پشتیبانی نمی‌شود. (برای جزئیات بیشتر به bpo-10945 مراجعه کنید.)

  • هنگام ساخت پایتون روی macOS از کد منبع، _tkinter اکنون در صورتی که چارچوب‌های غیرسیستمی Tcl و Tk در /Library/Frameworks نصب شده باشند، با آن‌ها لینک می‌شود؛ همان‌طور که در نسخه‌های قدیمی‌تر macOS چنین بود. اگر یک SDK از macOS به‌طور صریح پیکربندی شده باشد (با استفاده از --enable-universalsdk یا -isysroot)، فقط خودِ SDK جستجو می‌شود. رفتار پیش‌فرض همچنان می‌تواند با --with-tcltk-includes و --with-tcltk-libs بازنویسی شود. (مشارکت‌شده توسط Ned Deily در bpo-34956.)

  • اکنون می‌توان پایتون را برای Windows 10 ARM64 ساخت. (با مشارکت Steve Dower در bpo-33125.)

  • اکنون هنگام استفاده از --pgo، برخی از آزمون‌های منفرد نادیده گرفته می‌شوند. آزمون‌های مذکور زمان انجام وظیفه PGO را به‌طور چشمگیری افزایش می‌دادند و به احتمال زیاد کمکی به بهبود بهینه‌سازی پرونده اجرایی نهایی نمی‌کردند. این امر سرعت انجام وظیفه را حدود ۱۵ برابر افزایش می‌دهد. اجرای مجموعه کامل آزمون‌های واحد کند است. این تغییر ممکن است باعث شود ساخت کمی کمتر بهینه باشد، زیرا شاخه‌های کد کمتری اجرا خواهند شد. اگر حاضر باشید برای ساخت بسیار کندتر منتظر بمانید، می‌توان رفتار قدیمی را با استفاده از ./configure [..] PROFILE_TASK="-m test --pgo-extended" بازگرداند. ما هیچ تضمینی نمی‌دهیم که کدام مجموعه وظایف PGO ساخت سریع‌تری تولید می‌کند. کاربرانی که این موضوع برایشان اهمیت دارد، باید بنچمارک‌های مربوط به خودشان را اجرا کنند، زیرا نتایج می‌توانند به محیط، بار کاری و زنجیره ابزار کامپایلر وابسته باشند. (برای جزئیات بیشتر به bpo-36044 و bpo-37707 مراجعه کنید.)

تغییرات C API

قابلیت‌های جدید

  • PEP 573: PyType_FromModuleAndSpec() برای مرتبط کردن یک ماژول با یک کلاس اضافه شد؛ PyType_GetModule() و PyType_GetModuleState() برای بازیابی ماژول و وضعیت آن؛ و PyCMethod و METH_METHOD برای اینکه به یک متد اجازه دهند به کلاسی که در آن تعریف شده است دسترسی داشته باشد. (مشارکت‌شده توسط مارسل پلچ و پتر ویکتورین در bpo-38787.)

  • تابع PyFrame_GetCode() افزوده شد: دریافت کد یک فریم. تابع PyFrame_GetBack() افزوده شد: دریافت فریم بیرونی بعدی از فریم. (مشارکت‌شده توسط Victor Stinner در bpo-40421.)

  • PyFrame_GetLineNumber() به API محدود C اضافه شد. (مشارکت‌شده توسط Victor Stinner در bpo-40421.)

  • توابع PyThreadState_GetInterpreter() و PyInterpreterState_Get() برای دریافت مفسر اضافه شدند. تابع PyThreadState_GetFrame() برای دریافت فریم فعلی وضعیت نخ پایتون اضافه شد. تابع PyThreadState_GetID() اضافه شد: دریافت شناسه یکتای وضعیت نخ پایتون. (نوشته‌شده توسط Victor Stinner در bpo-39947.)

  • تابع عمومی جدید PyObject_CallNoArgs() به API زبان C اضافه شد که یک شیء پایتون فراخوانی‌پذیر را بدون هیچ آرگومانی فراخوانی می‌کند. این کارآمدترین روش برای فراخوانی یک شیء پایتون فراخوانی‌پذیر بدون هیچ آرگومانی است. (مشارکت‌شده توسط Victor Stinner در bpo-37194.)

  • تغییرات در API محدود C (اگر ماکروی Py_LIMITED_API تعریف شده باشد):

    • Py_EnterRecursiveCall() و Py_LeaveRecursiveCall() به‌عنوان توابع معمولی برای API محدود ارائه شده‌اند. پیش‌تر، این توابع به‌صورت ماکرو تعریف شده بودند، اما این ماکروها با C API محدود کامپایل نمی‌شدند، زیرا این API نمی‌تواند به فیلد PyThreadState.recursion_depth دسترسی داشته باشد (ساختار مذکور در C API محدود مات است).

    • PyObject_INIT() و PyObject_INIT_VAR() به توابع معمولی «مات» تبدیل می‌شوند تا جزئیات پیاده‌سازی را پنهان کنند.

    (مشارکت‌شده توسط ویکتور استینر در bpo-38644 و bpo-39542.)

  • تابع PyModule_AddType() برای کمک به افزودن یک نوع به یک ماژول افزوده‌شده است. (مشارکت‌شده توسط Donghee Na در bpo-40024.)

  • توابع PyObject_GC_IsTracked() و PyObject_GC_IsFinalized() به API عمومی افزوده شدند تا به ترتیب بتوان پرس‌وجو کرد که آیا اشیای پایتون در حال حاضر پیگیری می‌شوند یا پیش‌تر توسط زباله‌روب نهایی‌شده‌اند. (مشارکت‌شده توسط پابلو گالیندو سالگادو در bpo-40241.)

  • تابع _PyObject_FunctionStr() برای به دست آوردن بازنمایی رشته‌ای کاربرپسند از یک شیء شبه‌تابع افزوده شد. (وصل توسط Jeroen Demeyer در bpo-37645.)

  • تابع PyObject_CallOneArg() برای فراخوانی یک شیء با یک آرگومان جایگاهی افزوده شد (وصل توسط Jeroen Demeyer در bpo-37483.)

انتقال به پایتون 3.9

  • PyInterpreterState.eval_frame (PEP 523) اکنون به یک پارامتر الزامی جدید tstate (PyThreadState*) نیاز دارد. (مشارکت‌شده توسط Victor Stinner در bpo-38500.)

  • ماژول‌های توسعه‌ای: توابع m_traverse، m_clear و m_free در PyModuleDef دیگر فراخوانی نمی‌شوند اگر وضعیت ماژول درخواست شده باشد اما هنوز تخصیص نیافته باشد. این حالت بلافاصله پس از ایجاد ماژول و پیش از اجرای آن برقرار است (تابع Py_mod_exec). به بیان دقیق‌تر، این توابع فراخوانی نمی‌شوند اگر m_size بزرگ‌تر از ۰ باشد و وضعیت ماژول (همان‌طور که توسط PyModule_GetState() بازگردانده می‌شود) برابر NULL باشد.

    ماژول‌های توسعه‌ای فاقد وضعیت ماژول (m_size <= 0) تأثیر نمی‌پذیرند.

  • اگر Py_AddPendingCall() در یک زیرمفسر فراخوانی شود، این تابع اکنون برای فراخوانی از خودِ زیرمفسر زمان‌بندی می‌شود، نه از مفسر اصلی. هر زیرمفسر اکنون فهرست فراخوانی‌های زمان‌بندی‌شده‌ی خود را دارد. (مشارکت‌شده توسط Victor Stinner در bpo-39984.)

  • هنگامی که گزینه‌ی -E استفاده می‌شود (اگر PyConfig.use_environment برابر 0 تنظیم شده باشد)، رجیستری ویندوز دیگر برای مقداردهی اولیه‌ی sys.path استفاده نمی‌شود. این موضوع هنگام تعبیه پایتون در ویندوز اهمیت دارد. (مشارکت‌شده توسط Zackery Spytz در bpo-8901.)

  • متغیر سراسری PyStructSequence_UnnamedField اکنون یک ثابت است و به یک رشته ثابت ارجاع می‌دهد. (مشارکت‌شده توسط Serhiy Storchaka در bpo-38650.)

  • ساختار PyGC_Head اکنون مات است. این ساختار تنها در API داخلی C (pycore_gc.h) تعریف‌شده است. (مشارکت‌شده توسط Victor Stinner در bpo-40241.)

  • Py_UNICODE_COPY، Py_UNICODE_FILL، PyUnicode_WSTR_LENGTH، PyUnicode_FromUnicode()، PyUnicode_AsUnicode()، _PyUnicode_AsUnicode و PyUnicode_AsUnicodeAndSize() در C به‌عنوان منسوخ علامت‌گذاری شده‌اند. آن‌ها از پایتون 3.3 به بعد توسط PEP 393 منسوخ شده‌اند. (مشارکت‌شده توسط Inada Naoki در bpo-36346.)

  • تابع Py_FatalError() با ماکرویی جایگزین شده است که به‌طور خودکار نام تابع فعلی را ثبت می‌کند، مگر آنکه ماکرو Py_LIMITED_API تعریف شده باشد. (مشارکت‌شده توسط Victor Stinner در bpo-39882.)

  • پروتکل فراخوانی برداری (vectorcall) اکنون الزام می‌کند که فراخوانی‌کننده فقط رشته‌ها را به‌عنوان نام‌های کلیدواژه عبور دهد. (برای اطلاعات بیشتر به bpo-37540 مراجعه کنید.)

  • جزئیات پیاده‌سازی تعدادی از ماکروها و توابع اکنون پنهان شده‌اند:

    • ماکروی PyObject_IS_GC() به یک تابع تبدیل شد.

    • ماکروی PyObject_NEW() به نام مستعاری برای ماکروی PyObject_New تبدیل می‌شود و ماکروی PyObject_NEW_VAR() به نام مستعاری برای ماکروی PyObject_NewVar تبدیل می‌شود. این ماکروها دیگر مستقیماً به عضو PyTypeObject.tp_basicsize دسترسی ندارند.

    • ماکرو PyObject_GET_WEAKREFS_LISTPTR() به یک تابع تبدیل شد: این ماکرو مستقیماً به عضو PyTypeObject.tp_weaklistoffset دسترسی داشت.

    • ماکرو PyObject_CheckBuffer() به یک تابع تبدیل شد: این ماکرو مستقیماً به عضو PyTypeObject.tp_as_buffer دسترسی داشت.

    • PyIndex_Check() اکنون همیشه به‌صورت یک تابع مات اعلان می‌شود تا جزئیات پیاده‌سازی پنهان بماند: ماکرو PyIndex_Check() حذف شد. این ماکرو مستقیماً به عضو PyTypeObject.tp_as_number دسترسی داشت.

    (برای جزئیات بیشتر به bpo-40170 مراجعه کنید.)

حذف‌شده

  • ماکروهای PyFPE_START_PROTECT() و PyFPE_END_PROTECT() در pyfpe.h از C API محدود حذف شدند. (مشارکت‌شده توسط Victor Stinner در bpo-38835.)

  • جایگاه tp_print در PyTypeObject حذف شده است. این جایگاه در پایتون 2.7 و قبل از آن برای چاپ اشیاء در پرونده‌ها استفاده می‌شد. از پایتون 3.0 به بعد، نادیده گرفته شده و استفاده نمی‌شده است. (مشارکت‌شده توسط Jeroen Demeyer در bpo-36974.)

  • تغییرات در API محدود C (اگر ماکروی Py_LIMITED_API تعریف شده باشد):

    • توابع زیر از C API محدود مستثنا شدند:

      • PyThreadState_DeleteCurrent() (مشارکت‌شده توسط Joannah Nanjekye در bpo-37878.)

      • _Py_CheckRecursionLimit

      • _Py_NewReference()

      • _Py_ForgetReference()

      • _PyTraceMalloc_NewReference()

      • _Py_GetRefTotal()

      • سازوکار سطل زباله (trashcan) که هرگز در C API محدود کار نمی‌کرد.

      • PyTrash_UNWIND_LEVEL

      • Py_TRASHCAN_BEGIN_CONDITION

      • Py_TRASHCAN_BEGIN

      • Py_TRASHCAN_END

      • Py_TRASHCAN_SAFE_BEGIN

      • Py_TRASHCAN_SAFE_END

    • توابع و تعریف‌های زیر به API داخلی C منتقل شدند:

      • _PyDebug_PrintTotalRefs()

      • _Py_PrintReferences()

      • _Py_PrintReferenceAddresses()

      • _Py_tracemalloc_config

      • _Py_AddToAllObjects() (ویژه‌ی ساخت‌ Py_TRACE_REFS)

    (مشارکت‌شده توسط ویکتور استینر در bpo-38644 و bpo-39542.)

  • قلاب _PyRuntime.getframe و ماکروی _PyThreadState_GetFrame که مستعاری برای _PyRuntime.getframe بود، حذف شدند. این‌ها فقط توسط API داخلی C در دسترس بودند. نوع PyThreadFrameGetter نیز حذف شد. (مشارکت‌شده توسط Victor Stinner در bpo-39946.)

  • توابع زیر از C API حذف شدند. برای پاک‌سازی تمام فهرست‌های آزاد، PyGC_Collect() را صریحاً فراخوانی کنید. (مشارکت‌شده توسط Inada Naoki و Victor Stinner در bpo-37340، bpo-38896 و bpo-40428.)

    • PyAsyncGen_ClearFreeLists()

    • PyContext_ClearFreeList()

    • PyDict_ClearFreeList()

    • PyFloat_ClearFreeList()

    • PyFrame_ClearFreeList()

    • PyList_ClearFreeList()

    • PyMethod_ClearFreeList() و PyCFunction_ClearFreeList(): فهرست‌های آزاد (free list) اشیاء متد مقید حذف شده‌اند.

    • PySet_ClearFreeList(): فهرست آزاد (free list) مجموعه در پایتون 3.4 حذف شده است.

    • PyTuple_ClearFreeList()

    • PyUnicode_ClearFreeList(): فهرست آزاد یونیکد در پایتون 3.3 حذف شده است.

  • تابع _PyUnicode_ClearStaticStrings() حذف شد. (به کوشش Victor Stinner در bpo-39465.)

  • Py_UNICODE_MATCH حذف شد. این مورد توسط PEP 393 منسوخ اعلام شده است و از پایتون 3.3 به بعد خراب بوده است. می‌توان به جای آن از تابع PyUnicode_Tailmatch() استفاده کرد. (مشارکت‌شده توسط Inada Naoki در bpo-36346.)

  • پرونده‌های سرآیند از رابط‌هایی که تعریف شده بودند اما پیاده‌سازی نداشتند، پاک‌سازی شدند. نمادهای API عمومی که حذف می‌شوند عبارت‌اند از: _PyBytes_InsertThousandsGroupingLocale، _PyBytes_InsertThousandsGrouping، _Py_InitializeFromArgs، _Py_InitializeFromWideArgs، _PyFloat_Repr، _PyFloat_Digits، _PyFloat_DigitsInit، PyFrame_ExtendStack، _PyAIterWrapper_Type، PyNullImporter_Type، PyCmpWrapper_Type، PySortWrapper_Type، PyNoArgsFunction. (مشارکت‌شده توسط پابلو گالیندو سالگادو در bpo-39372.)

تغییرات قابل‌توجه در پایتون 3.9.1

typing

رفتار typing.Literal تغییر یافت تا با PEP 586 مطابقت داشته باشد و با رفتار بررسی‌گرهای نوع ایستا که در آن PEP مشخص شده است، هم‌خوانی کند.

  1. Literal اکنون پارامترهای تکراری را حذف می‌کند.

  2. مقایسه‌های برابری بین اشیاء Literal اکنون مستقل از ترتیب هستند.

  3. مقایسه‌های Literal اکنون نوع‌ها را در نظر می‌گیرند. برای مثال، Literal[0] == Literal[False] پیش‌تر به True ارزیابی می‌شد. اکنون False است. برای پشتیبانی از این تغییر، نهانگاه نوعِ استفاده‌شده به‌صورت داخلی اکنون از تمایز نوع‌ها پشتیبانی می‌کند.

  4. شیءهای Literal اکنون هنگام مقایسه‌های برابری، اگر هر یک از پارامترهایشان هش‌پذیر نباشد، استثنای TypeError ایجاد می‌کنند. توجه داشته باشید که تعریف Literal با پارامترهای تغییرپذیر خطایی پرتاب نمی‌کند:

    >>> from typing import Literal
    >>> Literal[{0}]
    >>> Literal[{0}] == Literal[{False}]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: unhashable type: 'set'
    

(مشارکت‌شده توسط Yurii Karabas در bpo-42345.)

پشتیبانی از macOS 11.0 (Big Sur) و مک‌های Apple Silicon

از نسخه‌ی 3.9.1 به بعد، پایتون اکنون به‌طور کامل از ساخت و اجرا روی macOS 11.0 (Big Sur) و روی مک‌های Apple Silicon (مبتنی بر معماری ARM64) پشتیبانی می‌کند. یک گونه‌ی ساخت همگانی جدید، universal2، اکنون در دسترس است تا از هر دو ARM64 و Intel 64 به‌صورت بومی در یک مجموعه از پرونده‌های اجرایی پشتیبانی کند. همچنین اکنون می‌توان پرونده‌های دودویی را روی نسخه‌های فعلی macOS ساخت تا روی طیفی از نسخه‌های قدیمی‌تر macOS مستقر شوند (تا نسخه‌ی 10.9 آزمایش شده است)؛ در عین حال، برخی از توابع و گزینه‌های جدیدتر سیستم‌عامل به‌صورت مشروط و بر اساس نسخه‌ی سیستم‌عاملی که در زمان اجرا استفاده می‌شود در دسترس قرار می‌گیرند (پیوند‌دهی ضعیف یا "weaklinking").

(مشارکت‌شده توسط رونالد اوسورن و لارنس دآنا در bpo-41100.)

تغییرات قابل توجه در پایتون 3.9.2

collections.abc

نوع عام collections.abc.Callable اکنون پارامترهای نوع را تخت‌سازی می‌کند، مشابه کاری که typing.Callable در حال حاضر انجام می‌دهد. این بدان معناست که collections.abc.Callable[[int, str], str] دارای __args__ برابر با (int, str, str) خواهد بود؛ پیش‌تر این مقدار ([int, str], str) بود. برای امکان‌پذیر کردن این تغییر، types.GenericAlias اکنون قابل زیرکلاس‌سازی است و هنگام زیرنویسی نوع collections.abc.Callable، یک زیرکلاس بازگردانده خواهد شد. کدهایی که به آرگومان‌ها از طریق typing.get_args() یا __args__ دسترسی دارند، باید این تغییر را در نظر بگیرند. ممکن است DeprecationWarning برای شکل‌های نامعتبر پارامتری‌سازی collections.abc.Callable که ممکن است در پایتون 3.9.1 بی‌صدا عبور کرده باشند، صادر شود. این DeprecationWarning در پایتون 3.10 به TypeError تبدیل خواهد شد. (با مشارکت Ken Jin در bpo-42195.)

urllib.parse

نسخه‌های پیشین پایتون اجازه می‌دادند که هم از ; و هم از & به‌عنوان جداکننده‌ی پارامترهای پرس‌وجو در urllib.parse.parse_qs() و urllib.parse.parse_qsl() استفاده شود. به‌دلیل نگرانی‌های امنیتی، و برای انطباق با توصیه‌های جدیدتر W3C، این مورد تغییر کرده است تا تنها یک کلید جداکننده مجاز باشد که مقدار پیش‌فرض آن & است. این تغییر بر cgi.parse() و cgi.parse_multipart() نیز اثر می‌گذارد، زیرا این توابع به‌طور داخلی از توابع مذکور استفاده می‌کنند. برای جزئیات بیشتر، لطفاً به مستندات مربوط به هر یک از آن‌ها مراجعه کنید. (با مشارکت آدام گلدشمیت، سنتیل کوماران و کن جین در bpo-42967.)

تغییرات قابل‌توجه در پایتون 3.9.3

یک اصلاح امنیتی رفتار ftplib.FTP را تغییر می‌دهد تا هنگام راه‌اندازی کانال داده غیرفعال، به نشانی IPv4 ارسال‌شده از سوی سرور از راه دور اعتماد نکند. در عوض، ما از نشانی IP سرور ftp بازاستفاده می‌کنیم. برای کدهای غیرمعمولی که به رفتار قدیمی نیاز دارند، ویژگی trust_server_pasv_ipv4_address را روی نمونه FTP خود برابر با True قرار دهید. (به gh-87451 مراجعه کنید)

تغییرات قابل توجه در پایتون 3.9.5

urllib.parse

وجود نویسه‌های سطر جدید یا تب در بخش‌هایی از یک URL، امکان برخی انواع حملات را فراهم می‌کند. مطابق با مشخصات WHATWG که RFC 3986 را به‌روزرسانی می‌کند، نویسه‌های اسکی سطر جدید \n، \r و نویسه‌های تب \t توسط پارسر در urllib.parse از URL حذف می‌شوند تا از چنین حملاتی جلوگیری شود. نویسه‌های حذف‌شونده توسط یک متغیر جدید در سطح ماژول به نام urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE کنترل می‌شوند. (نگاه کنید به gh-88048)

قابلیت امنیتی قابل توجه در 3.9.14

اکنون تبدیل بین int و str در مبناهایی غیر از ۲ (دودویی)، ۴، ۸ (مبنای هشت)، ۱۶ (مبنای شانزده) یا ۳۲ — مانند مبنای ۱۰ (ده‌دهی) — در صورتی که تعداد ارقام به شکل رشته از حدی بیشتر باشد، استثنای ValueError ایجاد می‌کند تا از حملات احتمالی انکار سرویس ناشی از پیچیدگی الگوریتمی جلوگیری شود. این یک اقدام کاهش‌دهنده برای CVE 2020-10735 است. این محدودیت را می‌توان با استفاده از متغیر محیطی، پرچم خط فرمان یا API‌های sys پیکربندی یا غیرفعال کرد. به مستندات محدودیت طول تبدیل عدد صحیح به رشته مراجعه کنید. محدودیت پیش‌فرض، ۴۳۰۰ رقم به شکل رشته است.

تغییرات قابل توجه در 3.9.17

tarfile

  • متدهای استخراج در tarfile و shutil.unpack_archive() آرگومان جدیدی به نام filter دارند که امکان محدود کردن ویژگی‌های tar را فراهم می‌کند؛ ویژگی‌هایی که ممکن است غافلگیرکننده یا خطرناک باشند، مانند ایجاد پرونده‌ها بیرون از پوشه‌ی مقصد. برای جزئیات، به فیلترهای استخراج مراجعه کنید. در پایتون 3.12، استفاده بدون آرگومان فیلتر باعث نمایش DeprecationWarning خواهد شد. در پایتون 3.14، پیش‌فرض به 'data' تغییر خواهد کرد. (مشارکت‌شده توسط Petr Viktorin در PEP 706.)