تازه‌های پایتون 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/*.h API داخلی و خصوصی C است که بسیار مختص سی‌پایتون است. این API هیچ تضمینی برای سازگاری با نسخه‌های قبلی ندارد و نباید خارج از سی‌پایتون استفاده شود. این API تنها برای نیازهای بسیار خاص مانند اشکال‌زداها و پروفایل‌گیرهایی که باید بدون فراخوانی توابع به بخش‌های داخلی سی‌پایتون دسترسی داشته باشند، در دسترس قرار گرفته است. این API اکنون توسط make install نصب می‌شود.

    (مشارکت‌شده توسط Victor Stinner در bpo-35134 و bpo-35081؛ کاری که Eric Snow آن را در پایتون 3.7 آغاز کرده بود.)

  • برخی از ماکروها به توابع درون‌خطی ایستا تبدیل شده‌اند: انواع پارامترها و نوع بازگشتی به‌خوبی تعریف شده‌اند، آن‌ها مشکلات خاص ماکروها را ندارند، متغیرها محدوده محلی دارند. مثال‌ها:

    (مشارکت‌شده توسط ویکتور استینر در 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.)

  • گذر دادن آرگومان‌های زیر به‌صورت آرگومان‌های کلیدواژه‌ای منسوخ شده است:

    در نسخه‌های آینده پایتون، آن‌ها فقط‌جایگاهی خواهند بود. (مشارکت‌شده توسط 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.)