تازههای پایتون 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از ساختار CPyConfigحذف شدهاند. این موارد نیازمند ساخت خاص پایتون با تعریف ماکروی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
توابع
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()به توابع معمولی «مات» تبدیل میشوند تا جزئیات پیادهسازی را پنهان کنند.
تابع
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_LEVELPy_TRASHCAN_BEGIN_CONDITIONPy_TRASHCAN_BEGINPy_TRASHCAN_ENDPy_TRASHCAN_SAFE_BEGINPy_TRASHCAN_SAFE_END
توابع و تعریفهای زیر به API داخلی C منتقل شدند:
_PyDebug_PrintTotalRefs()_Py_PrintReferences()_Py_PrintReferenceAddresses()_Py_tracemalloc_config_Py_AddToAllObjects()(ویژهی ساختPy_TRACE_REFS)
قلاب
_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 مشخص شده است، همخوانی کند.
Literalاکنون پارامترهای تکراری را حذف میکند.مقایسههای برابری بین اشیاء
Literalاکنون مستقل از ترتیب هستند.مقایسههای
Literalاکنون نوعها را در نظر میگیرند. برای مثال،Literal[0] == Literal[False]پیشتر بهTrueارزیابی میشد. اکنونFalseاست. برای پشتیبانی از این تغییر، نهانگاه نوعِ استفادهشده بهصورت داخلی اکنون از تمایز نوعها پشتیبانی میکند.شیءهای
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.)