تازههای پایتون 3.8¶
- ویرایشگر:
Raymond Hettinger
این مقاله قابلیتهای جدید پایتون 3.8 را در مقایسه با 3.7 توضیح میدهد. پایتون 3.8 در ۱۴ اکتبر ۲۰۱۹ منتشر شد. برای جزئیات کامل، به فهرست تغییرات مراجعه کنید.
خلاصه -- نکات برجسته انتشار¶
ویژگیهای جدید¶
عبارتهای انتساب¶
سینتکس جدید := وجود دارد که بهعنوان بخشی از یک عبارت بزرگتر، مقادیر را به متغیرها انتساب میدهد. این عملگر بهخاطر شباهتش به چشمها و عاجهای یک گراز دریایی، با محبت «عملگر گراز دریایی» نامیده میشود.
در این مثال، عبارت انتساب به جلوگیری از فراخوانی دوبارهی len() کمک میکند:
if (n := len(a)) > 10:
print(f"List is too long ({n} elements, expected <= 10)")
منفعتی مشابه در حین تطبیق عبارت باقاعده پدید میآید که در آن اشیاء تطبیق دو بار مورد نیاز هستند، یک بار برای آزمودن اینکه آیا تطبیقی رخ داده است و بار دیگر برای استخراج یک زیرگروه:
discount = 0.0
if (mo := re.search(r'(\d+)% discount', advertisement)):
discount = float(mo.group(1)) / 100.0
این عملگر همچنین با حلقههای while که مقداری را برای آزمودن خاتمه حلقه محاسبه میکنند و سپس در بدنه حلقه دوباره به همان مقدار نیاز دارند، مفید است:
# Loop over fixed length blocks
while (block := f.read(256)) != '':
process(block)
مورد استفادهی انگیزشی دیگری در درکهای فهرستی رخ میدهد که در آنها مقداری که در شرط فیلتر محاسبه میشود، در بدنهی عبارت نیز مورد نیاز است:
[clean_name.title() for name in names
if (clean_name := normalize('NFC', name)) in allowed_names]
سعی کنید استفاده از عملگر گراز دریایی را به موارد تمیزی محدود کنید که پیچیدگی را کاهش میدهند و خوانایی را بهبود میبخشند.
برای توضیح کامل به PEP 572 مراجعه کنید.
(مشارکتشده توسط Emily Morehouse در bpo-35224.)
پارامترهای صرفاً جایگاهی¶
یک سینتکس جدید / برای پارامترهای تابع وجود دارد که نشان میدهد برخی پارامترهای تابع باید بهصورت جایگاهی مشخص شوند و نمیتوان از آنها بهعنوان آرگومان کلیدواژهای استفاده کرد. این همان نمادی است که help() برای توابع C حاشیهنویسیشده با ابزار Argument Clinic لری هستینگز نمایش میدهد.
در مثال زیر، پارامترهای a و b فقط جایگاهی هستند، در حالی که c یا d میتوانند جایگاهی یا کلیدواژهای باشند و e یا f باید کلیدواژهای باشند:
def f(a, b, /, c, d, *, e, f):
print(a, b, c, d, e, f)
فراخوانی زیر معتبر است:
f(10, 20, 30, d=40, e=50, f=60)
با این حال، اینها فراخوانیهای نامعتبر هستند:
f(10, b=20, c=30, d=40, e=50, f=60) # b cannot be a keyword argument
f(10, 20, 30, 40, 50, f=60) # e must be a keyword argument
یکی از موارد کاربرد این نمادگذاری این است که به توابع پایتون خالص اجازه میدهد رفتار توابع موجودی را که به زبان C نوشته شدهاند، بهطور کامل تقلید کنند. برای مثال، تابع توکار divmod() آرگومانهای کلیدواژهای را نمیپذیرد:
def divmod(a, b, /):
"Emulate the built in divmod() function"
return (a // b, a % b)
مورد استفادهی دیگر، جلوگیری از آرگومانهای کلیدواژهای در حالتی است که نام پارامتر سودمند نباشد. برای مثال، تابع توکار len() امضای len(obj, /) را دارد. این امر مانع از فراخوانیهای ناخوشایندی مانند موارد زیر میشود:
len(obj='hello') # آرگومان کلیدواژهای «obj» خوانایی را مختل میکند
مزیت دیگر علامتگذاری یک پارامتر بهعنوان فقطجایگاهی این است که نام پارامتر را میتوان در آینده بدون خطر خراب شدن کد کلاینت تغییر داد. برای مثال، در ماژول statistics، نام پارامتر dist ممکن است در آینده تغییر کند. این امر با مشخصات تابع زیر ممکن شد:
def quantiles(dist, /, *, n=4, method='exclusive')
...
از آنجا که پارامترهای سمت چپِ / بهعنوان کلیدواژههای ممکن عرضه نمیشوند، نامهای پارامترها همچنان برای استفاده در **kwargs در دسترس باقی میمانند:
>>> def f(a, b, /, **kwargs):
... print(a, b, kwargs)
...
>>> f(10, 20, a=1, b=2, c=3) # a and b are used in two ways
10 20 {'a': 1, 'b': 2, 'c': 3}
این امر پیادهسازی توابع و متدهایی را که باید آرگومانهای کلیدواژهای دلخواه بپذیرند، بهطور چشمگیری ساده میکند. برای مثال، در ادامه بخشی از کد ماژول collections آمده است:
class Counter(dict):
def __init__(self, iterable=None, /, **kwds):
# Note "iterable" is a possible keyword argument
برای توضیح کامل به PEP 570 مراجعه کنید.
(مشارکتشده توسط Pablo Galindo در bpo-36540.)
نهانگاه موازی سامانه فایلبندی برای پروندههای بایتکد کامپایلشده¶
تنظیم جدید PYTHONPYCACHEPREFIX (که بهصورت -X pycache_prefix نیز در دسترس است) نهانگاه بایتکد ضمنی را پیکربندی میکند تا بهجای زیرپوشههای پیشفرض __pycache__ در هر پوشهی منبع، از یک درخت سامانه فایلبندی موازی جداگانه استفاده کند.
مکان نهانگاه در sys.pycache_prefix گزارش میشود (None نشاندهندهی مکان پیشفرض در زیرپوشههای __pycache__ است).
(مشارکتشده توسط کارل مایر در bpo-33499.)
ساخت اشکالزدایی از همان ABI ساخت انتشار استفاده میکند¶
ABI نسخههای اشکالزدایی پایتون اکنون با نسخههای انتشار پایتون سازگار است. در یونیکس، هنگامی که پایتون در حالت اشکالزدایی ساخته میشود، اکنون میتوان ماژولهای توسعهای C ساختهشده در حالت انتشار و ماژولهای توسعهای C ساختهشده با استفاده از ABI پایدار را بارگذاری کرد. برعکس این موضوع صادق نیست، زیرا نسخههای اشکالزدایی نمادهای اضافیای را نمایان میکنند که در نسخههای انتشار در دسترس نیستند.
تعریف ماکروی Py_DEBUG دیگر مستلزم تعریف ماکروی Py_TRACE_REFS نیست، که این امر تنها ناسازگاری ABI را ایجاد میکند. ماکروی Py_TRACE_REFS، که تابع sys.getobjects() و متغیر محیطی PYTHONDUMPREFS را اضافه میکند، میتواند با استفاده از گزینهی ساخت جدید ./configure --with-trace-refs تنظیم شود. (نوشتهشده توسط ویکتور استینر در bpo-36465.)
در یونیکس، ماژولهای توسعهای C دیگر به libpython پیوند نمیشوند، بهجز در اندروید و Cygwin. اکنون پایتونِ پیوندشده بهصورت ایستا میتواند یک ماژول توسعهای C را که با استفاده از پایتونِ کتابخانهاشتراکی ساختهشده است، بارگذاری کند. (مشارکتشده توسط Victor Stinner در bpo-21536.)
در یونیکس، هنگامی که پایتون در حالت اشکالزدایی ساخته میشود، ایمپورت اکنون ماژولهای توسعهای C کامپایلشده در حالت انتشار و ماژولهای توسعهای C کامپایلشده با ABI پایدار را نیز جستوجو میکند. (مشارکتشده توسط Victor Stinner در bpo-36722.)
برای تعبیه کردن پایتون در یک برنامه، باید گزینهی جدید --embed به python3-config --libs --embed داده شود تا -lpython3.8 به دست آید (پیوند دادن برنامه به libpython). برای پشتیبانی از هر دو نسخهی 3.8 و نسخههای قدیمیتر، ابتدا python3-config --libs --embed را امتحان کنید و در صورت شکست فرمان قبلی، بهعنوان جایگزین از python3-config --libs (بدون --embed) استفاده کنید.
یک ماژول pkg-config python-3.8-embed برای تعبیه پایتون در یک برنامه اضافه شد: pkg-config python-3.8-embed --libs شامل -lpython3.8 است. برای پشتیبانی از هر دو 3.8 و نسخههای قدیمیتر، ابتدا pkg-config python-X.Y-embed --libs را امتحان کنید و اگر دستور قبلی شکست بخورد، به pkg-config python-X.Y --libs (بدون --embed) بهعنوان جایگزین روی بیاورید (بهجای X.Y نسخه پایتون را قرار دهید).
از سوی دیگر، pkg-config python3.8 --libs دیگر شامل -lpython3.8 نیست. ماژولهای توسعهای C نباید به libpython پیوند داده شوند (بهجز در Android و Cygwin که مواردشان توسط اسکریپت مدیریت میشود)؛ این تغییر عمداً ناسازگار با نسخههای پیشین است. (مشارکتشده توسط Victor Stinner در bpo-36721.)
افاسترینگها = را برای عبارتهای خودمستند و اشکالزدایی پشتیبانی میکنند¶
مشخصکنندهی = به افاسترینگها اضافه شد. افاسترینگی مانند f'{expr=}' به متن عبارت، یک علامت تساوی و سپس بازنمایی عبارت ارزیابیشده بسط مییابد. برای مثال:
>>> import datetime as dt
>>> user = 'eric_idle'
>>> member_since = dt.date(1975, 7, 31)
>>> f'{user=} {member_since=}'
"user='eric_idle' member_since=datetime.date(1975, 7, 31)"
مشخصکنندههای معمول قالب افاسترینگ به شما اجازه میدهند کنترل بیشتری بر نحوهی نمایش نتیجهی عبارت داشته باشید:
>>> delta = dt.date.today() - member_since
>>> f'{user=!s} {delta.days=:,d}'
'user=eric_idle delta.days=16,075'
مشخصکنندهی = کل عبارت را نمایش میدهد تا بتوان محاسبات را نشان داد:
>>> print(f'{theta=} {cos(radians(theta))=:.3f}')
theta=30 cos(radians(theta))=0.866
(با مشارکت اریک وی. اسمیت و لری هیستینگز در bpo-36817.)
PEP 578: قلابهای حسابرسی رانتایم پایتون¶
این PEP یک قلاب حسابرسی (Audit Hook) و یک قلاب باز کردن تأییدشده (Verified Open Hook) اضافه میکند. هر دو از پایتون و کد بومی در دسترساند و به برنامهها و چارچوبهای نوشتهشده با کد پایتون خالص اجازه میدهند از اعلانهای اضافی بهره ببرند، در حالی که به تعبیهکنندگان یا مدیران سیستم نیز اجازه میدهند نسخههایی از پایتون را مستقر کنند که در آنها حسابرسی همیشه فعال است.
برای جزئیات کامل به PEP 578 مراجعه کنید.
PEP 587: پیکربندی راهاندازی پایتون¶
PEP 587 یک C API جدید برای پیکربندی راهاندازی پایتون اضافه میکند که کنترل دقیقتری بر کل پیکربندی و گزارشدهی خطای بهتری فراهم میکند.
ساختارهای جدید:
توابع جدید:
این PEP همچنین فیلدهای _PyRuntimeState.preconfig (از نوع PyPreConfig) و PyInterpreterState.config (از نوع PyConfig) را به این ساختارهای داخلی اضافه میکند. PyInterpreterState.config به پیکربندی مرجع جدید تبدیل میشود و متغیرهای پیکربندی سراسری و سایر متغیرهای خصوصی را جایگزین میکند.
برای مستندات به پیکربندی مقداردهی اولیه پایتون مراجعه کنید.
برای توضیح کامل به PEP 587 مراجعه کنید.
(مشارکتشده توسط Victor Stinner در bpo-36763.)
PEP 590: Vectorcall: پروتکل فراخوانی سریع برای سیپایتون¶
پروتکل Vectorcall به Python/C API افزوده شده است. هدف آن رسمیت بخشیدن به بهینهسازیهای موجودی است که پیشتر برای کلاسهای مختلف انجام شده بودند. هر نوع ایستا که یک فراخوانیپذیر را پیادهسازی میکند میتواند از این پروتکل استفاده کند.
این در حال حاضر آزمایشی است. هدف این است که در Python 3.9 بهطور کامل عمومی شود.
برای توضیح کامل به PEP 590 مراجعه کنید.
(با مشارکت Jeroen Demeyer، Mark Shannon و Petr Viktorin در bpo-36974.)
پروتکل 5 پیکل با بافرهای دادهی خارج از باند (out-of-band)¶
هنگامی که pickle برای انتقال دادههای حجیم بین فرایندهای پایتون به منظور بهرهگیری از پردازش چندهستهای یا چندماشینی استفاده میشود، مهم است که انتقال را با کاهش رونوشتهای حافظه و در صورت امکان با بهکارگیری تکنیکهای سفارشی مانند فشردهسازی وابسته به داده بهینه کنید.
پروتکل ۵ ماژول pickle پشتیبانی از بافرهای خارج از باند (out-of-band) را معرفی میکند که در آن، دادههای سازگار با PEP 3118 میتوانند به تشخیص لایه ارتباطی، بهصورت جداگانه از جریان اصلی پیکل منتقل شوند.
برای توضیح کامل به PEP 574 مراجعه کنید.
(مشارکتشده توسط Antoine Pitrou در bpo-36785.)
سایر تغییرات زبان¶
دستور
continueدر بندfinallyبه دلیل مشکلی در پیادهسازی غیرمجاز بود. در پایتون 3.8 این محدودیت برداشته شد. (مشارکت Serhiy Storchaka در bpo-32489.)نوعهای
bool،intوfractions.Fractionاکنون متدی به نامas_integer_ratio()دارند، مشابه متدی که درfloatوdecimal.Decimalیافت میشود. این توسعه کوچک API این امکان را فراهم میکند که بنویسیدnumerator, denominator = x.as_integer_ratio()و این کد در چندین نوع عددی کار کند. (مشارکتشده توسط لیزا روچ در bpo-33073 و ریموند هتینگر در bpo-37819.)سازندههای
int،floatوcomplexاکنون در صورتی از متد ویژهی__index__()استفاده میکنند که این متد موجود باشد و متد متناظر__int__()،__float__()یا__complex__()موجود نباشد. (ارائهشده توسط Serhiy Storchaka در bpo-20092.)پشتیبانی از گریزهای
\N{name}درعبارات باقاعدهافزوده شد:>>> notice = 'Copyright © 2019' >>> copyright_year_pattern = re.compile(r'\N{copyright sign}\s*(\d{4})') >>> int(copyright_year_pattern.search(notice).group(1)) 2019
(Jonathan Eunice و Serhiy Storchaka در bpo-30688 مشارکت کردهاند.)
دیکشنریها و نماهای دیکشنری اکنون با استفاده از
reversed()به ترتیب درج معکوس پیمایشپذیر هستند. (مشارکتشده توسط Rémi Lapeyre در bpo-33462.)سینتکس مجاز برای نامهای کلیدواژه در فراخوانی توابع، بیش از پیش محدود شد. بهطور خاص،
f((keyword)=arg)دیگر مجاز نیست. هرگز قصدی برای اجازه دادن به چیزی فراتر از یک نام ساده در سمت چپِ عبارت انتساب آرگومان کلیدواژهای وجود نداشت. (مشارکتشده توسط Benjamin Peterson در bpo-34641.)واگشایی تعمیمیافتهی پیمایشپذیرها در دستورهای
yieldوreturnدیگر نیازی به پرانتزهای دربرگیرنده ندارد. این امر سینتکس yield و return را با سینتکس انتساب معمولی هماهنگتر میکند:>>> def parse(family): ... lastname, *members = family.split() ... return lastname.upper(), *members ... >>> parse('simpsons homer marge bart lisa maggie') ('SIMPSONS', 'homer', 'marge', 'bart', 'lisa', 'maggie')
(مشارکتشده توسط David Cuthbert و Jordan Chapman در bpo-32117.)
وقتی در کدی مانند
[(10, 20) (30, 40)]ویرگولی جا افتاده باشد، کامپایلر یکSyntaxWarningهمراه با پیشنهادی مفید نمایش میدهد. این بهبودی است نسبت به حالتی که فقط یکTypeErrorوجود داشت که نشان میداد تاپل اول فراخوانیپذیر نیست. (مشارکتشده توسط Serhiy Storchaka در bpo-15248.)عملیاتهای حسابی بین زیرکلاسهای
datetime.dateیاdatetime.datetimeو اشیاءdatetime.timedeltaاکنون بهجای کلاس پایه، نمونهای از زیرکلاس را برمیگردانند. این امر همچنین بر نوع بازگشتی عملیاتی که پیادهسازی آنها (بهطور مستقیم یا غیرمستقیم) از محاسباتdatetime.timedeltaاستفاده میکند تأثیر میگذارد، مانندastimezone(). (ارائهشده توسط Paul Ganssle در bpo-32417.)وقتی مفسر پایتون با Ctrl-C (SIGINT) دچار وقفه شود و استثنای
KeyboardInterruptحاصل گرفته نشود، فرایند پایتون اکنون از طریق سیگنال SIGINT یا با کد خروج صحیح خارج میشود، بهگونهای که فرایند فراخواننده بتواند تشخیص دهد که فرایند پایتون به دلیل Ctrl-C از بین رفته است. پوستههای POSIX و Windows از این برای خاتمهی صحیح اسکریپتها در نشستهای تعاملی استفاده میکنند. (مشارکتشده توسط Google از طریق Gregory P. Smith در bpo-1054041.)برخی سبکهای پیشرفته برنامهنویسی نیازمند بهروزرسانی شیء
types.CodeTypeبرای یک تابع موجود هستند. از آنجا که اشیاء کد تغییرناپذیرند، باید شیء کد جدیدی ایجاد شود؛ شیئی که بر اساس شیء کد موجود الگوبرداری شده باشد. با ۱۹ پارامتر، این کار تا حدی خستهکننده بود. اکنون، متد جدیدreplace()امکان ایجاد رونوشتی با چند پارامتر تغییریافته را فراهم میکند.در اینجا مثالی است که تابع
statistics.mean()را تغییر میدهد تا از استفاده شدن پارامتر data بهعنوان آرگومان کلیدواژهای جلوگیری کند:>>> from statistics import mean >>> mean(data=[10, 20, 90]) 40 >>> mean.__code__ = mean.__code__.replace(co_posonlyargcount=1) >>> mean(data=[10, 20, 90]) Traceback (most recent call last): ... TypeError: mean() got some positional-only arguments passed as keyword arguments: 'data'
(ارائهشده توسط Victor Stinner در bpo-37032.)
برای اعداد صحیح، شکل سهآرگومانی تابع
pow()اکنون در حالتی که پایه با پیمانه نسبتاً اول باشد، اجازه میدهد توان منفی باشد. سپس هنگامی که توان-1باشد، وارون پیمانهای پایه را محاسبه میکند و برای سایر توانهای منفی، توانی مناسب از آن وارون را محاسبه میکند. بهعنوان مثال، برای محاسبهی وارون ضربی پیمانهای عدد ۳۸ به پیمانه ۱۳۷، بنویسید:>>> pow(38, -1, 137) 119 >>> 119 * 38 % 137 1
معکوسهای پیمانهای در حل معادلات دیوفانتین خطی پدیدار میشوند. برای مثال، برای یافتن راهحلهای صحیح برای
4258𝑥 + 147𝑦 = 369، ابتدا آن را بهصورت4258𝑥 ≡ 369 (mod 147)بازنویسی کنید و سپس حل کنید:>>> x = 369 * pow(4258, -1, 147) % 147 >>> y = (4258 * x - 369) // -147 >>> 4258 * x + 147 * y 369
(مشارکتشده توسط مارک دیکنسون در bpo-36027.)
درکهای دیکشنری با مقادیر لفظی دیکشنری همگام شدهاند، بهطوری که ابتدا کلید و سپس مقدار محاسبه میشود:
>>> # Dict comprehension >>> cast = {input('role? '): input('actor? ') for i in range(2)} role? King Arthur actor? Chapman role? Black Knight actor? Cleese >>> # Dict literal >>> cast = {input('role? '): input('actor? ')} role? Sir Robin actor? Eric Idle
ترتیب اجرای تضمینشده با عبارتهای انتسابی مفید است، زیرا متغیرهایی که در عبارت کلید انتساب مییابند، در عبارت مقدار در دسترس خواهند بود:
>>> names = ['Martin von Löwis', 'Łukasz Langa', 'Walter Dörwald'] >>> {(n := normalize('NFC', name)).casefold() : n for name in names} {'martin von löwis': 'Martin von Löwis', 'łukasz langa': 'Łukasz Langa', 'walter dörwald': 'Walter Dörwald'}
(با مشارکت Jörn Heissler در bpo-35224.)
متد
object.__reduce__()اکنون میتواند تاپلی با طول دو تا شش عنصر برگرداند. پیشتر، حد پنج بود. عنصر ششم جدید و اختیاری، یک فراخوانیپذیر با امضای(obj, state)است. این امکان کنترل مستقیم بر رفتار بهروزرسانی وضعیت یک شیء مشخص را فراهم میکند. اگر None نباشد، این فراخوانیپذیر نسبت به متد__setstate__()شیء اولویت خواهد داشت. (مشارکت Pierre Glaser و Olivier Grisel در bpo-35900.)
ماژولهای جدید¶
ماژول جدید
importlib.metadataپشتیبانی (آزمایشی) از خواندن فرادادهی بستههای شخص ثالث را فراهم میکند. برای مثال، این ماژول میتواند شماره نسخه، فهرست نقاط ورود و موارد دیگر را از یک بستهی نصبشده استخراج کند:>>> # Note following example requires that the popular "requests" >>> # package has been installed. >>> >>> from importlib.metadata import version, requires, files >>> version('requests') '2.22.0' >>> list(requires('requests')) ['chardet (<3.1.0,>=3.0.2)'] >>> list(files('requests'))[:5] [PackagePath('requests-2.22.0.dist-info/INSTALLER'), PackagePath('requests-2.22.0.dist-info/LICENSE'), PackagePath('requests-2.22.0.dist-info/METADATA'), PackagePath('requests-2.22.0.dist-info/RECORD'), PackagePath('requests-2.22.0.dist-info/WHEEL')]
(مشارکت Barry Warsaw و Jason R. Coombs در bpo-34632.)
ماژولهای بهبودیافته¶
ast¶
گرههای AST اکنون ویژگیهای end_lineno و end_col_offset را دارند که موقعیت دقیق انتهای گره را مشخص میکنند. (این فقط به گرههایی اعمال میشود که ویژگیهای lineno و col_offset را دارند.)
تابع جدید ast.get_source_segment() کد منبع مربوط به یک گره AST مشخص را برمیگرداند.
(مشارکت Ivan Levkivskyi در bpo-33416.)
تابع ast.parse() چند پرچم جدید دارد:
type_comments=Trueباعث میشود متن کامنتهای نوع PEP 484 و PEP 526 مرتبط با گرههای معینی از درخت سینتکس انتزاعی (AST) بازگردانده شود؛میتوان از
mode='func_type'برای تجزیهی «کامنتهای نوع امضا»ی PEP 484 (که برای گرههای AST تعریف تابع برگردانده میشوند) استفاده کرد؛feature_version=(3, N)به شما اجازه میدهد نسخهی قدیمیتری از پایتون ۳ را مشخص کنید. برای مثال،feature_version=(3, 4)asyncوawaitرا بهعنوان واژههای رزرونشده در نظر میگیرد.
(مشارکتشده توسط Guido van Rossum در bpo-35766.)
asyncio¶
asyncio.run() از API آزمایشی به API پایدار ارتقا یافته است. میتوان از این تابع برای اجرای یک coroutine و برگرداندن نتیجه، همراه با مدیریت خودکار حلقه رویداد استفاده کرد. برای مثال:
import asyncio
async def main():
await asyncio.sleep(0)
return 42
asyncio.run(main())
این تقریباً معادل است با:
import asyncio
async def main():
await asyncio.sleep(0)
return 42
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
try:
loop.run_until_complete(main())
finally:
asyncio.set_event_loop(None)
loop.close()
پیادهسازی واقعی بهطور قابلتوجهی پیچیدهتر است. بنابراین، asyncio.run() باید روش ترجیحی برای اجرای برنامههای asyncio باشد.
(مشارکتشده توسط یوری سلیوانوف در bpo-32314.)
اجرای python -m asyncio یک REPL ذاتاً ناهمگام را راهاندازی میکند. این امر امکان آزمایش سریع با کدی را فراهم میکند که دارای await در سطح بالاست. دیگر نیازی به فراخوانی مستقیم asyncio.run() نیست؛ تابعی که در هر فراخوانی یک حلقه رویداد جدید ایجاد میکرد:
$ python -m asyncio
asyncio REPL 3.8.0
Use "await" directly instead of "asyncio.run()".
Type "help", "copyright", "credits" or "license" for more information.
>>> import asyncio
>>> await asyncio.sleep(10, result='hello')
hello
(مشارکتشده توسط Yury Selivanov در bpo-37028.)
استثنای asyncio.CancelledError اکنون از BaseException به جای Exception ارثبری میکند و دیگر از concurrent.futures.CancelledError ارثبری نمیکند. (مشارکتشده توسط یوری سلیوانوف در bpo-32528.)
در ویندوز، حلقه رویداد پیشفرض اکنون ProactorEventLoop است. (مشارکتشده توسط ویکتور استینر در bpo-34687.)
ProactorEventLoop اکنون از UDP نیز پشتیبانی میکند. (با مشارکت Adam Meily و Andrew Svetlov در bpo-29883.)
ProactorEventLoop اکنون میتواند توسط KeyboardInterrupt ("CTRL+C") قطع شود. (مشارکتشده توسط ولادیمیر ماتویف در bpo-23057.)
asyncio.Task.get_coro() برای گرفتن همروالِ پوششدادهشده درون یک asyncio.Task اضافه شد. (با مشارکت Alex Grönholm در bpo-36999.)
اکنون میتوان وظایف asyncio را نامگذاری کرد، یا با ارسال آرگومان کلیدواژهای name به asyncio.create_task() یا متد حلقه رویداد create_task()، یا با فراخوانی متد set_name() روی شیء وظیفه. نام وظیفه در خروجی repr() asyncio.Task قابل مشاهده است و همچنین میتوان آن را با استفاده از متد get_name() بازیابی کرد. (مشارکتشده توسط الکس گرونهولم در bpo-34270.)
پشتیبانی از Happy Eyeballs به asyncio.loop.create_connection() اضافه شد. برای مشخص کردن این رفتار، دو پارامتر جدید اضافه شدهاند: happy_eyeballs_delay و interleave. الگوریتم Happy Eyeballs با تلاش برای برقراری اتصال همزمان با استفاده از هر دو، پاسخگویی برنامههایی را که از IPv4 و IPv6 پشتیبانی میکنند بهبود میبخشد. (مشارکتشده توسط twisteroid ambassador در bpo-33530.)
توکارها¶
تابع توکار compile() بهبود یافته است تا پرچم ast.PyCF_ALLOW_TOP_LEVEL_AWAIT را بپذیرد. با پاس داده شدن این پرچم جدید، compile() اجازه خواهد داد از ساختارهای await، async for و async with در سطح بالا که معمولاً سینتکس نامعتبر در نظر گرفته میشوند، استفاده شود. سپس ممکن است شیء کد ناهمگامی که با پرچم CO_COROUTINE علامتگذاریشده است، بازگردانده شود. (مشارکت Matthias Bussonnier در bpo-34616)
collections¶
متد _asdict() برای collections.namedtuple() اکنون بهجای collections.OrderedDict یک dict بازمیگرداند. این امر ممکن است زیرا دیکشنریهای معمولی از پایتون 3.7 به بعد ترتیب تضمینشده دارند. اگر به ویژگیهای اضافی OrderedDict نیاز باشد، راهحل پیشنهادی، تبدیل نوع نتیجه به نوع دلخواه است: OrderedDict(nt._asdict()). (مشارکتشده توسط Raymond Hettinger در bpo-35864.)
cProfile¶
کلاس cProfile.Profile اکنون میتواند بهعنوان یک مدیر زمینه استفاده شود. برای پروفایلگیری از یک بلوک کد، آن را به این صورت اجرا کنید:
import cProfile
with cProfile.Profile() as profiler:
# code to be profiled
...
(با مشارکت اسکات ساندرسون در bpo-29235.)
csv¶
کلاس csv.DictReader اکنون به جای collections.OrderedDict، نمونههایی از dict بازمیگرداند. این ابزار اکنون سریعتر است و حافظه کمتری استفاده میکند، در حالی که همچنان ترتیب فیلدها را حفظ میکند. (مشارکتشده توسط مایکل سلیک در bpo-34003.)
curses¶
متغیر جدیدی که اطلاعات نسخهی ساختاریافتهی کتابخانهی زیربنایی ncurses را نگه میدارد، اضافه شد: ncurses_version. (مشارکتشده توسط Serhiy Storchaka در bpo-31680.)
ctypes¶
در ویندوز، CDLL و زیرکلاسهای آن اکنون یک پارامتر winmode را میپذیرند تا پرچمهایی برای فراخوانی زیرین LoadLibraryEx مشخص کنند. پرچمهای پیشفرض بهگونهای تنظیم شدهاند که وابستگیهای DLL فقط از مکانهای مورد اعتماد بارگذاری شوند، از جمله مسیری که DLL در آن ذخیره شده است (اگر مسیر کامل یا جزئی برای بارگذاری DLL اولیه استفاده شود) و مسیرهایی که توسط add_dll_directory() اضافه شدهاند. (مشارکتشده توسط Steve Dower در bpo-36085.)
datetime¶
سازندههای جایگزین جدید datetime.date.fromisocalendar() و datetime.datetime.fromisocalendar() افزوده شدند که به ترتیب اشیاء date و datetime را از سال ISO، شماره هفته و روز هفته میسازند؛ اینها معکوس متد isocalendar هر کلاس هستند. (مشارکتشده توسط Paul Ganssle در bpo-36004.)
functools¶
@functools.lru_cache اکنون میتواند مستقیماً بهعنوان یک دکوراتور استفاده شود، نه بهعنوان تابعی که یک دکوراتور برمیگرداند. بنابراین هر دو مورد زیر اکنون پشتیبانی میشوند:
@lru_cache
def f(x):
...
@lru_cache(maxsize=256)
def f(x):
...
(مشارکتشده توسط Raymond Hettinger در bpo-36772.)
دکوراتور جدید @functools.cached_property برای ویژگیهای محاسبهشدهای که در طول عمر نمونه در نهانگاه ذخیره میشوند، اضافه شد.
import functools
import statistics
class Dataset:
def __init__(self, sequence_of_numbers):
self.data = sequence_of_numbers
@functools.cached_property
def variance(self):
return statistics.variance(self.data)
(مشارکتشده توسط کارل مایر در bpo-21145)
یک دکوراتور جدید functools.singledispatchmethod() اضافه شد که متدها را با استفاده از ارسال تکگانه به توابع عام تبدیل میکند:
from functools import singledispatchmethod
from contextlib import suppress
class TaskManager:
def __init__(self, tasks):
self.tasks = list(tasks)
@singledispatchmethod
def discard(self, value):
with suppress(ValueError):
self.tasks.remove(value)
@discard.register(list)
def _(self, tasks):
targets = set(tasks)
self.tasks = [x for x in self.tasks if x not in targets]
(مشارکتشده توسط Ethan Smith در bpo-32380)
gc¶
تابع get_objects() اکنون میتواند یک پارامتر اختیاری نسل بپذیرد که مشخص میکند اشیاء از کدام نسل دریافت شوند. (مشارکتشده توسط Pablo Galindo در bpo-36016.)
gettext¶
pgettext() و گونههای آن افزوده شدند. (مشارکت Franz Glasner، Éric Araujo و Cheryl Sabella در bpo-2504.)
gzip¶
پارامتر mtime به gzip.compress() برای خروجی قابل بازتولید اضافه شد. (مشارکتشده توسط Guo Ci Teo در bpo-34898.)
اکنون برای برخی انواع پروندههای gzip نامعتبر یا خراب، بهجای OSError استثنای BadGzipFile مطرح میشود. (مشارکتشده توسط Filip Gruszczyński، Michele Orrù و Zackery Spytz در bpo-6584.)
IDLE و idlelib¶
خروجی بیش از N سطر (بهطور پیشفرض ۵۰) به یک دکمه فشرده میشود. مقدار N را میتوان در بخش PyShell از صفحهی عمومی پنجره تنظیمات تغییر داد. سطرهای کمتر، اما احتمالاً بسیار طولانی، را میتوان با راستکلیک روی خروجی فشرده کرد. خروجی فشردهشده را میتوان با دوبار کلیک روی دکمه، در همانجا گسترش داد، یا با راستکلیک روی دکمه، به کلیپبورد یا پنجرهای جداگانه گسترش داد. (ارائهشده توسط Tal Einat در bpo-1529353.)
افزودن «Run Customized» به منوی Run برای اجرای یک ماژول با تنظیمات سفارشی. هر آرگومان خط فرمانی که وارد شود، به sys.argv افزوده میشود. آنها همچنین برای اجرای سفارشی بعدی دوباره در کادر ظاهر میشوند. همچنین میتوان از راهاندازی مجدد عادی ماژول اصلی پوسته جلوگیری کرد. (مشارکتشده توسط Cheryl Sabella، Terry Jan Reedy و دیگران در bpo-5680 و bpo-37627.)
شمارههای سطر اختیاری برای پنجرههای ویرایشگر IDLE اضافه شد. پنجرهها بدون شماره سطر باز میشوند، مگر آنکه در زبانهی General گفتوگوی پیکربندی بهگونهای دیگر تنظیم شده باشد. شماره سطرهای یک پنجرهی موجود از طریق منوی Options نمایش داده و پنهان میشوند. (مشارکتشده توسط Tal Einat و Saimadhav Heblikar در bpo-17535.)
اکنون برای تبدیل بین رشتههای پایتون و اشیای Tcl از کدگذاری بومی سیستمعامل استفاده میشود. این امر به IDLE اجازه میدهد با ایموجی و سایر نویسههای خارج از صفحه چندزبانه پایه (non-BMP) کار کند. این نویسهها میتوانند نمایش داده شوند یا به کلیپبورد کپی و از آن جایگذاری شوند. تبدیل رشتهها از Tcl به پایتون و برعکس دیگر هرگز شکست نمیخورد. (بسیاری از افراد هشت سال روی این مسئله کار کردند، اما مشکل سرانجام توسط Serhiy Storchaka در bpo-13153 حل شد.)
افزودهشده در نسخه 3.8.1:
افزودن گزینهای برای خاموش کردن چشمکزدن مکاننما. (با مشارکت Zackery Spytz در bpo-4603.)
کلید Escape اکنون پنجرههای تکمیل IDLE را میبندد. (مشارکتشده توسط Johnny Najera در bpo-38944.)
تغییرات فوق به نسخههای نگهداری 3.7 بکپورت شدهاند.
کلیدواژهها به فهرست تکمیل نام ماژول افزوده شدند. (مشارکتشده توسط Terry J. Reedy در bpo-37765.)
inspect¶
تابع inspect.getdoc() اکنون میتواند رشتههای مستند را برای __slots__ بیابد، اگر آن ویژگی یک dict باشد که مقادیر آن رشتههای مستند باشند. این کار گزینههای مستندسازی مشابه آنچه از قبل برای @property، @classmethod و @staticmethod داریم فراهم میکند:
class AudioClip:
__slots__ = {'bit_rate': 'expressed in kilohertz to one decimal place',
'duration': 'in seconds, rounded up to an integer'}
def __init__(self, bit_rate, duration):
self.bit_rate = round(bit_rate / 1000.0, 1)
self.duration = ceil(duration)
(مشارکتشده توسط Raymond Hettinger در bpo-36326.)
io¶
در حالت توسعه (-X env) و در ساخت اشکالزدایی، نهاییساز io.IOBase اکنون در صورتی که متد close() شکست بخورد، استثنا را گزارشگیری میکند. در ساخت انتشار، این استثنا بهطور پیشفرض بهصورت بیصدا نادیده گرفته میشود. (مشارکتشده توسط Victor Stinner در bpo-18748.)
itertools¶
تابع itertools.accumulate() یک آرگومان کلیدواژهای initial اختیاری برای تعیین مقدار اولیه اضافه کرد:
>>> from itertools import accumulate
>>> list(accumulate([10, 5, 30, 15], initial=1000))
[1000, 1010, 1015, 1045, 1060]
(مشارکتشده توسط لیزا روچ در bpo-34659.)
json.tool¶
افزودن گزینهی --json-lines برای تجزیهی هر سطر ورودی به عنوان یک شیء JSON جداگانه. (با مشارکت Weipeng Hong در bpo-31553.)
logging¶
آرگومان کلیدواژهای force به logging.basicConfig() اضافه شد. هنگامی که روی true تنظیم شود، هر هندلر موجود متصل به گزارشگیر ریشه، پیش از انجام پیکربندی مشخصشده توسط آرگومانهای دیگر، حذف و بسته میشود.
این یک مشکل دیرینه را حل میکند. پس از آنکه یک گزارشگیر یا basicConfig() فراخوانی شده بود، فراخوانیهای بعدی basicConfig() بیسروصدا نادیده گرفته میشدند. این امر بهروزرسانی، آزمایش یا آموزش گزینههای مختلف پیکربندی گزارشگیری را با استفاده از اعلان تعاملی یا دفترچه Jupyter دشوار میکرد.
(پیشنهادشده توسط Raymond Hettinger، پیادهسازیشده توسط Donghee Na و بازبینیشده توسط Vinay Sajip در bpo-33897.)
math¶
تابع جدید math.dist() برای محاسبه فاصله اقلیدسی بین دو نقطه اضافه شد. (مشارکتشده توسط Raymond Hettinger در bpo-33089.)
تابع math.hypot() برای مدیریت ابعاد متعدد گسترش یافت. پیشتر، این تابع فقط حالت دوبعدی را پشتیبانی میکرد. (مشارکت Raymond Hettinger در bpo-33089.)
تابع جدید math.prod() بهعنوان تابعی مشابه sum() اضافه شد که حاصلضرب یک مقدار 'start' (پیشفرض: ۱) در یک پیمایشپذیر از اعداد را برمیگرداند:
>>> prior = 0.8
>>> likelihoods = [0.625, 0.84, 0.30]
>>> math.prod(likelihoods, start=prior)
0.126
(مشارکتشده توسط Pablo Galindo در bpo-35606.)
دو تابع ترکیبیاتی جدید math.perm() و math.comb() افزوده شد:
>>> math.perm(10, 3) # Permutations of 10 things taken 3 at a time
720
>>> math.comb(10, 3) # Combinations of 10 things taken 3 at a time
120
(با مشارکت Yash Aggarwal، Keller Fuchs، Serhiy Storchaka و Raymond Hettinger در bpo-37128، bpo-37178 و bpo-35431.)
تابع جدید math.isqrt() برای محاسبه دقیق جذرهای صحیح بدون تبدیل به ممیز شناور افزوده شد. این تابع جدید از اعداد صحیح با هر اندازه دلخواه پشتیبانی میکند. این تابع از floor(sqrt(n)) سریعتر است، اما از math.sqrt() کندتر است:
>>> r = 650320427
>>> s = r ** 2
>>> isqrt(s - 1) # correct
650320426
>>> floor(sqrt(s - 1)) # incorrect
650320427
(مشارکتشده توسط مارک دیکینسون در bpo-36887.)
تابع math.factorial() دیگر آرگومانهایی را که شبهعدد صحیح (int-like) نیستند نمیپذیرد. (مشارکت Pablo Galindo در bpo-33083.)
mmap¶
کلاس mmap.mmap اکنون دارای متد madvise() برای دسترسی به فراخوانی سیستمی madvise() است. (مشارکتشده توسط Zackery Spytz در bpo-32941.)
multiprocessing¶
ماژول جدید multiprocessing.shared_memory افزوده شد. (ارائهشده توسط Davin Potts در bpo-35813.)
در macOS، روش شروع spawn اکنون بهطور پیشفرض استفاده میشود. (با مشارکت Victor Stinner در bpo-33725.)
os¶
تابع جدید add_dll_directory() در ویندوز اضافه شد تا مسیرهای جستجوی اضافی برای وابستگیهای بومی هنگام ایمپورت کردن ماژولهای توسعهای یا بارگذاری DLLها با استفاده از ctypes فراهم کند. (مشارکتشده توسط استیو داور در bpo-36085.)
تابع جدید os.memfd_create() برای پوشش دادن فراخوانی سیستمی memfd_create() اضافه شد. (با مشارکت Zackery Spytz و Christian Heimes در bpo-26836.)
در ویندوز، بخش زیادی از منطق دستی برای مدیریت نقاط تجزیه مجدد (reparse point) (شامل پیوندهای نمادین و اتصالهای پوشه) به سیستمعامل واگذار شده است. بهطور خاص، os.stat() اکنون از هر چیزی که توسط سیستمعامل پشتیبانی میشود عبور خواهد کرد، در حالی که os.lstat() تنها نقاط تجزیه مجددی را باز خواهد کرد که بهعنوان «جانشینهای نام» (name surrogates) شناسایی میشوند و سایر موارد به همان شیوهی os.stat() باز میشوند. در همهی موارد، S_IFLNK در os.stat_result.st_mode تنها برای پیوندهای نمادین تنظیم میشود و نه برای انواع دیگر نقاط تجزیه مجدد. برای شناسایی انواع دیگر نقاط تجزیه مجدد، ویژگی جدید os.stat_result.st_reparse_tag را بررسی کنید.
در ویندوز، os.readlink() اکنون میتواند اتصالهای پوشه را بخواند. توجه داشته باشید که islink() برای اتصالهای پوشه False را برمیگرداند، بنابراین کدی که ابتدا islink را بررسی میکند، همچنان اتصالها را بهعنوان پوشه در نظر میگیرد، در حالی که کدی که خطاهای os.readlink() را مدیریت میکند، ممکن است اکنون اتصالها را بهعنوان پیوند در نظر بگیرد.
(مشارکتشده توسط Steve Dower در bpo-37834.)
os.path¶
توابع os.path که نتیجهای بولی برمیگردانند، مانند exists()، lexists()، isdir()، isfile()، islink() و ismount()، اکنون برای مسیرهایی که حاوی نویسهها یا بایتهایی هستند که در سطح سیستمعامل قابل نمایش نیستند، به جای ایجاد ValueError یا زیرکلاسهای آن UnicodeEncodeError و UnicodeDecodeError، مقدار False برمیگردانند. (مشارکتشده توسط Serhiy Storchaka در bpo-33721.)
expanduser() در ویندوز اکنون متغیر محیطی USERPROFILE را ترجیح میدهد و از HOME استفاده نمیکند که معمولاً برای حسابهای کاربری عادی تنظیم نمیشود. (مشارکتشده توسط Anthony Sottile در bpo-36264.)
isdir() در ویندوز دیگر True را برای پیوندی به پوشهی ناموجود برنمیگرداند.
realpath() در ویندوز اکنون نقاط بازتجزیه (reparse point) از جمله پیوندهای نمادین و اتصالهای پوشه را حل میکند.
(مشارکتشده توسط Steve Dower در bpo-37834.)
pathlib¶
متدهای pathlib.Path که نتیجهای بولی برمیگردانند — مانند exists()، is_dir()، is_file()، is_mount()، is_symlink()، is_block_device()، is_char_device()، is_fifo() و is_socket() — اکنون برای مسیرهایی که نویسههای غیرقابل نمایش در سطح سیستمعامل را در بر دارند، به جای برخاستن استثنای ValueError یا زیرکلاس آن UnicodeEncodeError، مقدار False برمیگردانند. (مشارکتشده توسط Serhiy Storchaka در bpo-33721.)
متد pathlib.Path.link_to() اضافه شد که پیوندی سخت ایجاد میکند که به مسیری اشاره میکند. (مشارکتشده توسط Joannah Nanjekye در bpo-26978) توجه داشته باشید که link_to در نسخهی 3.10 منسوخ و در نسخهی 3.12 حذف شد و متد hardlink_to که در نسخهی 3.10 اضافه شده و از نظر معناشناسی با متد موجود symlink_to مطابقت دارد، جایگزین آن شد.
pickle¶
افزونههای pickle که از Pickler بهینهشده با C زیرکلاس میگیرند، اکنون میتوانند با تعریف متد ویژهی reducer_override()، منطق پیکلکردن توابع و کلاسها را بازنویسی کنند. (مشارکتشده توسط Pierre Glaser و Olivier Grisel در bpo-35900.)
plistlib¶
کلاس جدید plistlib.UID افزوده شد و پشتیبانی از خواندن و نوشتن پروندههای plist دودویی کدگذاریشده با NSKeyedArchiver فعال شد. (مشارکتشده توسط Jon Janzen در bpo-26707.)
pprint¶
ماژول pprint پارامتر sort_dicts را به چندین تابع افزود. بهطور پیشفرض، این توابع همچنان دیکشنریها را پیش از نمایش یا چاپ مرتب میکنند. با این حال، اگر sort_dicts روی false تنظیم شود، دیکشنریها ترتیب درج کلیدها را حفظ میکنند. این میتواند هنگام اشکالزدایی برای مقایسه با ورودیهای JSON مفید باشد.
علاوه بر این، یک تابع جدید و کاربردی وجود دارد، pprint.pp() که مانند pprint.pprint() است، اما مقدار پیشفرض sort_dicts آن False است:
>>> from pprint import pprint, pp
>>> d = dict(source='input.txt', operation='filter', destination='output.txt')
>>> pp(d, width=40) # Original order
{'source': 'input.txt',
'operation': 'filter',
'destination': 'output.txt'}
>>> pprint(d, width=40) # Keys sorted alphabetically
{'destination': 'output.txt',
'operation': 'filter',
'source': 'input.txt'}
(ارائهشده توسط رمی لاپیر در bpo-30670.)
py_compile¶
py_compile.compile() اکنون از حالت بیصدا پشتیبانی میکند. (مشارکتشده توسط Joannah Nanjekye در bpo-22640.)
shlex¶
تابع جدید shlex.join() بهعنوان معکوسِ shlex.split() عمل میکند. (ارائهشده توسط Bo Bayles در bpo-32102.)
shutil¶
shutil.copytree() اکنون آرگومان کلیدواژهای جدید dirs_exist_ok را میپذیرد. (مشارکتشده توسط جاش برونسون در bpo-20849.)
shutil.make_archive() اکنون برای آرشیوهای جدید بهطور پیشفرض از قالب مدرن pax (POSIX.1-2001) استفاده میکند تا قابلیت حمل و انطباق با استانداردها بهبود یابد؛ این پیشفرض از تغییر متناظر در ماژول tarfile به ارث رسیده است. (مشارکتشده توسط C.A.M. Gerlach در bpo-30661.)
shutil.rmtree() در ویندوز اکنون اتصالهای پوشه را حذف میکند، بدون آنکه ابتدا محتویات آنها را بهصورت بازگشتی حذف کند. (مشارکت از Steve Dower در bpo-37834.)
socket¶
توابع کمکی create_server() و has_dualstack_ipv6() اضافه شدند تا وظایف ضروریای را که معمولاً هنگام ایجاد یک سوکت سرور به آنها نیاز میشود، خودکار کنند؛ از جمله پذیرش هر دو اتصال IPv4 و IPv6 روی همان سوکت. (مشارکتشده توسط Giampaolo Rodolà در bpo-17561.)
توابع socket.if_nameindex()، socket.if_nametoindex() و socket.if_indextoname() در ویندوز پیادهسازی شدهاند. (مشارکتشده توسط Zackery Spytz در bpo-37007.)
ssl¶
post_handshake_auth برای فعالسازی و verify_client_post_handshake() برای آغاز احراز هویت پس از دستدهی در TLS 1.3 افزوده شدند. (مشارکت Christian Heimes در bpo-34670.)
statistics¶
statistics.fmean() به عنوان گونهی سریعتر و ممیز شناورِ statistics.mean() افزوده شد. (مشارکتشده توسط Raymond Hettinger و Steven D'Aprano در bpo-35904.)
statistics.geometric_mean() افزوده شد (با مشارکت Raymond Hettinger در bpo-27181.)
statistics.multimode() افزوده شد که فهرستی از پرتکرارترین مقادیر را برمیگرداند. (مشارکتشده توسط Raymond Hettinger در bpo-35892.)
تابع statistics.quantiles() اضافه شد که دادهها یا یک توزیع را به بازههای هماحتمال (برای مثال چارکها، دهکها یا صدکها) تقسیم میکند. (مشارکت Raymond Hettinger در bpo-36546.)
statistics.NormalDist اضافه شد؛ ابزاری برای ایجاد و دستکاری توزیعهای نرمال یک متغیر تصادفی. (نوشتهی Raymond Hettinger در bpo-36018.)
>>> temperature_feb = NormalDist.from_samples([4, 12, -3, 2, 7, 14])
>>> temperature_feb.mean
6.0
>>> temperature_feb.stdev
6.356099432828281
>>> temperature_feb.cdf(3) # Chance of being under 3 degrees
0.3184678262814532
>>> # Relative chance of being 7 degrees versus 10 degrees
>>> temperature_feb.pdf(7) / temperature_feb.pdf(10)
1.2039930378537762
>>> el_niño = NormalDist(4, 2.5)
>>> temperature_feb += el_niño # Add in a climate effect
>>> temperature_feb
NormalDist(mu=10.0, sigma=6.830080526611674)
>>> temperature_feb * (9/5) + 32 # Convert to Fahrenheit
NormalDist(mu=50.0, sigma=12.294144947901014)
>>> temperature_feb.samples(3) # Generate random samples
[7.672102882379219, 12.000027119750287, 4.647488369766392]
sys¶
تابع جدید sys.unraisablehook() افزوده شد که میتوان با بازنویسی آن، نحوهی مدیریت «استثناهای غیرقابل raise» (unraisable exceptions) را کنترل کرد. این تابع زمانی فراخوانی میشود که استثنایی رخ داده باشد، اما پایتون هیچ راهی برای مدیریت آن نداشته باشد. برای مثال، زمانی که یک مخرب استثنایی را raise میکند یا هنگام زبالهروبی (gc.collect()). (مشارکتشده توسط Victor Stinner در bpo-36829.)
tarfile¶
ماژول tarfile اکنون برای آرشیوهای جدید بهطور پیشفرض از قالب مدرن pax (POSIX.1-2001) استفاده میکند، بهجای قالب قبلی مخصوص GNU. این امر قابلیت حمل بینسکویی را با کدگذاری یکنواخت (UTF-8) در قالبی استانداردشده و توسعهپذیر بهبود میبخشد و چندین مزیت دیگر نیز ارائه میدهد. (مشارکتشده توسط C.A.M. Gerlach در bpo-36268.)
threading¶
تابع جدید threading.excepthook() افزوده شد که استثنای گرفتهنشدهی threading.Thread.run() را مدیریت میکند. میتوانید آن را بازنویسی کنید تا نحوهی مدیریت استثناهای گرفتهنشدهی threading.Thread.run() را کنترل کنید. (مشارکتشده توسط ویکتور استینر در bpo-1230540.)
تابع جدید threading.get_native_id() و ویژگی native_id به کلاس threading.Thread اضافه شدند. اینها شناسه صحیح بومی نخ جاری را که توسط هسته به آن اختصاص دادهشده است، برمیگردانند. این قابلیت تنها روی پلتفرمهای خاصی در دسترس است؛ برای اطلاعات بیشتر به get_native_id مراجعه کنید. (مشارکتشده توسط جیک تسلر در bpo-36084.)
tokenize¶
ماژول tokenize اکنون هنگامی که ورودیای فاقد سطر جدید انتهایی به آن ارائه شود، بهطور ضمنی یک توکن NEWLINE تولید میکند. این رفتار اکنون با آنچه توکنساز C بهطور داخلی انجام میدهد مطابقت دارد. (مشارکتشده توسط Ammar Askar در bpo-33899.)
tkinter¶
متدهای selection_from()، selection_present()، selection_range() و selection_to() به کلاس tkinter.Spinbox افزوده شدند. (با مشارکت Juliette Monsel در bpo-34829.)
متد moveto() به کلاس tkinter.Canvas افزوده شد. (مشارکتشده توسط Juliette Monsel در bpo-23831.)
کلاس tkinter.PhotoImage اکنون متدهای transparency_get() و transparency_set() را دارد. (مشارکتشده توسط Zackery Spytz در bpo-25451.)
time¶
ساعت جدید CLOCK_UPTIME_RAW برای macOS 10.12 افزوده شد. (با مشارکت Joannah Nanjekye در bpo-35702.)
typing¶
ماژول typing چندین ویژگی جدید را در بر میگیرد:
نوعی دیکشنری با نوع به ازای هر کلید. به PEP 589 و
typing.TypedDictمراجعه کنید. TypedDict فقط از کلیدهای رشتهای استفاده میکند. بهطور پیشفرض، حضور هر کلید الزامی است. برای اختیاری بودن کلیدها، "total=False" را مشخص کنید:class Location(TypedDict, total=False): lat_long: tuple grid_square: str xy_coordinate: tuple
نوعهای لفظی. به PEP 586 و
typing.Literalمراجعه کنید. نوعهای لفظی نشان میدهند که یک پارامتر یا مقدار بازگشتی به یک یا چند مقدار لفظی مشخص محدود است:def get_status(port: int) -> Literal['connected', 'disconnected']: ...
متغیرها، توابع، متدها و کلاسهای «Final». به PEP 591،
typing.Finalو@typing.finalمراجعه کنید. مشخصکنندهی final به بررسیگر نوع ایستا دستور میدهد که زیرکلاسسازی، بازنویسی یا انتساب مجدد را محدود کند:pi: Final[float] = 3.1415926536
تعریفهای پروتکل. به PEP 544،
typing.Protocolو@typing.runtime_checkableمراجعه کنید. کلاسهای پایه انتزاعی سادهای مانندtyping.SupportsIntاکنون زیرکلاسهایProtocolهستند.کلاس پروتکل جدید
typing.SupportsIndex.توابع جدید
typing.get_origin()وtyping.get_args().
unicodedata¶
ماژول unicodedata برای استفاده از نسخهی Unicode 12.1.0 ارتقا یافته است.
میتوان از تابع جدید is_normalized() برای راستیآزمایی اینکه یک رشته در فرم نرمال (normal form) مشخصی قرار دارد استفاده کرد؛ این روش اغلب بسیار سریعتر از نرمالسازی واقعی رشته است. (مشارکتشده توسط Max Belanger، David Euresti و Greg Price در bpo-32285 و bpo-37966).
unittest¶
AsyncMock برای پشتیبانی از نسخهی ناهمگام Mock افزوده شد. توابع ادعای جدید مناسب برای آزمون نیز اضافه شدهاند. (مشارکتشده توسط لیزا روچ در bpo-26467).
تابع addModuleCleanup() و متد addClassCleanup() به unittest اضافه شدند تا از پاکسازیهای مربوط به setUpModule() و setUpClass() پشتیبانی کنند. (مشارکتشده توسط لیزا روچ در bpo-24412.)
چندین تابع ادعای ماک اکنون در صورت شکست، فهرستی از فراخوانیهای واقعی را نیز چاپ میکنند. (ارائهشده توسط Petter Strandmark در bpo-35047.)
ماژول unittest پشتیبانی از استفادهی همروالها بهعنوان موارد آزمون را با unittest.IsolatedAsyncioTestCase به دست آورد. (مشارکت Andrew Svetlov در bpo-32972.)
مثال:
import unittest
class TestRequest(unittest.IsolatedAsyncioTestCase):
async def asyncSetUp(self):
self.connection = await AsyncConnection()
async def test_get(self):
response = await self.connection.get("https://example.com")
self.assertEqual(response.status_code, 200)
async def asyncTearDown(self):
await self.connection.close()
if __name__ == "__main__":
unittest.main()
venv¶
venv اکنون در تمام پلتفرمها شامل یک اسکریپت Activate.ps1 برای فعالسازی محیطهای مجازی در PowerShell Core 6.1 است. (مشارکتشده توسط Brett Cannon در bpo-32718.)
weakref¶
اشیاء پراکسی بازگرداندهشده توسط weakref.proxy() اکنون علاوه بر سایر عملگرهای عددی، از عملگرهای ضرب ماتریسی @ و @= نیز پشتیبانی میکنند. (مشارکتشده توسط Mark Dickinson در bpo-36669.)
xml¶
برای مقابله با بازیابی DTD و موجودیتهای خارجی، ماژولهای xml.dom.minidom و xml.sax دیگر بهطور پیشفرض موجودیتهای خارجی را پردازش نمیکنند. (مشارکتشده توسط Christian Heimes در bpo-17239.)
متدهای .find*() در ماژول xml.etree.ElementTree از جستجوهای وایلدکارد مانند {*}tag که فضای نام را نادیده میگیرد و {namespace}* که همهی تگها را در فضای نام دادهشده برمیگرداند، پشتیبانی میکنند. (مشارکتشده توسط استفان بِهنل در bpo-28238.)
ماژول xml.etree.ElementTree تابع جدیدی canonicalize() ارائه میدهد که C14N 2.0 را پیادهسازی میکند. (مشارکتشده توسط Stefan Behnel در bpo-13611.)
شیء هدف xml.etree.ElementTree.XMLParser میتواند رویدادهای اعلان فضای نام را از طریق متدهای کالبک جدید start_ns() و end_ns() دریافت کند. علاوه بر این، میتوان هدف xml.etree.ElementTree.TreeBuilder را بهگونهای پیکربندی کرد که رویدادهای مربوط به کامنتها و دستورهای پردازشی را پردازش کند و آنها را در درخت تولیدشده بگنجاند. (ارائهشده توسط Stefan Behnel در bpo-36676 و bpo-36673.)
xmlrpc¶
xmlrpc.client.ServerProxy اکنون از یک آرگومان کلیدواژهای اختیاری headers برای دنبالهای از سرآیندهای HTTP که باید با هر درخواست ارسال شوند، پشتیبانی میکند. از جمله موارد دیگر، این امر امکان ارتقا از احراز هویت پایهی پیشفرض به احراز هویت نشستِ سریعتر را فراهم میکند. (مشارکتشده توسط Cédric Krier در bpo-35153.)
بهینهسازی¶
ماژول
subprocessاکنون میتواند در برخی موارد برای کارایی بهتر از تابعos.posix_spawn()استفاده کند. در حال حاضر، این تابع تنها در macOS و Linux (با استفاده از glibc 2.24 یا جدیدتر) در صورتی استفاده میشود که تمام این شرایط برآورده شوند:close_fds نادرست است؛
پارامترهای preexec_fn، pass_fds، cwd و start_new_session تنظیم نشده باشند؛
مسیر اجرایی حاوی یک پوشه است.
(مشارکت Joannah Nanjekye و Victor Stinner در bpo-35537.)
shutil.copyfile()،shutil.copy()،shutil.copy2()،shutil.copytree()وshutil.move()در لینوکس و macOS از فراخوانهای سیستمی «کپی سریع» (fast-copy) مخصوص پلتفرم استفاده میکنند تا پرونده را با کارایی بیشتری کپی کنند. منظور از «کپی سریع» این است که عملیات کپی درون هسته انجام میشود و از استفاده از بافرهای فضای کاربر در پایتون، مانند «outfd.write(infd.read())»، پرهیز میشود. در ویندوز،shutil.copyfile()از اندازه بافر پیشفرض بزرگتری (۱ MiB بهجای ۱۶ KiB) استفاده میکند و از نسخهای ازshutil.copyfileobj()که مبتنی برmemoryview()است استفاده میشود. افزایش سرعت برای کپی کردن یک پرونده ۵۱۲ MiB درون همان پارتیشن، در لینوکس حدود +۲۶٪، در macOS حدود +۵۰٪ و در ویندوز حدود +۴۰٪ است. همچنین، چرخههای CPU بسیار کمتری مصرف میشوند. بخش عملیات کپی کارآمد وابسته به سکو را ببینید. (مشارکت Giampaolo Rodolà در bpo-33671.)shutil.copytree()از تابعos.scandir()استفاده میکند و همهی توابع کپی که به آن وابستهاند از مقادیر نهانگاهشدهیos.stat()استفاده میکنند. افزایش سرعت برای کپی کردن پوشهای با ۸۰۰۰ پرونده حدود ۹٪+ روی لینوکس، ۲۰٪+ روی ویندوز و ۳۰٪+ روی یک اشتراک SMB ویندوز است. همچنین تعداد فراخوانیهای سیستمیos.stat()به میزان ۳۸٪ کاهش مییابد کهshutil.copytree()را بهویژه روی سامانه فایلبندیهای شبکهای سریعتر میکند. (مشارکتشده توسط Giampaolo Rodolà در bpo-33695.)پروتکل پیشفرض در ماژول
pickleاکنون پروتکل 4 است که نخستین بار در پایتون 3.4 معرفی شد. این پروتکل در مقایسه با پروتکل 3 که از پایتون 3.0 در دسترس بوده است، کارایی بهتر و حجم کوچکتری ارائه میدهد.یک عضو
Py_ssize_tازPyGC_Headحذف شد. اندازه تمام اشیاء پیگیریشده توسط زبالهروبی (مانند تاپل، فهرست، دیکشنری) به میزان ۴ یا ۸ بایت کاهش یافت. (ارائهشده توسط Inada Naoki در bpo-33597.)uuid.UUIDاکنون از__slots__استفاده میکند تا میزان حافظه مصرفی خود را کاهش دهد. (مشارکت توسط Wouter Bolsterlee و Tal Einat در bpo-30977)عملکرد
operator.itemgetter()به میزان ۳۳٪ بهبود یافت. مدیریت آرگومانها بهینهسازی شد و یک مسیر سریع (fast path) برای حالت رایج یک اندیس تکی عدد صحیح نامنفی در یک تاپل (که مورد استفادهی معمول در کتابخانه استاندارد است) اضافه شد. (مشارکتشده توسط Raymond Hettinger در bpo-35664.)جستجوی فیلدها در
collections.namedtuple()سریعتر شد. اکنون بیش از دو برابر سریعتر هستند و همین امر آنها را به سریعترین شکل جستجوی متغیر نمونه در پایتون تبدیل میکند. (مشارکت Raymond Hettinger، Pablo Galindo، Joe Jevnik و Serhiy Storchaka در bpo-32492.)اگر پیمایشپذیر ورودی طول معلومی داشته باشد (ورودی
__len__را پیادهسازی میکند)، سازندهیlistبافر داخلی آیتمها را بیش از حد تخصیص نمیدهد. این باعث میشود فهرست ایجادشده بهطور میانگین ۱۲ درصد کوچکتر باشد. (با مشارکت Raymond Hettinger و Pablo Galindo در bpo-33234.)سرعت نوشتن متغیرهای کلاس دو برابر شد. وقتی یک ویژگی غیر دندر (dunder) بهروزرسانی میشد، فراخوانی غیرضروری برای بهروزرسانی جایگاهها انجام میشد. (با مشارکت Stefan Behnel، Pablo Galindo Salgado، Raymond Hettinger، Neil Schemenauer و Serhiy Storchaka در bpo-36012.)
سربار تبدیل آرگومانهایی که به بسیاری از توابع و متدهای توکار پاس داده میشوند کاهش یافت. این کار فراخوانی برخی از توابع و متدهای سادهی توکار را تا ۲۰ تا ۵۰ درصد سریعتر کرد. (مشارکتشده توسط Serhiy Storchaka در bpo-23867، bpo-35582 و bpo-36127.)
دستور
LOAD_GLOBALاکنون از سازوکار جدید «نهانگاه به ازای هر آپکد» (per opcode cache) استفاده میکند. این دستور اکنون حدود ۴۰٪ سریعتر است. (با مشارکت Yury Selivanov و Inada Naoki در bpo-26219.)
تغییرات ساخت و C API¶
مقدار پیشفرض
sys.abiflagsبه یک رشته خالی تبدیل شد: پرچمmبرای pymalloc بیفایده شد (ساختهای با و بدون pymalloc از نظر ABI سازگارند) و به همین دلیل حذفشده است. (مشارکتشده توسط Victor Stinner در bpo-36707.)نمونهای از تغییرات:
تنها برنامهی
python3.8نصب میشود و برنامهیpython3.8mدیگر وجود ندارد.فقط اسکریپت
python3.8-configنصب میشود و اسکریپتpython3.8m-configدیگر وجود ندارد.پرچم
mاز پسوند نام پروندههای کتابخانههای پویا حذف شده است: ماژولهای توسعهای در کتابخانه استاندارد و همچنین ماژولهایی که توسط بستههای شخص ثالث، مانند بستههای دانلودشده از PyPI، تولید و نصب میشوند. برای مثال، در لینوکس، پسوند.cpython-37m-x86_64-linux-gnu.soپایتون 3.7 در پایتون 3.8 به.cpython-38-x86_64-linux-gnu.soتبدیل شد.
پروندههای سرآیند برای تفکیک بهتر انواع مختلف API بازسازماندهی شدهاند:
Include/*.hباید API قابلحمل، عمومی و پایدار زبان C باشد.Include/cpython/*.hباید API ناپایدار C مخصوص سیپایتون باشد؛ API عمومی، به همراه برخی APIهای خصوصی که پیشوند_Pyیا_PYدارند.Include/internal/*.hAPI داخلی و خصوصی C است که بسیار مختص سیپایتون است. این API هیچ تضمینی برای سازگاری با نسخههای قبلی ندارد و نباید خارج از سیپایتون استفاده شود. این API تنها برای نیازهای بسیار خاص مانند اشکالزداها و پروفایلگیرهایی که باید بدون فراخوانی توابع به بخشهای داخلی سیپایتون دسترسی داشته باشند، در دسترس قرار گرفته است. این API اکنون توسطmake installنصب میشود.
(مشارکتشده توسط Victor Stinner در bpo-35134 و bpo-35081؛ کاری که Eric Snow آن را در پایتون 3.7 آغاز کرده بود.)
برخی از ماکروها به توابع درونخطی ایستا تبدیل شدهاند: انواع پارامترها و نوع بازگشتی بهخوبی تعریف شدهاند، آنها مشکلات خاص ماکروها را ندارند، متغیرها محدوده محلی دارند. مثالها:
PyObject_INIT,PyObject_INIT_VARتوابع خصوصی:
_PyObject_GC_TRACK()،_PyObject_GC_UNTRACK()،_Py_Dealloc()
(مشارکتشده توسط ویکتور استینر در bpo-35059.)
توابع
PyByteArray_Init()وPyByteArray_Fini()حذف شدهاند. این توابع از زمان پایتون 2.7.4 و پایتون 3.2.0 هیچ کاری انجام نمیدادند، از API محدود (ABI پایدار) مستثنا بودند و مستند نشده بودند. (مشارکتشده توسط Victor Stinner در bpo-35713.)نتیجهی تابع
PyExceptionClass_Name()اکنون از نوعconst char *است، نهchar *. (مشارکتشده توسط Serhiy Storchaka در bpo-33818.)دوگانگی
Modules/Setup.distوModules/Setupحذف شده است. پیشتر، هنگام بهروزرسانی درخت منبع سیپایتون، لازم بودModules/Setup.dist(درون درخت منبع) بهصورت دستی بهModules/Setup(درون درخت ساخت) کپی شود تا هرگونه تغییر بالادستی منعکس گردد. این موضوع سود اندکی برای بستهسازان داشت، اما به بهای مزاحمتی مکرر برای توسعهدهندگانی که توسعه سیپایتون را دنبال میکنند تمام میشد، زیرا فراموش کردن کپی این پرونده میتوانست باعث شکست در ساخت شود.اکنون سیستم ساخت همیشه از
Modules/Setupدرون درخت منبع میخواند. افرادی که میخواهند آن پرونده را سفارشیسازی کنند، تشویق میشوند تا تغییرات خود را در یک فورک گیت از سیپایتون یا بهصورت پروندههای وصله نگهداری کنند، همانطور که برای هر تغییر دیگری در درخت منبع انجام میدهند.(با مشارکت Antoine Pitrou در bpo-32430.)
توابعی که عدد پایتون را به عدد صحیح C تبدیل میکنند (مانند
PyLong_AsLong()) و توابع پارس آرگومان مانندPyArg_ParseTuple()با واحدهای قالب تبدیلکننده به عدد صحیح مانند'i'، اکنون در صورت وجود از متد ویژهی__index__()بهجای__int__()استفاده میکنند. هشدار منسوخشدن برای اشیایی که متد__int__()را دارند اما متد__index__()را ندارند (مانندDecimalوFraction) صادر خواهد شد.PyNumber_Check()اکنون برای اشیایی که__index__()را پیادهسازی میکنند1برمیگرداند.PyNumber_Long()،PyNumber_Float()وPyFloat_AsDouble()نیز اکنون در صورت وجود از متد__index__()استفاده میکنند. (مشارکتشده توسط Serhiy Storchaka در bpo-36048 و bpo-20092.)اشیاء نوعِ تخصیصیافته در هیپ اکنون شمارش ارجاع خود را در
PyObject_Init()(و ماکرو موازی آنPyObject_INIT) افزایش میدهند، نه درPyType_GenericAlloc(). نوعهایی که تخصیص یا آزادسازی نمونه را تغییر میدهند، ممکن است نیاز به تعدیل داشته باشند. (مشارکتشده توسط Eddie Elizondo در bpo-35810.)تابع جدید
PyCode_NewWithPosOnlyArgs()مانندPyCode_New()امکان ایجاد شیءهای کد را فراهم میکند، اما با یک پارامتر اضافی posonlyargcount برای نشان دادن تعداد آرگومانهای صرفاً جایگاهی. (مشارکت Pablo Galindo در bpo-37221.)Py_SetPath()اکنونsys.executableرا به مسیر کامل برنامه (Py_GetProgramFullPath()) تنظیم میکند، نه به نام برنامه (Py_GetProgramName()). (مشارکتشده توسط ویکتور استینر در bpo-38234.)
منسوخ¶
دستور
bdist_wininstدر distutils اکنون منسوخ شده است؛ بهجای آن ازbdist_wheel(بستههای wheel) استفاده کنید. (مشارکتشده توسط Victor Stinner در bpo-37481.)متدهای منسوخ
getchildren()وgetiterator()در ماژولElementTreeاکنون بهجایPendingDeprecationWarning، یکDeprecationWarningمنتشر میکنند. این متدها در پایتون 3.9 حذف خواهند شد. (مشارکتشده توسط Serhiy Storchaka در bpo-29209.)گذراندن شیئی که نمونهای از
concurrent.futures.ThreadPoolExecutorنیست بهloop.set_default_executor()منسوخ شده است و در پایتون 3.9 ممنوع خواهد شد. (مشارکتشده توسط Elvis Pranskevichus در bpo-34075.)متدهای
__getitem__()درxml.dom.pulldom.DOMEventStream،wsgiref.util.FileWrapperوfileinput.FileInputمنسوخ شدهاند.پیادهسازیهای این متدها پارامتر اندیس خود را نادیده میگرفتهاند و در عوض آیتم بعدی را برمیگرداندهاند. (با مشارکت برکر پکساگ در bpo-9372.)
کلاس
typing.NamedTupleویژگی_field_typesرا به نفع ویژگی__annotations__که دارای همان اطلاعات است، منسوخ کرده است. (مشارکتشده توسط Raymond Hettinger در bpo-36320.)کلاسهای
Num،Str،Bytes،NameConstantوEllipsisدرastمنسوخ در نظر گرفته میشوند و در نسخههای آینده پایتون حذف خواهند شد. به جای آنها باید ازConstantاستفاده کرد. (ارائهشده توسط Serhiy Storchaka در bpo-32892.)متدهای
ast.NodeVisitorشاملvisit_Num()،visit_Str()،visit_Bytes()،visit_NameConstant()وvisit_Ellipsis()اکنون منسوخ شدهاند و در نسخههای آینده پایتون فراخوانی نخواهند شد. برای مدیریت همه گرههای ثابت، متدvisit_Constant()را اضافه کنید. (مشارکتشده توسط Serhiy Storchaka در bpo-36917.)دکوراتور
@asyncio.coroutineمنسوخ شده است و در نسخهی 3.10 حذف خواهد شد. بهجای@asyncio.coroutine، ازasync defاستفاده کنید. (با مشارکت Andrew Svetlov در bpo-36921.)در
asyncio، انتقال صریح آرگومان حلقه منسوخ شده است و در نسخهی 3.10 برای موارد زیر حذف خواهد شد:asyncio.sleep()،asyncio.gather()،asyncio.shield()،asyncio.wait_for()،asyncio.wait()،asyncio.as_completed()،asyncio.Task،asyncio.Lock،asyncio.Event،asyncio.Condition،asyncio.Semaphore،asyncio.BoundedSemaphore،asyncio.Queue،asyncio.create_subprocess_exec()وasyncio.create_subprocess_shell().انتقال صریح اشیاء همروال به
asyncio.wait()منسوخ شده است و در نسخه 3.11 حذف خواهد شد. (مشارکتشده توسط یوری سلیوانوف در bpo-34790.)توابع و متدهای زیر در ماژول
gettextمنسوخ شدهاند:lgettext()،ldgettext()،lngettext()وldngettext(). این توابع بایتهای کدگذاریشده برمیگردانند و اگر مشکلاتی در کدگذاری رشتههای ترجمهشده وجود داشته باشد، ممکن است با استثناهای غیرمنتظرهی مرتبط با یونیکد مواجه شوید. به مراتب بهتر است از جایگزینهایی استفاده کنید که در پایتون ۳ رشتههای یونیکدی برمیگردانند. این توابع مدتهاست که معیوب بودهاند.تابع
bind_textdomain_codeset()، متدهایNullTranslations.output_charset()وNullTranslations.set_output_charset()، و پارامتر codeset توابعtranslation()وinstall()نیز منسوخ شدهاند، زیرا فقط برای توابعl*gettext()استفاده میشوند. (مشارکتشده توسط Serhiy Storchaka در bpo-33710.)متد
isAlive()ازthreading.Threadمنسوخ شده است. (مشارکتکننده: Donghee Na در bpo-35283.)بسیاری از توابع توکار و توسعهای که آرگومانهای عدد صحیح میگیرند، اکنون برای اشیای
Decimal،Fractionو هر شیء دیگری که تنها با از دست رفتن اطلاعات قابل تبدیل به عدد صحیح است (برای مثال، متد__int__()را دارند اما متد__index__()را ندارند) هشدار منسوخشدن صادر میکنند. در نسخههای آینده این موارد خطا خواهند بود. (مشارکتشده توسط Serhiy Storchaka در bpo-36048.)گذر دادن آرگومانهای زیر بهصورت آرگومانهای کلیدواژهای منسوخ شده است:
func در
functools.partialmethod()،weakref.finalize()،profile.Profile.runcall()،cProfile.Profile.runcall()،bdb.Bdb.runcall()،trace.Trace.runfunc()وcurses.wrapper().تابع در
unittest.TestCase.addCleanup().fn در متد
submit()ازconcurrent.futures.ThreadPoolExecutorوconcurrent.futures.ProcessPoolExecutor.کالبک در
contextlib.ExitStack.callback()،contextlib.AsyncExitStack.callback()وcontextlib.AsyncExitStack.push_async_callback().c و typeid در متد
create()ازmultiprocessing.managers.Serverوmultiprocessing.managers.SharedMemoryServer.obj در
weakref.finalize().
در نسخههای آینده پایتون، آنها فقطجایگاهی خواهند بود. (مشارکتشده توسط Serhiy Storchaka در bpo-36492.)
حذف APIها و قابلیتها¶
قابلیتها و APIهای زیر از پایتون 3.8 حذف شدهاند:
از پایتون 3.3 به بعد، ایمپورت کردن کلاسهای پایه انتزاعی از
collectionsمنسوخ اعلام شد و ایمپورت باید ازcollections.abcانجام شود. قابلیت ایمپورت از collections در نسخه 3.8 برای حذف علامتگذاری شده بود، اما حذف آن به نسخه 3.9 به تعویق افتاد. (به gh-81134 مراجعه کنید.)ماژول
macpathکه در پایتون 3.7 منسوخ شده بود، حذف شد. (نوشتهی Victor Stinner در bpo-35471.)تابع
platform.popen()پس از آنکه از پایتون 3.3 منسوخ شده بود، حذف شده است: به جای آن ازos.popen()استفاده کنید. (مشارکت توسط ویکتور استینر در bpo-35345.)تابع
time.clock()که از پایتون 3.3 منسوخ شده بود، حذف شده است: بسته به نیازمندیهای شما، بهجای آن ازtime.perf_counter()یاtime.process_time()استفاده کنید تا رفتاری خوشتعریف داشته باشید. (ارائهشده توسط Matthias Bussonnier در bpo-36895.)اسکریپت
pyvenvبه نفعpython3.8 -m venvحذف شده است تا به رفع سردرگمی دربارهی اینکه اسکریپتpyvenvبه کدام مفسر پایتون مرتبط است کمک کند. (مشارکتشده توسط Brett Cannon در bpo-25427.)توابع
parse_qs،parse_qslوescapeاز ماژولcgiحذف شدهاند. این توابع در پایتون 3.2 یا قدیمیتر منسوخ شدهاند. به جای آن، باید از ماژولهایurllib.parseوhtmlایمپورت شوند.تابع
filemodeاز ماژولtarfileحذف شده است. این تابع مستند نشده بود و از پایتون 3.3 منسوخ شده بود.سازندهی
XMLParserآرگومان html را دیگر نمیپذیرد. این آرگومان هرگز اثری نداشت و در پایتون 3.4 منسوخ شد. همهی پارامترهای دیگر اکنون فقطکلیدواژهای هستند. (مشارکتشده توسط Serhiy Storchaka در bpo-29209.)متد
doctype()ازXMLParserحذف شد. (مشارکتشده توسط سرهی استورچاکا در bpo-29209.)کدک "unicode_internal" حذف شده است. (مشارکتشده توسط Inada Naoki در bpo-36297.)
اشیاء
CacheوStatementماژولsqlite3در دسترس کاربر قرار نمیگیرند. (مشارکتشده توسط آویو پالیوودا در bpo-30262.)آرگومان کلیدواژهای
bufsizeدرfileinput.input()وfileinput.FileInput()که از پایتون 3.6 نادیده گرفته میشد و منسوخ شده بود، حذف شده است. bpo-36952 (مشارکتشده توسط Matthias Bussonnier.)توابع
sys.set_coroutine_wrapper()وsys.get_coroutine_wrapper()که در Python 3.7 منسوخ شده بودند، حذف شدهاند؛ bpo-36933 (مشارکت توسط Matthias Bussonnier.)
انتقال به پایتون 3.8¶
این بخش، تغییرات پیشتر شرحدادهشده و سایر رفع اشکالهایی را که ممکن است نیازمند تغییراتی در کد شما باشند، فهرست میکند.
تغییرات در رفتار پایتون¶
عبارتهای yield (هر دو بند
yieldوyield from) اکنون در درکها و عبارتهای تولیدگر ممنوع شدهاند (بهجز عبارت پیمایشپذیر در چپترین بندfor). (نوشتهی Serhiy Storchaka در bpo-10544.)کامپایلر اکنون هنگامی که بررسیهای هویت (
isوis not) با انواع خاصی از مقادیر لفظی (مانند رشتهها و اعداد) به کار برده شوند،SyntaxWarningتولید میکند. این بررسیها اغلب ممکن است بهطور اتفاقی در سیپایتون کار کنند، اما مشخصات زبان آنها را تضمین نمیکند. این هشدار به کاربران توصیه میکند به جای آن از آزمونهای برابری (==و!=) استفاده کنند. (نوشتهی سرهی استورچاکا در bpo-34850.)مفسر سیپایتون میتواند در برخی شرایط استثناها را بلعد. در پایتون 3.8 این اتفاق در موارد کمتری رخ میدهد. بهطور خاص، استثناهایی که هنگام دریافت ویژگی از دیکشنری نوع ایجاد میشوند، دیگر نادیده گرفته نمیشوند. (مشارکتشده توسط Serhiy Storchaka در bpo-35459.)
پیادهسازیهای
__str__از نوعهای توکارbool،int،float،complexو چند کلاس از کتابخانه استاندارد حذف شدند. این کلاسها اکنون__str__()را ازobjectبه ارث میبرند. در نتیجه، تعریف متد__repr__()در زیرکلاس این کلاسها بر نمایش رشتهای آنها تأثیر میگذارد. (مشارکتشده توسط Serhiy Storchaka در bpo-36793.)در AIX،
sys.platformدیگر شامل شماره نسخهی اصلی نیست. همیشه'aix'است، بهجای'aix3'..'aix7'. از آنجا که نسخههای قدیمیتر پایتون شامل شماره نسخه هستند، توصیه میشود همیشه ازsys.platform.startswith('aix')استفاده کنید. (مشارکتشده توسط M. Felt در bpo-36588.)PyEval_AcquireLock()وPyEval_AcquireThread()اکنون در صورتی که هنگام نهاییسازی مفسر فراخوانی شوند، نخ فعلی را خاتمه میدهند و باPyEval_RestoreThread()،Py_END_ALLOW_THREADS()وPyGILState_Ensure()سازگار میشوند. اگر این رفتار مطلوب نیست، با بررسی_Py_IsFinalizing()یاsys.is_finalizing()از فراخوانی محافظت کنید. (مشارکتشده توسط Joannah Nanjekye در bpo-36475.)
تغییرات در API پایتون¶
تابع
os.getcwdb()اکنون در ویندوز بهجای صفحهکد ANSI از کدگذاری UTF-8 استفاده میکند؛ برای اطلاع از دلایل این تغییر، به PEP 529 مراجعه کنید. این تابع دیگر در ویندوز منسوخ نیست. (مشارکتشده توسط ویکتور استینر در bpo-37412.)subprocess.Popenاکنون میتواند در برخی موارد برای عملکرد بهتر ازos.posix_spawn()استفاده کند. در Windows Subsystem for Linux و QEMU User Emulation، سازندهیPopenکه ازos.posix_spawn()استفاده میکند، دیگر هنگام رخ دادن خطاهایی مانند «برنامهی مفقود» استثنایی ایجاد نمیکند. در عوض، فرایند فرزند باreturncodeغیرصفر شکست میخورد. (مشارکتشده توسط Joannah Nanjekye و Victor Stinner در bpo-35537.)آرگومان preexec_fn از *
subprocess.Popenدیگر با زیرمفسرها سازگار نیست. استفاده از این پارامتر در یک زیرمفسر اکنون استثنایRuntimeErrorرا ایجاد میکند. (مشارکتشده توسط Eric Snow در bpo-34651، اصلاحشده توسط Christian Heimes در bpo-37951.)متد
imaplib.IMAP4.logout()دیگر استثناهای دلخواه را بیصدا نادیده نمیگیرد. (مشارکتشده توسط Victor Stinner در bpo-36348.)تابع
platform.popen()پس از آنکه از پایتون 3.3 منسوخ شده بود، حذف شده است: به جای آن ازos.popen()استفاده کنید. (مشارکت توسط ویکتور استینر در bpo-35345.)تابع
statistics.mode()دیگر هنگام دریافت دادههای چندمدی، استثنا مطرح نمیکند. در عوض، نخستین مد مشاهدهشده در دادههای ورودی را برمیگرداند. (مشارکتشده توسط Raymond Hettinger در bpo-35892.)متد
selection()از کلاسtkinter.ttk.Treeviewدیگر آرگومانی نمیپذیرد. استفاده از آن همراه با آرگومانها برای تغییر انتخاب، در پایتون 3.6 منسوخ شد. برای تغییر انتخاب، از متدهای تخصصی مانندselection_set()استفاده کنید. (مشارکت Serhiy Storchaka در bpo-31508.)متدهای
writexml()،toxml()وtoprettyxml()درxml.dom.minidomو متدwrite()درxml.etree.ElementTreeاکنون ترتیب ویژگیهای تعیینشده توسط کاربر را حفظ میکنند. (با مشارکت Diego Rojas و Raymond Hettinger در bpo-34160.)پایگاه داده
dbm.dumbکه با پرچم'r'باز شده باشد، اکنون فقطخواندنی است.dbm.dumb.open()با پرچمهای'r'و'w'دیگر در صورت وجود نداشتن، پایگاه داده ایجاد نمیکند. (مشارکت Serhiy Storchaka در bpo-32749.)متد
doctype()تعریفشده در زیرکلاسی ازXMLParserدیگر فراخوانی نمیشود و بهجایDeprecationWarning، یکRuntimeWarningمنتشر خواهد کرد. برای مدیریت اعلان doctype در XML، متدdoctype()را روی هدف تعریف کنید. (مشارکتشده توسط Serhiy Storchaka در bpo-29209.)اکنون وقتی فراکلاس سفارشی ورودی
__classcell__را در فضای نام پاسدادهشده بهtype.__new__فراهم نمیکند، استثنایRuntimeErrorپرتاب میشود. در پایتون 3.6 تا 3.7، هشدارDeprecationWarningصادر میشد. (مشارکت Serhiy Storchaka در bpo-23722.)کلاس
cProfile.Profileاکنون میتواند بهعنوان مدیر زمینه به کار رود. (مشارکتشده توسط Scott Sanderson در bpo-29235.)shutil.copyfile()،shutil.copy()،shutil.copy2()،shutil.copytree()وshutil.move()از فراخوانهای سیستمی «کپی سریع» (fast-copy) مخصوص پلتفرم استفاده میکنند (به بخش عملیات کپی کارآمد وابسته به سکو مراجعه کنید).اندازه بافر پیشفرض
shutil.copyfile()در ویندوز از ۱۶ KiB به ۱ MiB تغییر یافت.ساختار
PyGC_Headبهطور کامل تغییر کرده است. تمام کدهایی که به عضو ساختار دسترسی داشتند باید بازنویسی شوند. (به bpo-33597 مراجعه کنید.)ساختار
PyInterpreterStateبه پروندههای سرآیند «داخلی» منتقل شده است (بهطور مشخص Include/internal/pycore_pystate.h). یکPyInterpreterStateمات همچنان بهعنوان بخشی از API عمومی (و ABI پایدار) در دسترس است. مستندات نشان میدهند که هیچیک از فیلدهای این ساختار عمومی نیستند، بنابراین امیدواریم کسی از آنها استفاده نکرده باشد. با این حال، اگر به یک یا چند مورد از آن فیلدهای خصوصی وابستهاید و جایگزینی ندارید، لطفاً یک مورد در BPO ثبت کنید. ما به شما کمک خواهیم کرد تا خود را تطبیق دهید (که ممکن است شامل افزودن توابع دسترسی به API عمومی باشد). (به bpo-35886 مراجعه کنید.)متد
mmap.flush()اکنون در همهی پلتفرمها در صورت موفقیتNoneرا برمیگرداند و در صورت خطا استثنا ایجاد میکند. پیشتر، رفتار این متد وابسته به پلتفرم بود: در ویندوز در صورت موفقیت مقداری غیر از صفر برگردانده میشد؛ در صورت خطا مقدار صفر برگردانده میشد. در یونیکس در صورت موفقیت مقدار صفر برگردانده میشد؛ در صورت خطا استثنا ایجاد میشد. (مشارکتشده توسط برکر پکساگ در bpo-2122.)ماژولهای
xml.dom.minidomوxml.saxدیگر موجودیتهای خارجی را بهطور پیشفرض پردازش نمیکنند. (مشارکتشده توسط Christian Heimes در bpo-17239.)حذف یک کلید از پایگاه دادهی فقطخواندنی
dbm(dbm.dumb،dbm.gnuیاdbm.ndbm) به جایKeyError،error(dbm.dumb.error،dbm.gnu.errorیاdbm.ndbm.error) را ایجاد میکند. (مشارکتشده توسط Xiang Zhang در bpo-33106.)درخت سینتکس انتزاعی (AST) سادهشده برای مقادیر لفظی. همهی ثابتها بهصورت نمونههای
ast.Constantنمایش داده خواهند شد. نمونهسازی از کلاسهای قدیمیNum،Str،Bytes،NameConstantوEllipsisنمونهای ازConstantرا برخواهد گرداند. (مشارکتشده توسط Serhiy Storchaka در bpo-32892.)expanduser()در ویندوز اکنون متغیر محیطیUSERPROFILEرا ترجیح میدهد و ازHOMEاستفاده نمیکند که معمولاً برای حسابهای کاربری عادی تنظیم نمیشود. (مشارکتشده توسط Anthony Sottile در bpo-36264.)استثنای
asyncio.CancelledErrorاکنون ازBaseExceptionبه جایExceptionارثبری میکند و دیگر ازconcurrent.futures.CancelledErrorارثبری نمیکند. (مشارکتشده توسط یوری سلیوانوف در bpo-32528.)تابع
asyncio.wait_for()اکنون هنگام استفاده از نمونهای ازasyncio.Taskبهدرستی منتظر لغو میماند. پیشتر، با رسیدن به مهلت زمانی، لغو میشد و بلافاصله بازمیگشت. (مشارکت Elvis Pranskevichus در bpo-32751.)تابع
asyncio.BaseTransport.get_extra_info()اکنون هنگامی که 'socket' به پارامتر name ارسال شود، یک شیء سوکتِ ایمن برای استفاده برمیگرداند. (مشارکت از Yury Selivanov در bpo-37027.)asyncio.BufferedProtocolبه API پایدار ارتقا یافته است.
وابستگیهای DLL برای ماژولهای توسعهای و DLLهایی که با
ctypesدر ویندوز بارگذاری میشوند، اکنون با امنیت بیشتری حل میشوند. فقط مسیرهای سیستم، پوشهی حاوی پرونده DLL یا PYD، و پوشههایی که باadd_dll_directory()اضافه شدهاند، برای وابستگیهای زمان بارگذاری جستجو میشوند. بهطور خاص،PATHو پوشه کاری جاری دیگر استفاده نمیشوند و تغییرات آنها دیگر هیچ تأثیری بر حل عادی DLL نخواهند داشت. اگر برنامه شما به این سازوکارها متکی است، باید بررسی کنید کهadd_dll_directory()وجود دارد و در صورت وجود، هنگام بارگذاری کتابخانهتان از آن برای افزودن پوشه DLLهای خود استفاده کنید. توجه داشته باشید که کاربران ویندوز ۷ باید مطمئن شوند که Windows Update KB2533623 نصب شده است (این مورد همچنین توسط نصبکننده تأیید میشود). (مشارکتشده توسط Steve Dower در bpo-36085.)پروندههای سرآیند و توابع مرتبط با pgen پس از جایگزینی آن با یک پیادهسازی تمامپایتونی حذف شدهاند. (مشارکتشده توسط پابلو گالیندو در bpo-36623.)
types.CodeTypeبرای پشتیبانی از آرگومانهای فقطجایگاهی تعریفشده در PEP 570، پارامتر جدیدی در جایگاه دوم سازنده (posonlyargcount) دارد. آرگومان اول (argcount) اکنون تعداد کل آرگومانهای جایگاهی (شامل آرگومانهای فقطجایگاهی) را نشان میدهد. میتوان از متد جدیدreplace()درtypes.CodeTypeبرای مقاومسازی کد در برابر تغییرات آینده استفاده کرد.پارامتر
digestmodبرایhmac.new()دیگر بهطور پیشفرض از چکیده MD5 استفاده نمیکند.
تغییرات در API زبان C¶
به ساختار
PyCompilerFlagsفیلد جدید cf_feature_version اضافه شد. این فیلد باید بهPY_MINOR_VERSIONمقداردهی اولیه شود. این فیلد بهطور پیشفرض نادیده گرفته میشود و اگر و تنها اگر پرچمPyCF_ONLY_ASTدر cf_flags تنظیم شده باشد، استفاده میشود. (مشارکتشده توسط گیدو ون روسوم در bpo-35766.)تابع
PyEval_ReInitThreads()از C API حذف شده است. این تابع نباید بهصورت صریح فراخوانی شود: بهجای آن ازPyOS_AfterFork_Child()استفاده کنید. (مشارکتشده توسط Victor Stinner در bpo-36728.)در یونیکس، ماژولهای توسعهای C دیگر به libpython پیوند داده نمیشوند، بهجز در اندروید و Cygwin. هنگامی که پایتون تعبیهشده باشد،
libpythonنباید باRTLD_LOCALبارگذاری شود، بلکه باید باRTLD_GLOBALبارگذاری شود. پیشتر نیز، با استفاده ازRTLD_LOCAL، بارگذاری ماژولهای توسعهای C که بهlibpythonپیوند داده نشده بودند — مانند ماژولهای توسعهای C کتابخانهی استاندارد که توسط بخش*shared*ازModules/Setupساخته میشدند — امکانپذیر نبود. (ارائهشده توسط Victor Stinner در bpo-21536.)استفاده از گونههای
#قالبها در تجزیه یا ساخت مقدار (مثلاًPyArg_ParseTuple()،Py_BuildValue()،PyObject_CallFunction()و غیره) بدون تعریفPY_SSIZE_T_CLEANاکنونDeprecationWarningایجاد میکند. این قابلیت در 3.10 یا 4.0 حذف خواهد شد. برای جزئیات، تجزیه آرگومانها و ساخت مقادیر را بخوانید. (با مشارکت Inada Naoki در bpo-36381.)نمونههای نوعهای تخصیصیافته در هیپ (مانند نوعهایی که با
PyType_FromSpec()ایجاد میشوند) ارجاعی به شیء نوع خود نگه میدارند. افزایش شمارش ارجاع این شیءهای نوع ازPyType_GenericAlloc()به توابع سطح پایینتر، یعنیPyObject_Init()وPyObject_INIT، منتقل شده است. این باعث میشود نوعهایی که از طریقPyType_FromSpec()ایجاد میشوند، مانند سایر کلاسها در کد مدیریتشده (managed code) رفتار کنند.نوعهای تخصیصیافته بهصورت ایستا تحت تأثیر قرار نمیگیرند.
در اکثریت قریب به اتفاق موارد، نباید هیچ اثر جانبی وجود داشته باشد. با این حال، نوعهایی که پس از تخصیص یک نمونه، شمارش ارجاع را بهصورت دستی افزایش میدهند (شاید برای دور زدن این اشکال)، اکنون ممکن است نامیرا شوند. برای پرهیز از این موضوع، این کلاسها باید هنگام تخصیصزدایی نمونه، Py_DECREF را روی شیء نوع فراخوانی کنند.
برای پورت کردن صحیح این نوعها به 3.8، لطفاً تغییرات زیر را اعمال کنید:
پس از تخصیص یک نمونه،
Py_INCREFروی شیء نوع را — در صورت وجود — حذف کنید. این ممکن است پس از فراخوانیPyObject_New،PyObject_NewVar،PyObject_GC_New()،PyObject_GC_NewVar()یا هر تخصیصدهنده سفارشی دیگری که ازPyObject_Init()یاPyObject_INITاستفاده میکند، رخ دهد.مثال:
static foo_struct * foo_new(PyObject *type) { foo_struct *foo = PyObject_GC_New(foo_struct, (PyTypeObject *) type); if (foo == NULL) return NULL; #if PY_VERSION_HEX < 0x03080000 // راهحل موقت برای مشکل شماره 35810 پایتون؛ در پایتون 3.8 دیگر ضروری نیست PY_INCREF(type) #endif return foo; }
اطمینان حاصل کنید که تمام توابع
tp_deallocسفارشی انواع تخصیصیافته در هیپ، شمارش ارجاع نوع را کاهش میدهند.مثال:
static void foo_dealloc(foo_struct *instance) { PyObject *type = Py_TYPE(instance); PyObject_GC_Del(instance); #if PY_VERSION_HEX >= 0x03080000 // This was not needed before Python 3.8 (Python issue 35810) Py_DECREF(type); #endif }
(مشارکت توسط Eddie Elizondo در bpo-35810.)
ماکروی
Py_DEPRECATED()برای MSVC پیادهسازی شده است. اکنون این ماکرو باید پیش از نام نماد قرار گیرد.مثال:
Py_DEPRECATED(3.8) PyAPI_FUNC(int) Py_OldFunction(void);
(مشارکتشده توسط Zackery Spytz در bpo-33407.)
مفسر دیگر وانمود نمیکند که از سازگاری دودویی نوعهای توسعهای میان نسخههای ویژگی پشتیبانی میکند.
PyTypeObjectکه توسط یک ماژول توسعهای شخص ثالث اکسپورت میشود، باید تمامی جایگاههای مورد انتظار در نسخهی فعلی پایتون را داشته باشد، از جملهtp_finalize(Py_TPFLAGS_HAVE_FINALIZEدیگر پیش از خواندنtp_finalizeبررسی نمیشود).(با مشارکت آنتوان پیترو در bpo-32388.)
توابع
PyNode_AddChild()وPyParser_AddToken()اکنون دو آرگومانintاضافی به نامهای end_lineno و end_col_offset را میپذیرند.پروندهی
libpython38.aکه به ابزارهای MinGW اجازه میدهد مستقیماً بهpython38.dllپیوند دهند، دیگر در توزیع معمولی ویندوز گنجانده نمیشود. اگر به این پرونده نیاز دارید، میتوانید آن را با ابزارهایgendefوdlltoolتولید کنید که بخشی از بستهی binutils در MinGW هستند:gendef - python38.dll > tmp.def dlltool --dllname python38.dll --def tmp.def --output-lib libpython38.a
مکان یک
pythonXY.dllنصبشده به گزینههای نصب و نسخه و زبان ویندوز بستگی خواهد داشت. برای اطلاعات بیشتر به استفاده از پایتون در ویندوز مراجعه کنید. کتابخانهی حاصل باید در همان پوشهیpythonXY.libقرار داده شود، که این پوشه معمولاً پوشهیlibsدر محل نصب پایتون شماست.(مشارکتشده توسط استیو داور در bpo-37351.)
تغییرات بایتکد سیپایتون¶
حلقهی مفسر با انتقال منطق واگشایی (unrolling) پشتهی بلوکها به کامپایلر ساده شده است. کامپایلر اکنون دستورهای صریحی برای تنظیم پشتهی مقادیر و فراخوانی کد پاکسازی برای
break،continueوreturnتولید میکند.کدهای عمل
BREAK_LOOP،CONTINUE_LOOP،SETUP_LOOPوSETUP_EXCEPTحذف شدند. کدهای عمل جدیدROT_FOUR،BEGIN_FINALLY،CALL_FINALLYوPOP_FINALLYافزوده شدند. رفتارEND_FINALLYوWITH_CLEANUP_STARTتغییر یافت.(با مشارکت Mark Shannon، Antoine Pitrou و Serhiy Storchaka در bpo-17611.)
آپکد جدید
END_ASYNC_FORبرای مدیریت استثناهایی که هنگام await کردن آیتم بعدی در حلقهasync forایجاد میشوند، اضافه شد. (مشارکت Serhiy Storchaka در bpo-33041.)MAP_ADDاکنون مقدار را بهعنوان نخستین عنصر پشته و کلید را بهعنوان دومین عنصر آن انتظار دارد. این تغییر انجام شد تا در درک دیکشنری، کلید همیشه پیش از مقدار ارزیابی شود، همانطور که در PEP 572 پیشنهاد شده است. (مشارکت bpo-35224 توسط Jörn Heissler.)
نمایشها و ابزارها¶
یک اسکریپت بنچمارک برای زمانسنجی روشهای مختلف دسترسی به متغیرها افزوده شد: Tools/scripts/var_access_benchmark.py. (مشارکت Raymond Hettinger در bpo-35884.)
در ادامه، خلاصهای از بهبودهای عملکرد از زمان پایتون 3.3 آمده است:
نسخهی پایتون 3.3 3.4 3.5 3.6 3.7 3.8
-------------- --- --- --- --- --- ---
دسترسی برای خواندن متغیر و ویژگی:
read_local 4.0 7.1 7.1 5.4 5.1 3.9
read_nonlocal 5.3 7.1 8.1 5.8 5.4 4.4
read_global 13.3 15.5 19.0 14.3 13.6 7.6
read_builtin 20.0 21.1 21.6 18.5 19.0 7.5
read_classvar_from_class 20.5 25.6 26.5 20.7 19.5 18.4
read_classvar_from_instance 18.5 22.8 23.5 18.8 17.1 16.4
read_instancevar 26.8 32.4 33.1 28.0 26.3 25.4
read_instancevar_slots 23.7 27.8 31.3 20.8 20.8 20.2
read_namedtuple 68.5 73.8 57.5 45.0 46.8 18.4
read_boundmethod 29.8 37.6 37.9 29.6 26.9 27.7
دسترسی برای نوشتن متغیر و ویژگی:
write_local 4.6 8.7 9.3 5.5 5.3 4.3
write_nonlocal 7.3 10.5 11.1 5.6 5.5 4.7
write_global 15.9 19.7 21.2 18.0 18.0 15.8
write_classvar 81.9 92.9 96.0 104.6 102.1 39.2
write_instancevar 36.4 44.6 45.8 40.0 38.9 35.5
write_instancevar_slots 28.7 35.6 36.1 27.3 26.6 25.7
دسترسی برای خواندن ساختار داده:
read_list 19.2 24.2 24.5 20.8 20.8 19.0
read_deque 19.9 24.7 25.5 20.2 20.6 19.8
read_dict 19.7 24.3 25.7 22.3 23.0 21.0
read_strdict 17.9 22.6 24.3 19.5 21.2 18.9
دسترسی برای نوشتن ساختار داده:
write_list 21.2 27.1 28.5 22.5 21.6 20.0
write_deque 23.8 28.7 30.1 22.7 21.8 23.5
write_dict 25.9 31.4 33.3 29.3 29.2 24.7
write_strdict 22.9 28.4 29.9 27.5 25.2 23.1
عملیات پشته (یا صف):
list_append_pop 144.2 93.4 112.7 75.4 74.2 50.8
deque_append_pop 30.4 43.5 57.0 49.4 49.2 42.5
deque_append_popleft 30.8 43.7 57.3 49.7 49.7 42.8
حلقهی زمانسنجی:
loop_overhead 0.3 0.5 0.6 0.4 0.3 0.3
این بنچمارکها روی یک پردازندهی Intel® Core™ i7-4960HQ که نسخههای ۶۴ بیتی macOS موجود در python.org را اجرا میکرد، اندازهگیری شدهاند. اسکریپت بنچمارک زمانها را بر حسب نانوثانیه نمایش میدهد.
تغییرات قابل توجه در پایتون 3.8.1¶
به دلیل نگرانیهای امنیتی جدی، پارامتر reuse_address در asyncio.loop.create_datagram_endpoint() دیگر پشتیبانی نمیشود. دلیل آن، رفتار گزینهی سوکت SO_REUSEADDR در UDP است. برای جزئیات بیشتر، مستندات loop.create_datagram_endpoint() را ببینید. (مشارکت توسط Kyle Stanley، Antoine Pitrou و Yury Selivanov در bpo-37228.)
تغییرات قابل توجه در پایتون 3.8.2¶
یک رگرسیون (regression) در کالبک ignore تابع shutil.copytree() رفع شد. انواع آرگومانها اکنون دوباره str و List[str] هستند. (مشارکتشده توسط Manuel Barkhau و Giampaolo Rodola در gh-83571.)
تغییرات قابل توجه در پایتون 3.8.3¶
مقادیر ثابت پرچمهای آینده در ماژول __future__ بهروزرسانی شدهاند تا از تداخل با پرچمهای کامپایلر جلوگیری شود. پیش از این، PyCF_ALLOW_TOP_LEVEL_AWAIT با CO_FUTURE_DIVISION تداخل داشت. (مشارکتشده توسط Batuhan Taskaya در gh-83743)
تغییرات قابل توجه در پایتون 3.8.8¶
نسخههای پیشین پایتون اجازه میدادند از هر دو ; و & بهعنوان جداکنندههای پارامترهای پرسوجو در urllib.parse.parse_qs() و urllib.parse.parse_qsl() استفاده شود. به دلیل نگرانیهای امنیتی، و برای انطباق با توصیههای جدیدتر W3C، این مورد تغییر کرده است تا تنها یک کلید جداکننده را مجاز سازد، که & مقدار پیشفرض آن است. این تغییر بر cgi.parse() و cgi.parse_multipart() نیز تأثیر میگذارد، زیرا این توابع بهطور داخلی از توابع مذکور استفاده میکنند. برای جزئیات بیشتر، لطفاً به مستندات مربوط به هر یک از آنها مراجعه کنید. (مشارکتشده توسط Adam Goldschmidt، Senthil Kumaran و Ken Jin در bpo-42967.)
تغییرات قابل توجه در پایتون 3.8.9¶
یک اصلاحیه امنیتی رفتار ftplib.FTP را بهگونهای تغییر میدهد که هنگام راهاندازی کانال دادهی غیرفعال، به نشانی IPv4 ارسالشده از سوی سرور از راه دور اعتماد نشود. در عوض، ما از نشانی IP سرور ftp بازاستفاده میکنیم. برای کدهای غیرمعمولی که به رفتار قدیمی نیاز دارند، ویژگی trust_server_pasv_ipv4_address را روی نمونه FTP خود به True تنظیم کنید. (ببینید gh-87451)
تغییرات قابل توجه در پایتون 3.8.10¶
پشتیبانی از macOS 11.0 (Big Sur) و مکهای Apple Silicon¶
از نسخه 3.8.10 به بعد، پایتون اکنون از ساخت و اجرا روی macOS 11 (Big Sur) و مکهای Apple Silicon (مبتنی بر معماری ARM64) پشتیبانی میکند. گونه ساخت همگانی جدیدی با نام universal2 اکنون در دسترس است تا هم ARM64 و هم Intel 64 را بهطور بومی در یک مجموعه از پروندههای اجرایی پشتیبانی کند. توجه داشته باشید که پشتیبانی از «پیوندسازی ضعیف» (weaklinking) — یعنی ساخت پروندههای دودویی که برای نسخههای جدیدتر macOS هدفگذاری شدهاند و با آزمودن در زمان اجرا برای قابلیتهای مفقود، در نسخههای قدیمیتر نیز بهدرستی اجرا میشوند — در این بکپورت از پایتون 3.9 گنجانده نشده است؛ برای پشتیبانی از طیفی از نسخههای macOS، همچنان قدیمیترین نسخه در آن طیف را هدف قرار دهید و روی آن بسازید.
(در اصل توسط Ronald Oussoren و Lawrence D'Anna در gh-85272 ارائه شده است، با اصلاحاتی از سوی FX Coudert و Eli Rykoff، و توسط Maxime Bélanger و Ned Deily به نسخه 3.8 بکپورت شده است)
تغییرات قابل توجه در پایتون 3.8.10¶
urllib.parse¶
وجود نویسههای سطر جدید یا تب در بخشهایی از یک URL امکان برخی انواع حملات را فراهم میکند. مطابق مشخصات WHATWG که RFC 3986 را بهروزرسانی میکند، نویسههای سطر جدید اسکی \n، \r و نویسههای تب \t توسط پارسر در urllib.parse از URL حذف میشوند و بدین ترتیب از چنین حملاتی جلوگیری میشود. نویسههای حذفشونده توسط یک متغیر جدید در سطح ماژول به نام urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE کنترل میشوند. (به bpo-43882 مراجعه کنید)
تغییرات قابل توجه در پایتون 3.8.12¶
تغییرات در API پایتون¶
از پایتون 3.8.12 به بعد، ماژول ipaddress دیگر هیچ صفر ابتدایی در رشتههای نشانی IPv4 را نمیپذیرد. صفرهای ابتدایی مبهم هستند و برخی کتابخانهها آنها را بهعنوان نمادگذاری مبنای هشت تفسیر میکنند. برای مثال، تابع قدیمی socket.inet_aton() صفرهای ابتدایی را بهعنوان نمادگذاری مبنای هشت در نظر میگیرد. پیادهسازی glibc از تابع مدرن inet_pton() هیچ صفر ابتدایی را نمیپذیرد.
(در اصل توسط Christian Heimes در bpo-36384 ارائه شد، و توسط Achraf Merzouki به نسخه 3.8 بکپورت شد.)
ویژگی امنیتی قابل توجه در 3.8.14¶
اکنون تبدیل بین int و str در مبناهایی غیر از ۲ (دودویی)، ۴، ۸ (هشتایی)، ۱۶ (مبنای شانزده) یا ۳۲، مانند مبنای ۱۰ (دهدهی)، در صورتی که تعداد ارقام در قالب رشته از حدی بیشتر باشد، یک ValueError ایجاد میکند تا از حملات احتمالی انکار سرویس بهدلیل پیچیدگی الگوریتمی جلوگیری شود. این یک اقدام کاهشی برای CVE 2020-10735 است. این محدودیت را میتوان از طریق متغیر محیطی، پرچم خط فرمان یا APIهای sys پیکربندی یا غیرفعال کرد. به مستندات محدودیت طول تبدیل رشتهای عدد صحیح مراجعه کنید. محدودیت پیشفرض برابر با ۴۳۰۰ رقم در قالب رشته است.
تغییرات قابل توجه در 3.8.17¶
tarfile¶
متدهای استخراج در
tarfileوshutil.unpack_archive()، آرگومان جدیدی به نام filter دارند که امکان محدود کردن ویژگیهای tar را فراهم میکند؛ ویژگیهایی که ممکن است غافلگیرکننده یا خطرناک باشند، مانند ایجاد پروندهها خارج از پوشهی مقصد. برای جزئیات به فیلترهای استخراج مراجعه کنید. در پایتون 3.12، استفاده بدون آرگومان filter یکDeprecationWarningنمایش خواهد داد. در پایتون 3.14، مقدار پیشفرض به'data'تغییر خواهد کرد. (مشارکتشده توسط Petr Viktorin در PEP 706.)