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

ویرایشگرها:

Elvis Pranskevichus <elvis@magic.io>, Yury Selivanov <yury@magic.io>

این مقاله ویژگی‌های جدید پایتون 3.5 را در مقایسه با 3.4 توضیح می‌دهد. پایتون 3.5 در تاریخ ۱۳ سپتامبر ۲۰۱۵ منتشر شد. برای فهرست کامل تغییرات، فهرست تغییرات را ببینید.

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

PEP 478 - زمان‌بندی انتشار پایتون 3.5

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

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

  • PEP 492، هم‌روال‌ها با سینتکس async و await.

  • PEP 465، عملگر جدید ضرب ماتریسی: a @ b.

  • PEP 448، تعمیم‌های بیشتر واگشایی.

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

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

  • bytes % args، bytearray % args: PEP 461 -- افزودن قالب‌بندی % به bytes و bytearray.

  • متدهای جدید bytes.hex()، bytearray.hex() و memoryview.hex(). (ارائه‌شده توسط Arnon Yaari در bpo-9951.)

  • memoryview اکنون از اندیس‌گذاری با تاپل (شامل چندبعدی) پشتیبانی می‌کند. (با مشارکت آنتوان پی‌ترو در bpo-23632.)

  • تولیدگرها ویژگی جدید gi_yieldfrom دارند که شیء‌ای را که توسط عبارت‌های yield from پیمایش می‌شود، برمی‌گرداند. (با مشارکت Benno Leslie و Yury Selivanov در bpo-24450.)

  • اکنون هنگامی که به حداکثر عمق بازگشت می‌رسد، استثنای جدید RecursionError ایجاد می‌شود. (مشارکت‌شده توسط Georg Brandl در bpo-19235.)

بهبودهای پیاده‌سازی سی‌پایتون:

  • وقتی locale مربوط به LC_TYPE برابر locale پوزیکس (locale با C) باشد، sys.stdin و sys.stdout اکنون از هندلر خطای surrogateescape به‌جای هندلر خطای strict استفاده می‌کنند. (مشارکت‌شده توسط Victor Stinner در bpo-19977.)

  • پرونده‌های .pyo دیگر استفاده نمی‌شوند و با طرح‌واره‌ای انعطاف‌پذیرتر جایگزین شده‌اند که سطح بهینه‌سازی را به‌طور صریح در نام .pyc می‌گنجاند. (رجوع کنید به مرور PEP 488.)

  • ماژول‌های توکار و توسعه‌ای اکنون در یک فرایند چندمرحله‌ای مقداردهی اولیه می‌شوند که مشابه روش بارگذاری ماژول‌های پایتون است. (به مرور PEP 489 مراجعه کنید.)

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

بهبودهای امنیتی:

  • SSLv3 اکنون در سراسر کتابخانه استاندارد غیرفعال شده است. همچنان می‌توان آن را با نمونه‌سازی دستی ssl.SSLContext فعال کرد. (برای جزئیات بیشتر به bpo-22638 مراجعه کنید؛ این تغییر به سی‌پایتون 3.4 و 2.7 بک‌پورت شد.)

  • تجزیه کوکی HTTP اکنون سخت‌گیرانه‌تر است تا در برابر حملات تزریق احتمالی محافظت شود. (مشارکت‌شده توسط آنتوان پی‌ترو در bpo-22796.)

بهبودهای ویندوز:

  • نصب‌کننده جدیدی برای ویندوز جایگزین MSI قدیمی شده است. برای اطلاعات بیشتر به استفاده از پایتون در ویندوز مراجعه کنید.

  • ساخت‌های ویندوز اکنون از Microsoft Visual C++ 14.0 استفاده می‌کنند و ماژول‌های توسعه‌ای نیز باید از همان استفاده کنند.

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

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

PEP 492 - هم‌روال‌ها با سینتکس async و await

PEP 492 با افزودن اشیاء انتظارپذیر، توابع هم‌روال، پیمایش ناهمگام و مدیرهای زمینه ناهمگام، پشتیبانی از برنامه‌نویسی ناهمگام در پایتون را به‌طور چشمگیری بهبود می‌بخشد.

توابع هم‌روال با استفاده از سینتکس جدید async def تعریف می‌شوند:

>>> async def coro():
...     return 'spam'

درون یک تابع هم‌روال، می‌توان از عبارت جدید await برای تعلیق اجرای هم‌روال تا زمانی که نتیجه در دسترس باشد استفاده کرد. هر شیء را می‌توان await کرد، به شرط آنکه پروتکل awaitable را با تعریف متد __await__() پیاده‌سازی کرده باشد.

PEP 492 همچنین دستور async for را برای پیمایش آسان روی پیمایش‌پذیرهای ناهمگام اضافه می‌کند.

مثالی از یک کلاینت HTTP ابتدایی که با استفاده از سینتکس جدید نوشته شده است:

import asyncio

async def http_get(domain):
    reader, writer = await asyncio.open_connection(domain, 80)

    writer.write(b'\r\n'.join([
        b'GET / HTTP/1.1',
        b'Host: %b' % domain.encode('latin-1'),
        b'Connection: close',
        b'', b''
    ]))

    async for line in reader:
        print('>>>', line)

    writer.close()

loop = asyncio.get_event_loop()
try:
    loop.run_until_complete(http_get('example.com'))
finally:
    loop.close()

همانند پیمایش ناهمگام، سینتکس جدیدی برای مدیرهای زمینه ناهمگام وجود دارد. اسکریپت زیر:

import asyncio

async def coro(name, lock):
    print('coro {}: waiting for lock'.format(name))
    async with lock:
        print('coro {}: holding the lock'.format(name))
        await asyncio.sleep(1)
        print('coro {}: releasing the lock'.format(name))

loop = asyncio.get_event_loop()
lock = asyncio.Lock()
coros = asyncio.gather(coro(1, lock), coro(2, lock))
try:
    loop.run_until_complete(coros)
finally:
    loop.close()

خروجی خواهد داد:

coro 2: waiting for lock
coro 2: holding the lock
coro 1: waiting for lock
coro 2: releasing the lock
coro 1: holding the lock
coro 1: releasing the lock

توجه داشته باشید که هر دو async for و async with تنها درون تابع هم‌روالی که با async def تعریف‌شده است قابل استفاده هستند.

توابع هم‌روال برای اجرا درون یک حلقه رویداد سازگار، مانند حلقه‌ی asyncio، در نظر گرفته شده‌اند.

توجه

تغییر یافته در نسخه‌ی 3.5.2: از سی‌پایتون 3.5.2 به بعد، __aiter__ می‌تواند مستقیماً پیمایش‌گرهای ناهمگام را بازگرداند. بازگرداندن یک شیء انتظارپذیر منجر به یک PendingDeprecationWarning خواهد شد.

برای جزئیات بیشتر، به بخش مستندات پیمایش‌گرهای ناهمگام مراجعه کنید.

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

PEP 492 -- هم‌روال‌ها با سینتکس async و await

PEP توسط یوری سلیوانوف نوشته و پیاده‌سازی شده است.

PEP 465 - عملگر میان‌وندی اختصاصی برای ضرب ماتریسی

PEP 465 عملگر میان‌وندی @ را برای ضرب ماتریسی اضافه می‌کند. در حال حاضر، هیچ نوع توکار پایتونی این عملگر جدید را پیاده‌سازی نکرده است، اما می‌توان آن را با تعریف __matmul__()، __rmatmul__() و __imatmul__() برای ضرب ماتریسی معمولی، بازتابی و درجا پیاده‌سازی کرد. معناشناسی این متدها مشابه معناشناسی متدهایی است که سایر عملگرهای حسابی میان‌وندی را تعریف می‌کنند.

ضرب ماتریسی عملیاتی به‌طور قابل توجهی رایج در بسیاری از حوزه‌های ریاضیات، علم و مهندسی است و افزودن @ امکان نوشتن کد تمیزتر را فراهم می‌کند:

S = (H @ beta - r).T @ inv(H @ V @ H.T) @ (H @ beta - r)

به‌جای:

S = dot((dot(H, beta) - r).T,
        dot(inv(dot(dot(H, V), H.T)), dot(H, beta) - r))

NumPy 1.10 از عملگر جدید پشتیبانی می‌کند:

>>> import numpy

>>> x = numpy.ones(3)
>>> x
array([ 1., 1., 1.])

>>> m = numpy.eye(3)
>>> m
array([[ 1., 0., 0.],
       [ 0., 1., 0.],
       [ 0., 0., 1.]])

>>> x @ m
array([ 1., 1., 1.])

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

PEP 465 -- عملگر میان‌وندی اختصاصی برای ضرب ماتریسی

PEP نوشته‌شده توسط Nathaniel J. Smith؛ پیاده‌سازی‌شده توسط Benjamin Peterson.

PEP 448 - تعمیم‌های تکمیلی واگشایی

PEP 448 کاربردهای مجاز عملگر واگشایی پیمایش‌پذیر * و عملگر واگشایی دیکشنری ** را گسترش می‌دهد. اکنون می‌توان از هر تعداد واگشایی در فراخوانی توابع استفاده کرد:

>>> print(*[1], *[2], 3, *[4, 5])
1 2 3 4 5

>>> def fn(a, b, c, d):
...     print(a, b, c, d)
...

>>> fn(**{'a': 1, 'c': 3}, **{'b': 2, 'd': 4})
1 2 3 4

به‌طور مشابه، نمایش‌های تاپل، فهرست، مجموعه و دیکشنری چندین واگشایی را مجاز می‌دانند (به فهرست‌های عبارت و نمایش‌های دیکشنری مراجعه کنید):

>>> *range(4), 4
(0, 1, 2, 3, 4)

>>> [*range(4), 4]
[0, 1, 2, 3, 4]

>>> {*range(4), 4, *(5, 6, 7)}
{0, 1, 2, 3, 4, 5, 6, 7}

>>> {'x': 1, **{'y': 2}}
{'x': 1, 'y': 2}

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

PEP 448 -- تعمیم‌های بیشتر واگشایی

PEP (پیشنهاد بهبود پایتون) نوشته‌شده توسط جاشوا لاندائو؛ پیاده‌سازی‌شده توسط نیل گردار، توماس ووترز و جاشوا لاندائو.

PEP 461 - پشتیبانی از قالب‌بندی درصدی برای bytes و bytearray

PEP 461 پشتیبانی از عملگر درون‌یابی % را به bytes و bytearray می‌افزاید.

اگرچه درون‌یابی معمولاً به‌عنوان عملیاتی روی رشته در نظر گرفته می‌شود، مواردی وجود دارد که درون‌یابی روی bytes یا bytearrays منطقی است، و کار لازم برای جبران نبود این قابلیت از خوانایی کلی کد می‌کاهد. این مسئله به‌ویژه هنگام کار با پروتکل‌های قالب سیمی (wire format) اهمیت دارد؛ پروتکل‌هایی که اغلب ترکیبی از داده‌های دودویی و متن سازگار با اسکی هستند.

مثال‌ها:

>>> b'Hello %b!' % b'World'
b'Hello World!'

>>> b'x=%i y=%f' % (1, 2.5)
b'x=1 y=2.500000'

یونیکد برای %b مجاز نیست، اما توسط %a پذیرفته می‌شود (معادل repr(obj).encode('ascii', 'backslashreplace')):

>>> b'Hello %b!' % 'World'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: %b requires bytes, or an object that implements __bytes__, not 'str'

>>> b'price: %a' % '10€'
b"price: '10\\u20ac'"

توجه داشته باشید که نوع‌های تبدیل %s و %r، هرچند پشتیبانی می‌شوند، باید تنها در پایگاه‌های کدی استفاده شوند که به سازگاری با پایتون 2 نیاز دارند.

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

PEP 461 -- افزودن قالب‌بندی % به bytes و bytearray

PEP نوشته‌شده توسط Ethan Furman؛ پیاده‌سازی‌شده توسط Neil Schemenauer و Ethan Furman.

PEP 484 - راهنمای نوع

سینتکس حاشیه‌نویسی تابع از نسخه 3.0 یک قابلیت پایتون بوده است (PEP 3107)، اما معناشناسی حاشیه‌نویسی‌ها تعریف‌نشده باقی مانده است.

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

PEP 484 یک ماژول آزمایشی را معرفی می‌کند که این تعریف‌ها و ابزارهای استاندارد را، همراه با برخی قراردادها برای مواردی که حاشیه‌نویسی‌ها در دسترس نیستند، فراهم می‌آورد.

برای مثال، در اینجا یک تابع ساده آمده است که نوع آرگومان و نوع بازگشتی‌اش در حاشیه‌نویسی‌ها اعلام شده است:

def greeting(name: str) -> str:
    return 'Hello ' + name

در حالی که این حاشیه‌نویسی‌ها در زمان اجرا از طریق ویژگی متداول __annotations__ در دسترس هستند، هیچ بررسی نوع خودکاری در زمان اجرا انجام نمی‌شود. در عوض، فرض بر این است که یک بررسی‌گر نوع آفلاین جداگانه (مثلاً mypy) برای تحلیل کد منبع در صورت نیاز استفاده خواهد شد.

سیستم نوع از اجتماع‌ها، نوع‌های عام و یک نوع خاص به نام Any پشتیبانی می‌کند که با همه نوع‌ها سازگار است (یعنی به همه نوع‌ها و از همه نوع‌ها قابل انتساب است).

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

  • مستندات ماژول typing

  • PEP 484 -- راهنماهای نوع

    PEP نوشته‌شده توسط Guido van Rossum، Jukka Lehtosalo و Łukasz Langa؛ پیاده‌سازی‌شده توسط Guido van Rossum.

  • PEP 483 -- نظریه‌ی راهنماهای نوع

    PEP (پیشنهاد بهبود پایتون) نوشته‌شده به دست گیدو ون روسوم

PEP 471 - تابع os.scandir() -- پیمایش‌گری بهتر و سریع‌تر برای پوشه‌ها

PEP 471 یک تابع پیمایش پوشه‌ی جدید، os.scandir()، به کتابخانه استاندارد اضافه می‌کند. علاوه بر این، os.walk() اکنون با استفاده از scandir پیاده‌سازی شده است که آن را در سیستم‌های POSIX ۳ تا ۵ برابر و در سیستم‌های ویندوز ۷ تا ۲۰ برابر سریع‌تر می‌کند. این امر عمدتاً با کاهش چشمگیر تعداد فراخوانی‌های os.stat() مورد نیاز برای پیمایش یک درخت پوشه به دست آمده است.

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

مثال زیر استفاده‌ی ساده‌ای از os.scandir() را برای نمایش همه‌ی پرونده‌ها (به‌جز پوشه‌ها) در path داده‌شده که با '.' شروع نمی‌شوند نشان می‌دهد. فراخوانی entry.is_file() به‌طور کلی فراخوانی سیستمی اضافی انجام نمی‌دهد:

for entry in os.scandir(path):
    if not entry.name.startswith('.') and entry.is_file():
        print(entry.name)

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

PEP 471 -- تابع os.scandir() -- پیمایش‌گر پوشه‌ای بهتر و سریع‌تر

PEP توسط Ben Hoyt با کمک Victor Stinner نوشته و پیاده‌سازی شده است.

PEP 475: تلاش مجدد برای فراخوانی‌های سیستمی که با EINTR شکست می‌خورند

هر زمان که فراخوانی سیستمی‌ای که در انتظار I/O است توسط سیگنالی قطع شود، کد خطای errno.EINTR برگردانده می‌شود. پیش‌تر، پایتون در چنین مواردی InterruptedError ایجاد می‌کرد. این بدان معنا بود که هنگام نوشتن یک برنامه پایتون، توسعه‌دهنده دو گزینه داشت:

  1. InterruptedError را نادیده بگیرید.

  2. InterruptedError را مدیریت کنید و در هر محل فراخوانی، تلاش کنید فراخوانی سیستمیِ قطع‌شده را دوباره اجرا کنید.

گزینه اول باعث می‌شود یک برنامه به‌صورت متناوب از کار بیفتد. گزینه دوم مقدار زیادی کد پیش‌ساخته اضافه می‌کند که خوانایی کد را تقریباً از بین می‌برد. مقایسه کنید:

print("Hello World")

و:

while True:
    try:
        print("Hello World")
        break
    except InterruptedError:
        continue

PEP 475 تلاش مجدد خودکار فراخوان‌های سیستمی هنگام EINTR را پیاده‌سازی می‌کند. این امر در بیشتر موارد بارِ مواجهه با EINTR یا InterruptedError در کد کاربر را از بین می‌برد و برنامه‌های پایتون، از جمله کتابخانه استاندارد، را مقاوم‌تر می‌سازد. توجه داشته باشید که فراخوان سیستمی تنها در صورتی مجدداً اجرا می‌شود که هندلر سیگنال استثنایی ایجاد نکند.

در ادامه فهرستی از توابعی که اکنون هنگام قطع شدن توسط سیگنال، دوباره اجرا می‌شوند، آمده است:

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

PEP 475 -- تلاش دوباره برای فراخوانی‌های سیستمی که با EINTR شکست می‌خورند

PEP و پیاده‌سازی آن توسط شارل-فرانسوا ناتالی و ویکتور استینر، با کمک آنتوان پیترو (اتصال فرانسوی) نوشته شده است.

PEP 479: تغییر مدیریت StopIteration درون تولیدگرها

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

PEP 479 رفتار تولیدگرها را تغییر می‌دهد: وقتی استثنای StopIteration درون یک تولیدگر مطرح شود، پیش از آنکه از فریم تولیدگر خارج شود، با RuntimeError جایگزین می‌شود. هدف اصلی این تغییر، آسان‌تر کردن اشکال‌زدایی در موقعیتی است که فراخوانی محافظت‌نشده‌ی next() استثنای StopIteration را مطرح می‌کند و باعث می‌شود پیمایشی که توسط تولیدگر کنترل می‌شود، بی‌صدا خاتمه یابد. این وضعیت به‌ویژه در ترکیب با سازه‌ی yield from زیان‌بار است.

این یک تغییر ناسازگار با گذشته است، بنابراین برای فعال‌سازی رفتار جدید، ایمپورت __future__ ضروری است:

>>> from __future__ import generator_stop

>>> def gen():
...     next(iter([]))
...     yield
...
>>> next(gen())
Traceback (most recent call last):
  File "<stdin>", line 2, in gen
StopIteration

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: generator raised StopIteration

بدون ایمپورت __future__، هر زمان که استثنای StopIteration درون یک تولیدگر ایجاد شود، هشدار PendingDeprecationWarning ایجاد خواهد شد.

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

PEP 479 -- تغییر نحوه‌ی مدیریت StopIteration درون تولیدگرها

PEP نوشته‌شده توسط Chris Angelico و Guido van Rossum. پیاده‌سازی‌شده توسط Chris Angelico، Yury Selivanov و Nick Coghlan.

PEP 485: تابعی برای آزمودن برابری تقریبی

PEP 485 توابع math.isclose() و cmath.isclose() را اضافه می‌کند که مشخص می‌کنند آیا دو مقدار تقریباً برابر یا «نزدیک» به یکدیگر هستند یا خیر. این‌که دو مقدار نزدیک در نظر گرفته شوند یا نه، بر اساس رواداری‌های مطلق و نسبی داده‌شده تعیین می‌شود. رواداری نسبی، بیشینه‌ی اختلاف مجاز بین آرگومان‌های isclose نسبت به مقدار مطلق بزرگ‌تر است:

>>> import math
>>> a = 5.0
>>> b = 4.99998
>>> math.isclose(a, b, rel_tol=1e-5)
True
>>> math.isclose(a, b, rel_tol=1e-6)
False

همچنین می‌توان دو مقدار را با استفاده از تلورانس مطلق، که باید مقداری نا‌منفی باشد، مقایسه کرد:

>>> import math
>>> a = 5.0
>>> b = 4.99998
>>> math.isclose(a, b, abs_tol=0.00003)
True
>>> math.isclose(a, b, abs_tol=0.00001)
False

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

PEP 485 -- تابعی برای آزمودن برابری تقریبی

PEP نوشته‌شده توسط کریستوفر بارکر؛ پیاده‌سازی‌شده توسط کریس بارکر و تال اینات.

PEP 486: آگاه‌سازی راه‌انداز پایتون از محیط‌های مجازی

PEP 486 راه‌انداز ویندوز (نگاه کنید به PEP 397) را از محیط مجازی فعال آگاه می‌کند. هنگامی که قرار باشد از مفسر پیش‌فرض استفاده شود و متغیر محیطی VIRTUAL_ENV تنظیم‌شده باشد، از مفسر موجود در محیط مجازی استفاده خواهد شد.

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

PEP 486 -- آگاه کردن راه‌انداز پایتون از محیط‌های مجازی

PEP نوشته و پیاده‌سازی‌شده توسط Paul Moore.

PEP 488: حذف پرونده‌های PYO

PEP 488 مفهوم پرونده‌های .pyo را حذف می‌کند. این بدان معناست که پرونده‌های .pyc هم بایت‌کد بهینه‌نشده و هم بایت‌کد بهینه‌شده را نشان می‌دهند. برای جلوگیری از نیاز به تولید مجدد مداوم پرونده‌های بایت‌کد، پرونده‌های .pyc اکنون هنگامی که بایت‌کد بهینه شده باشد، یک برچسب اختیاری opt- در نام خود دارند. اثر جانبی این کار آن است که هنگام اجرا با هر یک از -O یا -OO، دیگر تداخل نام پرونده‌های بایت‌کد رخ نمی‌دهد. در نتیجه، پرونده‌های بایت‌کد تولیدشده با -O و -OO اکنون می‌توانند هم‌زمان وجود داشته باشند. importlib.util.cache_from_source() برای کمک به این تغییر، API به‌روزرسانی‌شده‌ای دارد.

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

PEP 488 -- حذف پرونده‌های PYO

PEP (پیشنهاد بهبود پایتون) توسط برت کانون نوشته و پیاده‌سازی شده است.

PEP 489: مقداردهی اولیه چندمرحله‌ای ماژول توسعه‌ای

PEP 489 مقداردهی اولیه ماژول توسعه‌ای را به‌روزرسانی می‌کند تا از سازوکار بارگذاری دومرحله‌ای ماژول که توسط PEP 451 در پایتون 3.4 معرفی شد، بهره بگیرد.

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

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

PEP 489 -- راه‌اندازی چندمرحله‌ای ماژول توسعه‌ای

PEP نوشته‌شده توسط Petr Viktorin، Stefan Behnel و Nick Coghlan؛ پیاده‌سازی‌شده توسط Petr Viktorin.

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

برخی از تغییرات کوچک‌تر اعمال‌شده در هسته زبان پایتون عبارت‌اند از:

  • هندلرهای خطای "namereplace" افزوده شدند. هندلرهای خطای "backslashreplace" اکنون با کدگشایی و ترجمه (translating) کار می‌کنند. (مشارکت‌شده توسط Serhiy Storchaka در bpo-19676 و bpo-22286.)

  • گزینه‌ی -b اکنون بر مقایسه‌های bytes با int تأثیر می‌گذارد. (مشارکت‌شده توسط Serhiy Storchaka در bpo-23681.)

  • کدک‌های جدید قزاقی kz1048 و تاجیکی koi8_t. (مشارکت‌شده توسط Serhiy Storchaka در bpo-22682 و bpo-22681.)

  • رشته‌های مستند پراپرتی‌ها اکنون نوشتنی هستند. این به‌ویژه برای رشته‌های مستند collections.namedtuple() مفید است. (مشارکت‌شده توسط برکر پکساگ در bpo-24064.)

  • ایمپورت‌های چرخه‌ای که شامل ایمپورت‌های نسبی هستند، اکنون پشتیبانی می‌شوند. (مشارکت Brett Cannon و Antoine Pitrou در bpo-17636.)

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

typing

ماژول جدید و آزمایشی typing تعاریف و ابزارهای استانداردی برای حاشیه‌نویسی نوع تابع فراهم می‌کند. برای اطلاعات بیشتر به راهنماهای نوع مراجعه کنید.

zipapp

ماژول جدید zipapp (که در PEP 441 مشخص شده است) یک API و ابزار خط فرمان برای ایجاد برنامه‌های zip اجرایی پایتون فراهم می‌کند؛ برنامه‌هایی که در پایتون 2.6 و در bpo-1739468 معرفی شدند، اما نه در آن زمان و نه پس از آن، به‌خوبی شناخته نشدند.

با ماژول جدید، بسته‌بندی برنامه شما به این سادگی است که همه پرونده‌ها، از جمله یک پرونده __main__.py، را در پوشه‌ای به نام myapp قرار دهید و اجرا کنید:

$ python -m zipapp myapp
$ python myapp.pyz

پیاده‌سازی این ماژول توسط Paul Moore در bpo-23491 ارائه شده است.

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

PEP 441 -- بهبود پشتیبانی از برنامه‌های zip پایتون

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

argparse

کلاس ArgumentParser اکنون اجازه می‌دهد که استفاده‌ی اختصاری از گزینه‌های بلند با تنظیم allow_abbrev روی False غیرفعال شود. (با مشارکت Jonathan Paugh، Steven Bethard، paul j3 و Daniel Eriksson در bpo-14910.)

asyncio

از آنجا که ماژول asyncio آزمایشی است، تمام تغییرات معرفی‌شده در پایتون 3.5 به پایتون 3.4.x نیز بک‌پورت شده‌اند.

تغییرات قابل توجه در ماژول asyncio از زمان پایتون 3.4.0:

  • APIهای جدید اشکال‌زدایی: متدهای loop.set_debug() و loop.get_debug(). (مشارکت‌شده توسط Victor Stinner.)

  • حلقه رویداد پرواکتور (proactor) اکنون از SSL پشتیبانی می‌کند. (با مشارکت آنتوان پی‌ترو و ویکتور استینر در bpo-22560.)

  • متد جدید loop.is_closed() برای بررسی اینکه آیا حلقه رویداد بسته است یا خیر. (مشارکت‌شده توسط Victor Stinner در bpo-21326.)

  • یک loop.create_task() جدید برای ایجاد و زمان‌بندی آسان یک Task جدید برای یک هم‌روال. متد create_task همچنین توسط تمام توابع asyncio که هم‌روال‌ها را در قالب وظایف دربرمی‌گیرند (مانند asyncio.wait()، asyncio.gather() و غیره) استفاده می‌شود. (مشارکت‌شده توسط Victor Stinner.)

  • متد جدید transport.get_write_buffer_limits() برای استعلام حدود بالا (high-water) و پایین (low-water) کنترل جریان. (مشارکت از سوی Victor Stinner.)

  • تابع async() به نفع ensure_future() منسوخ شده است. (مشارکت از طرف یوری سلیوانوف.)

  • متدهای جدید loop.set_task_factory() و loop.get_task_factory() برای سفارشی‌سازی کارخانه وظیفه‌ای که متد loop.create_task() از آن استفاده می‌کند. (مشارکت‌شده توسط یوری سلیوانوف.)

  • متد‌های جدید صف Queue.join() و Queue.task_done(). (مشارکت توسط Victor Stinner.)

  • کلاس JoinableQueue به نفع کلاس asyncio.Queue حذف شد. (مشارکت‌شده توسط Victor Stinner.)

به‌روزرسانی‌ها در 3.5.1:

  • تابع ensure_future() و همه‌ی توابعی که از آن استفاده می‌کنند، مانند loop.run_until_complete()، اکنون همه‌ی انواع اشیاء انتظارپذیر را می‌پذیرند. (مشارکت‌شده توسط یوری سلیوانوف.)

  • تابع جدید run_coroutine_threadsafe() برای ارسال هم‌روال‌ها به حلقه‌های رویداد از نخ‌های دیگر. (مشارکت‌شده توسط ونسان میشل.)

  • متد جدید Transport.is_closing() برای بررسی اینکه آیا ترنسپورت (transport) در حال بسته‌شدن است یا بسته شده است. (مشارکت توسط یوری سلیوانوف.)

  • متد loop.create_server() اکنون می‌تواند فهرستی از میزبان‌ها را بپذیرد. (مشارکت‌شده توسط Yann Sionneau.)

به‌روزرسانی‌ها در 3.5.2:

  • متد جدید loop.create_future() برای ایجاد اشیاء Future. این متد به پیاده‌سازی‌های جایگزین حلقه رویداد، مانند uvloop، اجازه می‌دهد پیاده‌سازی سریع‌تری از asyncio.Future ارائه کنند. (مشارکت‌شده توسط یوری سلیوانوف.)

  • متد جدید loop.get_exception_handler() برای دریافت هندلر استثنای فعلی. (مشارکت از سوی Yury Selivanov.)

  • متد جدید StreamReader.readuntil() برای خواندن داده‌ها از جریان تا زمانی که دنباله‌ای از بایت‌های جداکننده ظاهر شود. (مشارکت: Mark Korenberg.)

  • متدهای loop.create_connection() و loop.create_server() به‌گونه‌ای بهینه شده‌اند که اگر نشانی از قبل حل شده باشد، از فراخوانی تابع سیستمی getaddrinfo اجتناب کنند. (مشارکت: A. Jesse Jiryu Davis.)

  • متد loop.sock_connect(sock, address) دیگر نیازمند آن نیست که address پیش از فراخوانی حل‌شده باشد. (مشارکت‌شده توسط A. Jesse Jiryu Davis.)

bz2

متد BZ2Decompressor.decompress اکنون آرگومان اختیاری max_length را برای محدود کردن حداکثر اندازه‌ی داده‌های واگشایی‌شده می‌پذیرد. (مشارکت Nikolaus Rath در bpo-15955.)

cgi

کلاس FieldStorage اکنون از پروتکل مدیر زمینه پشتیبانی می‌کند. (مشارکت‌شده توسط برکر پکساگ در bpo-20289.)

cmath

تابع جدید isclose() راهی برای آزمون برابری تقریبی فراهم می‌کند. (مشارکت‌شده توسط کریس بارکر و تال اینات در bpo-24270.)

کد

متد InteractiveInterpreter.showtraceback() اکنون ردگیری زنجیره‌ای کامل را چاپ می‌کند، درست مانند مفسر تعاملی. (مشارکت‌شده توسط Claudiu Popa در bpo-17442.)

collections

کلاس OrderedDict اکنون در C پیاده‌سازی شده است، که آن را ۴ تا ۱۰۰ برابر سریع‌تر می‌کند. (مشارکت‌شده توسط اریک اسنو در bpo-16991.)

نماهای OrderedDict.items()، OrderedDict.keys() و OrderedDict.values() اکنون از پیمایش با reversed() پشتیبانی می‌کنند. (مشارکت‌شده توسط Serhiy Storchaka در bpo-19505.)

کلاس deque اکنون index()، insert() و copy() را تعریف می‌کند و از عملگرهای + و * پشتیبانی می‌کند. این امر باعث می‌شود صف‌های دوطرفه به‌عنوان یک MutableSequence شناخته شوند و قابلیت جایگزینی آن‌ها به‌جای فهرست‌ها را بهبود می‌بخشد. (مشارکت Raymond Hettinger در bpo-23704.)

رشته‌های مستند تولید‌شده توسط namedtuple() اکنون می‌توانند به‌روزرسانی شوند:

Point = namedtuple('Point', ['x', 'y'])
Point.__doc__ += ': Cartesian coordinate'
Point.x.__doc__ = 'abscissa'
Point.y.__doc__ = 'ordinate'

(مشارکت‌شده توسط Berker Peksag در bpo-24064.)

کلاس UserString اکنون متدهای __getnewargs__()، __rmod__()، casefold()، format_map()، isprintable() و maketrans() را برای مطابقت با متدهای متناظر str پیاده‌سازی می‌کند. (مشارکت‌شده توسط Joe Jevnik در bpo-22189.)

collections.abc

متد Sequence.index() اکنون آرگومان‌های start و stop را می‌پذیرد تا با متدهای متناظر tuple، list و غیره مطابقت داشته باشد. (مشارکت‌شده توسط Devin Jeanpierre در bpo-23086.)

یک کلاس پایه انتزاعی جدید Generator. (مشارکت‌شده توسط Stefan Behnel در bpo-24018.)

کلاس‌های پایه انتزاعی جدید Awaitable، Coroutine، AsyncIterator و AsyncIterable. (مشارکت‌شده توسط یوری سلیوانوف در bpo-24184.)

برای نسخه‌های قدیمی‌تر پایتون، یک بک‌پورت از کلاس‌های پایه انتزاعی جدید در یک بسته‌ی PyPI خارجی موجود است.

compileall

گزینه‌ی جدید -j N در compileall اجازه می‌دهد که N کارگر به‌طور همزمان برای انجام کامپایل موازی بایت‌کد اجرا شوند. تابع compile_dir() پارامتر متناظری با نام workers دارد. (مشارکت‌شده توسط Claudiu Popa در bpo-16104.)

گزینه‌ی جدید دیگر، -r، امکان کنترل حداکثر سطح بازگشتی برای زیرپوشه‌ها را فراهم می‌کند. (مشارکت‌شده توسط Claudiu Popa در bpo-19628.)

گزینه‌ی -q خط فرمان اکنون می‌تواند بیش از یک بار مشخص شود که در این صورت تمام خروجی، از جمله خطاها، سرکوب خواهد شد. پارامتر متناظر quiet در compile_dir()، compile_file() و compile_path() اکنون می‌تواند یک مقدار عدد صحیح را بپذیرد که سطح سرکوب خروجی را نشان می‌دهد. (مشارکت Thomas Kluyver در bpo-21338.)

concurrent.futures

متد Executor.map() اکنون آرگومان chunksize را می‌پذیرد تا امکان دسته‌بندی وظایف برای بهبود عملکرد هنگام استفاده از ProcessPoolExecutor() فراهم شود. (ارائه‌شده توسط Dan O'Reilly در bpo-11271.)

تعداد کارگرها در سازنده‌ی ThreadPoolExecutor اکنون اختیاری است. مقدار پیش‌فرض ۵ برابر تعداد CPUها است. (مشارکت‌شده توسط Claudiu Popa در bpo-21527.)

configparser

configparser اکنون راهی برای سفارشی‌سازی تبدیل مقادیر فراهم می‌کند: با مشخص کردن دیکشنری‌ای از مبدل‌ها در سازنده‌ی ConfigParser، یا با تعریف آن‌ها به‌عنوان متد در زیرکلاس‌های ConfigParser. مبدل‌های تعریف‌شده در یک نمونه‌ی پارسر، توسط پراکسی‌های بخش آن به ارث برده می‌شوند.

مثال:

>>> import configparser
>>> conv = {}
>>> conv['list'] = lambda v: [e.strip() for e in v.split() if e.strip()]
>>> cfg = configparser.ConfigParser(converters=conv)
>>> cfg.read_string("""
... [s]
... list = a b c d e f g
... """)
>>> cfg.get('s', 'list')
'a b c d e f g'
>>> cfg.getlist('s', 'list')
['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> section = cfg['s']
>>> section.getlist('list')
['a', 'b', 'c', 'd', 'e', 'f', 'g']

(مشارکت‌شده توسط Łukasz Langa در bpo-18159.)

contextlib

مدیر زمینه جدید redirect_stderr() (مشابه redirect_stdout()) کار با API‌های انعطاف‌ناپذیری را که خروجی خود را به sys.stderr می‌نویسند و هیچ گزینه‌ای برای تغییر جهت دادن آن ارائه نمی‌دهند، برای اسکریپت‌های ابزاری آسان‌تر می‌کند:

>>> import contextlib, io, logging
>>> f = io.StringIO()
>>> with contextlib.redirect_stderr(f):
...     logging.warning('warning')
...
>>> f.getvalue()
'WARNING:root:warning\n'

(مشارکت‌شده توسط Berker Peksag در bpo-22389.)

csv

متد writerow() اکنون از پیمایش‌پذیرهای دلخواه پشتیبانی می‌کند، نه فقط از دنباله‌ها. (مشارکت Serhiy Storchaka در bpo-23171.)

curses

تابع جدید update_lines_cols() متغیرهای ماژول LINES و COLS را به‌روزرسانی می‌کند. این برای تشخیص تغییر اندازه دستی صفحه‌نمایش مفید است. (مشارکت Arnon Yaari در bpo-4254.)

dbm

dumb.open وقتی پرچم مقدار "n" را داشته باشد، همیشه یک پایگاه داده جدید ایجاد می‌کند. (مشارکت‌شده توسط Claudiu Popa در bpo-18039.)

difflib

اکنون می‌توان مجموعه‌ی نویسه‌ها در پرونده‌های HTML تولیدشده توسط HtmlDiff.make_file() را با استفاده از آرگومان جدید فقط‌کلیدواژه‌ای charset سفارشی‌سازی کرد. مجموعه‌ی نویسه‌های پیش‌فرض پرونده‌ی HTML از "ISO-8859-1" به "utf-8" تغییر کرد. (مشارکت‌شده توسط Berker Peksag در bpo-2052.)

تابع diff_bytes() اکنون می‌تواند فهرست‌هایی از رشته‌های بایتی را مقایسه کند. این کار یک رگرسیون از پایتون ۲ را برطرف می‌کند. (مشارکت‌شده توسط تری جی. ریدی و گرگ وارد در bpo-17445.)

distutils

هر دو دستور build و build_ext اکنون گزینه‌ی -j را برای فعال‌سازی ساخت موازی ماژول‌های توسعه‌ای می‌پذیرند. (ارائه‌شده توسط آنتوان پی‌ترو در bpo-5309.)

ماژول distutils اکنون از فشرده‌سازی xz پشتیبانی می‌کند و می‌توان آن را با ارسال xztar به‌عنوان آرگومان به bdist --format فعال کرد. (مشارکت‌شده توسط Serhiy Storchaka در bpo-16314.)

doctest

تابع DocTestSuite() اگر module هیچ رشته مستندی نداشته باشد، به‌جای برافراخاستن ValueError یک unittest.TestSuite خالی برمی‌گرداند. (مشارکت‌شده توسط Glenn Jones در bpo-15916.)

email

یک گزینه‌ی جدید برای سیاست‌ها، Policy.mangle_from_، کنترل می‌کند که آیا سطرهایی در بدنه‌ی ایمیل‌ها که با "From " شروع می‌شوند، توسط تولیدگرها با نویسه‌ی ">" پیشونددار می‌شوند یا خیر. مقدار پیش‌فرض برای compat32 برابر با True و برای همه‌ی سیاست‌های دیگر برابر با False است. (با مشارکت Milan Oberkirch در bpo-20098.)

متد جدید Message.get_content_disposition() دسترسی آسان به یک مقدار کانونیکال برای سرآیند Content-Disposition فراهم می‌کند. (مشارکت‌شده توسط Abhilash Raj در bpo-21083.)

یک گزینه‌ی جدید سیاست EmailPolicy.utf8 می‌تواند روی True تنظیم شود تا سرآیندهای ایمیل به‌جای استفاده از واژه‌های کدگذاری‌شده (encoded words)، با مجموعه‌نویسه‌ی UTF-8 کدگذاری شوند. این امکان را فراهم می‌کند که Messages مطابق RFC 6532 قالب‌بندی شوند و با یک سرور SMTP که از توسعه‌ی SMTPUTF8 مطابق RFC 6531 پشتیبانی می‌کند، استفاده شوند. (مشارکت‌شده توسط R. David Murray در bpo-24211.)

سازنده‌ی mime.text.MIMEText اکنون یک نمونه از charset.Charset را می‌پذیرد. (مشارکت‌شده توسط Claude Paroz و Berker Peksag در bpo-16324.)

enum

فراخوانی‌پذیر Enum پارامتر جدیدی به نام start دارد تا در صورتی که فقط names ارائه شده باشند، شماره‌ی آغازین مقادیر enum را مشخص کند:

>>> Animal = enum.Enum('Animal', 'cat dog', start=10)
>>> Animal.cat
<Animal.cat: 10>
>>> Animal.dog
<Animal.dog: 11>

(مشارکت‌شده توسط Ethan Furman در bpo-21706.)

faulthandler

توابع enable()، register()، dump_traceback() و dump_traceback_later() اکنون علاوه بر اشیاء شبه‌پرونده، توصیف‌گرهای پرونده را نیز می‌پذیرند. (مشارکت‌شده توسط Wei Wu در bpo-23566.)

functools

بخش عمده‌ی سازوکارِ @~functools.lru_cache اکنون به زبان C پیاده‌سازی شده است که آن را به‌طور چشمگیری سریع‌تر می‌کند. (با مشارکت Matt Joiner، Alexey Kachayev و Serhiy Storchaka در bpo-14373.)

glob

توابع iglob() و glob() اکنون از جستجوی بازگشتی در زیرپوشه‌ها با استفاده از الگوی "**" پشتیبانی می‌کنند. (مشارکت Serhiy Storchaka در bpo-13968.)

gzip

آرگومان حالت سازنده‌ی GzipFile اکنون "x" را برای درخواست ایجاد انحصاری می‌پذیرد. (مشارکت‌شده توسط Tim Heaney در bpo-19222.)

heapq

مقایسه المان‌ها در merge() اکنون می‌تواند با ارسال یک key function در آرگومان کلیدواژه‌ای جدید و اختیاری key سفارشی‌سازی شود، و می‌توان از آرگومان کلیدواژه‌ای جدید و اختیاری reverse برای معکوس کردن مقایسه المان‌ها استفاده کرد:

>>> import heapq
>>> a = ['9', '777', '55555']
>>> b = ['88', '6666']
>>> list(heapq.merge(a, b, key=len))
['9', '88', '777', '6666', '55555']
>>> list(heapq.merge(reversed(a), reversed(b), key=len, reverse=True))
['55555', '6666', '777', '88', '9']

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

http

یک enum جدید HTTPStatus که مجموعه‌ای از کدهای وضعیت HTTP، عبارت‌های دلیل (reason phrase) و توضیحات بلند نوشته‌شده به زبان انگلیسی را تعریف می‌کند. (مشارکت Demian Brecht در bpo-21793.)

http.client

HTTPConnection.getresponse() اکنون هنگامی که اتصال به سرور راه دور به‌طور غیر‌منتظره بسته شود، استثنای RemoteDisconnected ایجاد می‌کند. علاوه بر این، اگر استثنای ConnectionError (که RemoteDisconnected زیرکلاسی از آن است) ایجاد شود، سوکت کلاینت اکنون به‌طور خودکار بسته می‌شود و در درخواست بعدی دوباره متصل می‌شود:

import http.client
conn = http.client.HTTPConnection('www.python.org')
for retries in range(3):
    try:
        conn.request('GET', '/')
        resp = conn.getresponse()
    except http.client.RemoteDisconnected:
        pass

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

idlelib و IDLE

از آنجا که idlelib پوسته و ویرایشگر IDLE را پیاده‌سازی می‌کند و برای ایمپورت توسط برنامه‌های دیگر در نظر گرفته نشده است، در هر نسخه بهبودهایی می‌یابد. برای فهرست تجمعی تغییرات از نسخه 3.4.0 به بعد، و همچنین تغییرات انجام‌شده در نسخه‌های آینده 3.5.x، به Lib/idlelib/NEWS.txt مراجعه کنید. این پرونده همچنین از طریق گفت‌وگوی IDLE Help ‣ About IDLE در دسترس است.

imaplib

کلاس IMAP4 اکنون از پروتکل مدیر زمینه پشتیبانی می‌کند. هنگامی که در دستور with استفاده شود، فرمان LOGOUT در IMAP4 به‌طور خودکار در پایان بلوک فراخوانی می‌شود. (با مشارکت Tarek Ziadé و Serhiy Storchaka در bpo-4972.)

ماژول imaplib اکنون از RFC 5161 (افزونه‌ی ENABLE) و RFC 6855 (پشتیبانی UTF-8) از طریق متد IMAP4.enable() پشتیبانی می‌کند. ویژگی جدید IMAP4.utf8_enabled پیگیری می‌کند که آیا پشتیبانی RFC 6855 فعال است یا خیر. (مشارکت از Milan Oberkirch، R. David Murray و Maciej Szulik در bpo-21800.)

ماژول imaplib اکنون به‌طور خودکار نام‌های کاربری و گذرواژه‌های رشته‌ایِ غیر ASCII را با استفاده از UTF-8، همان‌طور که در RFCها توصیه شده است، کدگذاری می‌کند. (مشارکت توسط Milan Oberkirch در bpo-21800.)

imghdr

تابع what() اکنون قالب OpenEXR (که توسط Martin Vignali و Claudiu Popa در bpo-20295 ارائه‌شده است) و قالب WebP (که توسط Fabrice Aneche و Claudiu Popa در bpo-20197 ارائه‌شده است) را می‌شناسد.

importlib

کلاس util.LazyLoader در برنامه‌هایی که زمان راه‌اندازی در آن‌ها اهمیت دارد، امکان بارگذاری تنبل ماژول‌ها را فراهم می‌کند. (ارائه‌شده توسط برت کانون در bpo-17621.)

متد abc.InspectLoader.source_to_code() اکنون یک متد ایستا است. این کار مقداردهی اولیه‌ی یک شیء ماژول با کد کامپایل‌شده از یک رشته را از طریق اجرای exec(code, module.__dict__) آسان‌تر می‌کند. (مشارکت‌شده توسط Brett Cannon در bpo-21156.)

تابع جدید util.module_from_spec() اکنون روش ترجیحی برای ایجاد یک ماژول جدید است. برخلاف ایجاد مستقیم یک نمونه‌ی types.ModuleType، این تابع جدید ویژگی‌های مختلفِ کنترل‌شده توسط ایمپورت را بر اساس شیء مشخصات ورودی تنظیم می‌کند. (مشارکت‌شده توسط Brett Cannon در bpo-20383.)

inspect

هر دو کلاس Signature و Parameter اکنون پیکل‌پذیر و هش‌پذیر هستند. (مشارکت‌شده توسط Yury Selivanov در bpo-20726 و bpo-20334.)

متد جدید BoundArguments.apply_defaults() راهی برای تنظیم مقادیر پیش‌فرض آرگومان‌های مفقود فراهم می‌کند:

>>> def foo(a, b='ham', *args): pass
>>> ba = inspect.signature(foo).bind('spam')
>>> ba.apply_defaults()
>>> ba.arguments
OrderedDict([('a', 'spam'), ('b', 'ham'), ('args', ())])

(مشارکت‌شده توسط یوری سلیوانوف در bpo-24190.)

متد کلاس جدید Signature.from_callable() زیرکلاس‌سازی Signature را آسان‌تر می‌کند. (با مشارکت Yury Selivanov و Eric Snow در bpo-17373.)

تابع signature() اکنون یک آرگومان کلیدواژه‌ای اختیاری به نام follow_wrapped را می‌پذیرد که در صورت تنظیم روی False، پیگیری خودکار پیوندهای __wrapped__ را غیرفعال می‌کند. (مشارکت‌شده توسط Yury Selivanov در bpo-20691.)

مجموعه‌ای از توابع جدید برای بررسی توابع هم‌روال و اشیاء هم‌روال افزوده شده است: iscoroutine()، iscoroutinefunction()، isawaitable()، getcoroutinelocals() و getcoroutinestate(). (مشارکت یوری سلیوانوف در bpo-24017 و bpo-24400.)

توابع stack()، trace()، getouterframes() و getinnerframes() اکنون فهرستی از تاپل‌های نام‌دار برمی‌گردانند. (مشارکت‌شده توسط Daniel Shahaf در bpo-16808.)

io

متد جدید BufferedIOBase.readinto1() که متدهای RawIOBase.read() یا RawIOBase.readinto() جریان خام زیرین را حداکثر یک بار فراخوانی می‌کند. (مشارکت‌شده توسط Nikolaus Rath در bpo-20578.)

ipaddress

هر دو کلاس IPv4Network و IPv6Network اکنون آرگومان تاپل (address, netmask) را می‌پذیرند تا بتوان به‌سادگی اشیای شبکه را از آدرس‌های موجود ساخت:

>>> import ipaddress
>>> ipaddress.IPv4Network(('127.0.0.0', 8))
IPv4Network('127.0.0.0/8')
>>> ipaddress.IPv4Network(('127.0.0.0', '255.0.0.0'))
IPv4Network('127.0.0.0/8')

(ارائه‌شده توسط Peter Moody و Antoine Pitrou در bpo-16531.)

ویژگی جدید reverse_pointer برای کلاس‌های IPv4Address و IPv6Address نام رکورد PTR در DNS معکوس را برمی‌گرداند:

>>> import ipaddress
>>> addr = ipaddress.IPv4Address('127.0.0.1')
>>> addr.reverse_pointer
'1.0.0.127.in-addr.arpa'
>>> addr6 = ipaddress.IPv6Address('::1')
>>> addr6.reverse_pointer
'1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa'

(مشارکت‌شده توسط لئون وبر در bpo-20480.)

json

رابط خط فرمان json.tool اکنون ترتیب کلید‌ها را در اشیای JSON ورودی حفظ می‌کند. برای مرتب‌سازی الفبایی کلید‌ها می‌توان از گزینه جدید --sort-keys استفاده کرد. (مشارکت‌شده توسط Berker Peksag در bpo-21650.)

کدگشای JSON اکنون به‌جای ValueError، استثنای JSONDecodeError را ایجاد می‌کند تا اطلاعات زمینه‌ای بهتری درباره‌ی خطا فراهم کند. (مشارکت‌شده توسط Serhiy Storchaka در bpo-19361.)

linecache

تابع جدید lazycache() می‌تواند برای ثبت اطلاعات مربوط به ماژولی که مبتنی بر پرونده نیست استفاده شود تا امکان دریافت سطرهای آن بعداً از طریق getline() فراهم گردد. این کار از انجام عملیات ورودی/خروجی (I/O) تا زمانی که واقعاً به سطری نیاز باشد جلوگیری می‌کند، بدون آنکه لازم باشد متغیرهای سراسری ماژول را به‌طور نامحدود همراه خود نگه داریم. (ارائه‌شده توسط Robert Collins در bpo-17911.)

locale

تابع جدید delocalize() را می‌توان برای تبدیل یک رشته به یک رشته‌ی عددی نرمال‌شده به کار برد که تنظیمات LC_NUMERIC را در نظر می‌گیرد:

>>> import locale
>>> locale.setlocale(locale.LC_NUMERIC, 'de_DE.UTF-8')
'de_DE.UTF-8'
>>> locale.delocalize('1.234,56')
'1234.56'
>>> locale.setlocale(locale.LC_NUMERIC, 'en_US.UTF-8')
'en_US.UTF-8'
>>> locale.delocalize('1,234.56')
'1234.56'

(مشارکت‌شده توسط Cédric Krier در bpo-13918.)

گزارش‌گیری

همه‌ی متدهای گزارش‌گیری (Logger log()، exception()، critical()، debug() و غیره)، اکنون علاوه بر مقادیر بولی و تاپل‌های استثنا، نمونه‌های استثنا را به‌عنوان آرگومان exc_info می‌پذیرند:

>>> import logging
>>> try:
...     1/0
... except ZeroDivisionError as ex:
...     logging.error('exception', exc_info=ex)
ERROR:root:exception

(مشارکت‌شده توسط یوری سلیوانوف در bpo-20537.)

کلاس handlers.HTTPHandler اکنون یک نمونه‌ی اختیاری از ssl.SSLContext را برای پیکربندی تنظیمات SSL استفاده‌شده در یک اتصال HTTP می‌پذیرد. (مشارکت الکس گینور در bpo-22788.)

کلاس handlers.QueueListener اکنون آرگومان کلیدواژه‌ای respect_handler_level را می‌پذیرد که اگر روی True تنظیم شود، پیام‌ها را با در نظر گرفتن سطوح هندلر به هندلرها ارسال می‌کند. (مشارکت‌شده توسط Vinay Sajip.)

lzma

متد LZMADecompressor.decompress() اکنون یک آرگومان اختیاری max_length را می‌پذیرد تا حداکثر اندازه‌ی داده‌های واگشایی‌شده را محدود کند. (مشارکت‌شده توسط Martin Panter در bpo-15955.)

math

دو ثابت جدید به ماژول math افزوده شده است: inf و nan. (مشارکت Mark Dickinson در bpo-23185.)

تابع جدید isclose() راهی برای آزمون برابری تقریبی فراهم می‌کند. (مشارکت‌شده توسط Chris Barker و Tal Einat در bpo-24270.)

تابع جدید gcd() افزوده شده است. تابع fractions.gcd() اکنون منسوخ شده است. (مشارکت‌شده توسط Mark Dickinson و Serhiy Storchaka در bpo-22486.)

چندفرایندی (multiprocessing)

اشیاء sharedctypes.synchronized() اکنون از پروتکل مدیر زمینه پشتیبانی می‌کنند. (با مشارکت Charles-François Natali در bpo-21565.)

operator

اشیاء attrgetter()، itemgetter() و methodcaller() اکنون از پیکل‌کردن پشتیبانی می‌کنند. (مشارکت‌شده توسط Josh Rosenberg و Serhiy Storchaka در bpo-22955.)

توابع جدید matmul() و imatmul() برای انجام ضرب ماتریسی. (مشارکت Benjamin Peterson در bpo-21176.)

os

تابع جدید scandir() که پیمایش‌گری از اشیاء DirEntry را برمی‌گرداند، اضافه شده است. در صورت امکان، scandir() هنگام پویش یک پوشه، ویژگی‌های پرونده را استخراج می‌کند و نیاز به انجام فراخوانی‌های سیستمی بعدی برای تعیین نوع یا ویژگی‌های پرونده را از بین می‌برد، که این امر ممکن است کارایی را به‌طور چشمگیری بهبود بخشد. (با مشارکت Ben Hoyt و با کمک Victor Stinner در bpo-22524.)

در ویندوز، اکنون ویژگی جدید stat_result.st_file_attributes در دسترس است. این ویژگی با عضو dwFileAttributes از ساختار BY_HANDLE_FILE_INFORMATION که توسط GetFileInformationByHandle() بازگردانده می‌شود مطابقت دارد. (مشارکت‌شده توسط Ben Hoyt در bpo-21719.)

تابع urandom() اکنون در Linux 3.17 یا جدیدتر از فراخوانی سیستمی getrandom() و در OpenBSD 5.6 و جدیدتر از getentropy() استفاده می‌کند؛ بدین‌ترتیب نیاز به استفاده از /dev/urandom برطرف می‌شود و از بروز خطا به دلیل احتمال تمام‌شدن توصیف‌گرهای پرونده جلوگیری می‌شود. (مشارکت‌شده توسط Victor Stinner در bpo-22181.)

توابع جدید get_blocking() و set_blocking() امکان دریافت و تنظیم حالت مسدودکننده‌ی توصیف‌گر پرونده (O_NONBLOCK) را فراهم می‌کنند. (مشارکت‌شده توسط Victor Stinner در bpo-22054.)

توابع truncate() و ftruncate() اکنون در ویندوز پشتیبانی می‌شوند. (مشارکت‌شده توسط استیو داور در bpo-23668.)

تابع جدید os.path.commonpath() وجود دارد که بلندترین زیرمسیر مشترک هر یک از مسیرنام‌های ارسال‌شده را برمی‌گرداند. برخلاف تابع os.path.commonprefix()، این تابع همیشه یک مسیر معتبر برمی‌گرداند:

>>> os.path.commonprefix(['/usr/lib', '/usr/local/lib'])
'/usr/l'

>>> os.path.commonpath(['/usr/lib', '/usr/local/lib'])
'/usr'

(مشارکت‌شده توسط Rafik Draoui و Serhiy Storchaka در bpo-10395.)

pathlib

از متد جدید Path.samefile() می‌توان برای بررسی اینکه آیا مسیر به همان پرونده‌ای اشاره می‌کند که مسیر دیگری به آن اشاره دارد، استفاده کرد؛ آن مسیر می‌تواند شیء دیگری از نوع Path یا یک رشته باشد:

>>> import pathlib
>>> p1 = pathlib.Path('/etc/hosts')
>>> p2 = pathlib.Path('/etc/../etc/hosts')
>>> p1.samefile(p2)
True

(مشارکت‌شده توسط Vajrasky Kok و Antoine Pitrou در bpo-19775.)

متد Path.mkdir() اکنون یک آرگومان اختیاری جدید exist_ok را می‌پذیرد تا با عملکرد mkdir -p و os.makedirs() مطابقت داشته باشد. (با مشارکت Berker Peksag در bpo-21539.)

متد جدیدی Path.expanduser() برای بسط پیشوندهای ~ و ~user وجود دارد. (مشارکت Serhiy Storchaka و Claudiu Popa در bpo-19776.)

از متد کلاس جدید Path.home() می‌توان برای به دست آوردن نمونه‌ای از Path که نمایانگر پوشه‌ی خانگی کاربر است، استفاده کرد. (مشارکت‌شده توسط Victor Salgado و Mayank Tripathi در bpo-19777.)

متدهای جدید Path.write_text()، Path.read_text()، Path.write_bytes() و Path.read_bytes() برای ساده‌سازی عملیات خواندن/نوشتن روی پرونده‌ها.

قطعه‌کد زیر پرونده‌ی موجود ~/spam42 را ایجاد یا بازنویسی می‌کند:

>>> import pathlib
>>> p = pathlib.Path('~/spam42')
>>> p.expanduser().write_text('ham')
3

(مشارکت‌شده توسط Christopher Welborn در bpo-20218.)

pickle

اشیاء تودرتو، مانند متد‌های غیرمقید یا کلاس‌های تودرتو، اکنون می‌توانند با استفاده از پروتکل‌های پیکل قدیمی‌تر از نسخه ۴ پروتکل پیکل شوند. نسخه ۴ پروتکل از قبل این موارد را پشتیبانی می‌کند. (ارائه‌شده توسط Serhiy Storchaka در bpo-23611.)

poplib

فرمان جدید POP3.utf8() پشتیبانی از RFC 6856 (رایانامه بین‌المللی‌سازی‌شده) را فعال می‌کند، اگر سرور POP از آن پشتیبانی کند. (با مشارکت Milan OberKirch در bpo-21804.)

re

ارجاع‌ها و ارجاع‌های شرطی به گروه‌های با طول ثابت اکنون در شرط‌های پس‌نگر مجاز هستند:

>>> import re
>>> pat = re.compile(r'(a|b).(?<=\1)c')
>>> pat.match('aac')
<_sre.SRE_Match object; span=(0, 3), match='aac'>
>>> pat.match('bbc')
<_sre.SRE_Match object; span=(0, 3), match='bbc'>

(مشارکت‌شده توسط Serhiy Storchaka در bpo-9179.)

تعداد گروه‌های ثبت‌کننده در عبارت‌های باقاعده دیگر محدود به ۱۰۰ نیست. (مشارکت‌شده توسط Serhiy Storchaka در bpo-22437.)

توابع sub() و subn() اکنون به جای برخاست دادن استثنا، گروه‌های تطبیق‌نیافته را با رشته‌های خالی جایگزین می‌کنند. (مشارکت‌شده توسط Serhiy Storchaka در bpo-1519638.)

استثناهای re.error دارای ویژگی‌های جدید msg، pattern، pos، lineno و colno هستند که اطلاعات زمینه‌ای بهتری درباره‌ی خطا فراهم می‌کنند:

>>> re.compile("""
...     (?x)
...     .++
... """)
Traceback (most recent call last):
   ...
sre_constants.error: multiple repeat at position 16 (line 3, column 7)

(مشارکت‌شده توسط Serhiy Storchaka در bpo-22578.)

readline

می‌توان از تابع جدید append_history_file() برای الحاق تعداد مشخص‌شده‌ای از عناصر انتهایی تاریخچه به پرونده‌ی داده‌شده استفاده کرد. (مشارکت‌شده توسط Bruno Cauet در bpo-22940.)

selectors

کلاس جدید DevpollSelector از پایش کارآمد /dev/poll در Solaris پشتیبانی می‌کند. (مشارکت‌شده توسط Giampaolo Rodola' در bpo-18931.)

shutil

تابع move() اکنون آرگومان copy_function را می‌پذیرد که برای مثال در صورت نیاز به نادیده‌گرفتن فراداده‌های پرونده هنگام انتقال، امکان می‌دهد به‌جای copy2() پیش‌فرض از تابع copy() استفاده شود. (مشارکت‌شده توسط Claudiu Popa در bpo-19840.)

تابع make_archive() اکنون از قالب xztar پشتیبانی می‌کند. (مشارکت‌شده توسط Serhiy Storchaka در bpo-5411.)

سیگنال

در ویندوز، تابع set_wakeup_fd() اکنون از دسته‌های سوکت نیز پشتیبانی می‌کند. (مشارکت‌شده توسط ویکتور استینر در bpo-22018.)

ثابت‌های گوناگون SIG* در ماژول signal به Enum‌ها تبدیل شده‌اند. این امر اجازه می‌دهد که در حین اشکال‌زدایی، نام‌های معنادار به‌جای «اعداد جادویی» از نوع عدد صحیح چاپ شوند. (با مشارکت Giampaolo Rodola' در bpo-21076.)

smtpd

هر دو کلاس SMTPServer و SMTPChannel اکنون یک آرگومان کلیدواژه‌ای decode_data را می‌پذیرند تا تعیین کنند که آیا بخش DATA از تراکنش SMTP با استفاده از کدک "utf-8" کدگشایی می‌شود یا به‌جای آن به‌صورت رشته بایتی به متد SMTPServer.process_message() ارائه می‌شود. مقدار پیش‌فرض به دلایل سازگاری با نسخه‌های قبلی True است، اما در پایتون 3.6 به False تغییر خواهد کرد. اگر decode_data روی False تنظیم شود، متد process_message باید برای پذیرش آرگومان‌های کلیدواژه‌ای آماده باشد. (مشارکت Maciej Szulik در bpo-19662.)

کلاس SMTPServer اکنون در صورتی که decode_data روی True تنظیم‌شده باشد، افزونه‌ی 8BITMIME (RFC 6152) را اعلام می‌کند. اگر کلاینت در دستور MAIL مقدار BODY=8BITMIME را مشخص کند، این مقدار از طریق کلیدواژه‌ی mail_options به SMTPServer.process_message() منتقل می‌شود. (با مشارکت Milan Oberkirch و R. David Murray در bpo-21795.)

کلاس SMTPServer اکنون از توسعه‌ی SMTPUTF8 نیز پشتیبانی می‌کند (RFC 6531: ایمیل بین‌المللی‌شده). اگر کلاینت SMTPUTF8 BODY=8BITMIME را در دستور MAIL مشخص کرده باشد، آن‌ها از طریق کلیدواژه‌ی mail_options به SMTPServer.process_message() پاس داده می‌شوند. مسئولیت مدیریت صحیح داده‌های SMTPUTF8 بر عهده‌ی متد process_message است. (با مشارکت Milan Oberkirch در bpo-21725.)

اکنون می‌توان آدرس‌های IPv6 را مستقیماً یا از طریق حل نام در سازنده‌ی SMTPServer ارائه کرد و اتصال آن با موفقیت برقرار شود. (مشارکت‌شده توسط Milan Oberkirch در bpo-14758.)

smtplib

متد جدید SMTP.auth() راهی مناسب برای پیاده‌سازی سازوکارهای احراز هویت سفارشی فراهم می‌کند. (مشارکت Milan Oberkirch در bpo-15014.)

متد SMTP.set_debuglevel() اکنون یک مقدار debuglevel اضافی (۲) را می‌پذیرد که مهر‌های زمانی را در پیام‌های اشکال‌زدایی فعال می‌کند. (مشارکت Gavin Chappell و Maciej Szulik در bpo-16914.)

هر دو متد SMTP.sendmail() و SMTP.send_message() اکنون از RFC 6531 (SMTPUTF8) پشتیبانی می‌کنند. (ارائه‌شده توسط Milan Oberkirch و R. David Murray در bpo-22027.)

sndhdr

توابع what() و whathdr() اکنون یک namedtuple() برمی‌گردانند. (مشارکت‌شده توسط Claudiu Popa در bpo-18615.)

socket

توابع دارای مهلت زمانی اکنون به‌جای ساعت سیستم از ساعت یکنواخت استفاده می‌کنند. (ارائه‌شده توسط ویکتور استینر در bpo-22043.)

متد جدید socket.sendfile() امکان ارسال یک پرونده از طریق سوکت را با استفاده از تابع با کارایی بالا os.sendfile() در یونیکس فراهم می‌کند و در نتیجه، بارگذاری‌ها ۲ تا ۳ برابر سریع‌تر از حالتی خواهند بود که از socket.send() ساده استفاده شود. (مشارکت‌شده توسط Giampaolo Rodola' در bpo-17552.)

متد socket.sendall() دیگر با هر بار دریافت یا ارسال بایت‌ها، مهلت زمانی سوکت را بازنشانی نمی‌کند. مهلت زمانی سوکت اکنون حداکثر مدت زمان کل برای ارسال تمام داده‌ها است. (مشارکت Victor Stinner در bpo-23853.)

آرگومان صف انتظار (backlog) از متد socket.listen() اکنون اختیاری است. به‌طور پیش‌فرض روی SOMAXCONN یا 128 تنظیم می‌شود، هر کدام که کمتر باشد. (مشارکت‌شده توسط Charles-François Natali در bpo-21455.)

ssl

پشتیبانی از BIO حافظه

(مشارکت Geert Jansen در bpo-21965.)

کلاس جدید SSLObject برای فراهم کردن پشتیبانی از پروتکل SSL در مواردی که قابلیت‌های ورودی/خروجی شبکه‌ی SSLSocket لازم نیستند یا بهینه نیستند، افزوده شده است. SSLObject نمایانگر یک نمونه از پروتکل SSL است، اما هیچ‌یک از متدهای ورودی/خروجی شبکه را پیاده‌سازی نمی‌کند و در عوض یک رابط بافر حافظه فراهم می‌کند. از کلاس جدید MemoryBIO می‌توان برای انتقال داده‌ها بین پایتون و یک نمونه از پروتکل SSL استفاده کرد.

پشتیبانی SSL مبتنی بر BIO حافظه در درجه اول برای استفاده در چارچوب‌هایی در نظر گرفته شده است که ورودی/خروجی ناهمگام را پیاده‌سازی می‌کنند و مدل آمادگی SSLSocket ("select/poll") برای آن‌ها ناکارآمد است.

می‌توان از متد جدید SSLContext.wrap_bio() برای ایجاد یک نمونه‌ی جدید SSLObject استفاده کرد.

پشتیبانی از مذاکره پروتکل لایه کاربرد (Application-Layer Protocol Negotiation)

(مشارکت‌شده توسط بنجامین پیترسون در bpo-20188.)

در جایی که پشتیبانی OpenSSL وجود دارد، ماژول ssl اکنون افزونه‌ی TLS مذاکره پروتکل لایه کاربردی (Application-Layer Protocol Negotiation) را، همان‌طور که در RFC 7301 شرح داده شده است، پیاده‌سازی می‌کند.

می‌توان از SSLContext.set_alpn_protocols() جدید برای تعیین اینکه یک سوکت باید در طول دست‌دهی TLS چه پروتکل‌هایی را اعلام کند، استفاده کرد.

متد جدید SSLSocket.selected_alpn_protocol() پروتکلی را که در طول دست‌دهی TLS انتخاب شده است برمی‌گرداند. پرچم HAS_ALPN نشان می‌دهد که آیا پشتیبانی از ALPN وجود دارد یا خیر.

سایر تغییرات

یک متد جدید SSLSocket.version() برای پرس‌وجو از نسخه‌ی واقعی پروتکل در حال استفاده وجود دارد. (ارائه‌شده توسط Antoine Pitrou در bpo-20421.)

کلاس SSLSocket اکنون یک متد SSLSocket.sendfile() را پیاده‌سازی می‌کند. (مشارکت‌شده توسط Giampaolo Rodola' در bpo-17552.)

متد SSLSocket.send() اکنون روی سوکت غیرمسدودکننده، در صورتی که عملیات مسدود شود، یکی از استثناهای ssl.SSLWantReadError یا ssl.SSLWantWriteError را ایجاد می‌کند. پیش‌تر، مقدار 0 را برمی‌گرداند. (مشارکت‌شده توسط نیکولاوس راث در bpo-20951.)

تابع cert_time_to_seconds() اکنون مطابق RFC 5280 زمان ورودی را به‌عنوان UTC و نه زمان محلی تفسیر می‌کند. علاوه بر این، مقدار بازگشتی همیشه یک int است. (مشارکت‌شده توسط Akira Li در bpo-19940.)

متد‌های جدید SSLObject.shared_ciphers() و SSLSocket.shared_ciphers() فهرست رمز‌هایی را که کلاینت در طول دست‌دهی ارسال کرده است، برمی‌گردانند. (مشارکت‌شده توسط Benjamin Peterson در bpo-23186.)

متدهای SSLSocket.do_handshake()، SSLSocket.read()، SSLSocket.shutdown() و SSLSocket.write() از کلاس SSLSocket دیگر مهلت زمانی سوکت را در هر بار دریافت یا ارسال بایت‌ها بازنشانی نمی‌کنند. مهلت زمانی سوکت اکنون حداکثر مدت زمان کل متد است. (مشارکت‌شده توسط Victor Stinner در bpo-23853.)

تابع match_hostname() اکنون از تطبیق نشانی‌های IP پشتیبانی می‌کند. (مشارکت‌شده توسط آنتوان پی‌ترو در bpo-23239.)

sqlite3

کلاس Row اکنون به‌طور کامل از پروتکل دنباله پشتیبانی می‌کند، به‌ویژه پیمایش با reversed() و اندیس‌گذاری اسلایسی. (مشارکت‌شده توسط Claudiu Popa در bpo-10203؛ و توسط Lucas Sinclair، Jessica McKellar و Serhiy Storchaka در bpo-13583.)

subprocess

تابع جدید run() اضافه شده است. این تابع فرمان مشخص‌شده را اجرا می‌کند و شیء CompletedProcess را برمی‌گرداند که فرایندی تمام‌شده را توصیف می‌کند. API جدید یکدست‌تر است و رویکرد توصیه‌شده برای فراخوانی زیرفرایندها در کد پایتونی است که نیازی به حفظ سازگاری با نسخه‌های قدیمی‌تر پایتون ندارد. (مشارکت‌شده توسط Thomas Kluyver در bpo-23342.)

مثال‌ها:

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], stdout=subprocess.PIPE)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n')

sys

تابع جدید set_coroutine_wrapper() امکان تنظیم یک قلاب سراسری را فراهم می‌کند که هر زمان یک شیء هم‌روال توسط تابع async def ایجاد شود، فراخوانی خواهد شد. می‌توان از get_coroutine_wrapper() متناظر برای به‌دست‌آوردن پوششی که در حال حاضر تنظیم شده است استفاده کرد. هر دو تابع آزمایشی هستند و صرفاً برای مقاصد اشکال‌زدایی در نظر گرفته شده‌اند. (مشارکت Yury Selivanov در bpo-24017.)

می‌توان از تابع جدید is_finalizing() برای بررسی اینکه آیا مفسر پایتون در حال خاموش شدن است یا خیر، استفاده کرد. (مشارکت‌شده توسط آنتوان پی‌ترو در bpo-22696.)

sysconfig

نام پوشه‌ی اسکریپت‌های کاربر در ویندوز اکنون دو جزء نخست نسخه‌ی پایتون را در بر می‌گیرد. (مشارکت‌شده توسط Paul Moore در bpo-23437.)

tarfile

آرگومان حالت تابع open() اکنون "x" را برای درخواست ایجاد انحصاری می‌پذیرد. (مشارکت Berker Peksag در bpo-21717.)

متدهای TarFile.extractall() و TarFile.extract() اکنون یک آرگومان کلیدواژه‌ای numeric_owner می‌پذیرند. اگر روی True تنظیم شود، پرونده‌ها و پوشه‌های استخراج‌شده متعلق به uid و gid عددی موجود در پرونده tar خواهند بود. اگر روی False تنظیم شود (مقدار پیش‌فرض، و رفتار نسخه‌های پیش از 3.5)، آن‌ها متعلق به کاربر و گروه نام‌برده‌شده در پرونده tar خواهند بود. (مشارکت‌شده توسط مایکل فوگت و اریک اسمیت در bpo-23193.)

متد TarFile.list() اکنون یک آرگومان کلیدواژه‌ای اختیاری members را می‌پذیرد که می‌توان آن را روی زیرمجموعه‌ای از فهرست بازگردانده‌شده توسط TarFile.getmembers() تنظیم کرد. (مشارکت‌شده توسط Serhiy Storchaka در bpo-21549.)

threading

هر دو متد Lock.acquire() و RLock.acquire() اکنون از ساعت یکنواخت برای مدیریت مهلت زمانی استفاده می‌کنند. (مشارکت‌شده توسط Victor Stinner در bpo-22043.)

time

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

timeit

می‌توان از گزینه‌ی جدید خط فرمان -u یا --unit=U برای تعیین واحد زمان در خروجی تایمر استفاده کرد. گزینه‌های پشتیبانی‌شده usec، msec، یا sec هستند. (مشارکت Julian Gindi در bpo-18983.)

تابع timeit() پارامتر جدیدی به نام globals برای تعیین فضای نامی که کد در آن اجرا خواهد شد، دارد. (مشارکت‌شده توسط Ben Roberts در bpo-2527.)

tkinter

ماژول tkinter._fix که برای راه‌اندازی محیط Tcl/Tk در ویندوز استفاده می‌شد، با تابعی خصوصی در ماژول _tkinter جایگزین شده است که هیچ تغییر دائمی در متغیرهای محیطی ایجاد نمی‌کند. (ارائه‌شده توسط Zachary Ware در bpo-20035.)

traceback

توابع جدید walk_stack() و walk_tb() برای پیمایش آسان اشیاء فریم و اشیاء ردگیری. (مشارکت‌شده توسط رابرت کالینز در bpo-17911.)

کلاس‌های سبک‌وزن جدید: TracebackException، StackSummary و FrameSummary. (ارائه‌شده توسط Robert Collins در bpo-17911.)

هر دو تابع print_tb() و print_stack() اکنون از مقادیر منفی برای آرگومان limit پشتیبانی می‌کنند. (مشارکت‌شده توسط Dmitry Kazakov در bpo-22619.)

types

تابع جدید coroutine() برای تبدیل شیءهای تولیدگر و شبه‌تولیدگر به انتظارپذیرها. (مشارکت‌شده توسط یوری سلیوانوف در bpo-24017.)

نوع جدیدی به نام CoroutineType که برای اشیاء هم‌روال ایجادشده توسط توابع async def استفاده می‌شود. (مشارکت‌شده توسط Yury Selivanov در bpo-24400.)

unicodedata

ماژول unicodedata اکنون از داده‌های Unicode 8.0.0 استفاده می‌کند.

unittest

متد TestLoader.loadTestsFromModule() اکنون یک آرگومان صرفاً کلیدواژه‌ای pattern را می‌پذیرد که به‌عنوان آرگومان سوم به load_tests ارسال می‌شود. بسته‌های یافت‌شده اکنون از نظر وجود load_tests بررسی می‌شوند، صرف‌نظر از اینکه مسیرشان با pattern مطابقت دارد یا خیر، زیرا امکان ندارد نام یک بسته با الگوی پیش‌فرض مطابقت داشته باشد. (مشارکت‌شده توسط Robert Collins و Barry A. Warsaw در bpo-16662.)

اکنون خطاهای کشف unittest در ویژگی TestLoader.errors از نمونه‌ی TestLoader آشکار می‌شوند. (مشارکت‌شده توسط Robert Collins در bpo-19746.)

گزینه‌ی جدید خط فرمان --locals برای نمایش متغیرهای محلی در ردگیری‌ها. (مشارکت رابرت کالینز در bpo-22936.)

unittest.mock

کلاس Mock بهبودهای زیر را دارد:

  • سازنده کلاس پارامتر جدید unsafe دارد که باعث می‌شود اشیاء ماک برای نام‌های ویژگی‌ای که با "assert" آغاز می‌شوند، استثنای AttributeError را ایجاد کنند. (با مشارکت Kushal Das در bpo-21238.)

  • یک متد جدید Mock.assert_not_called() برای بررسی اینکه آیا شیء ماک فراخوانی شده است یا خیر. (مشارکت Kushal Das در bpo-21262.)

کلاس MagicMock اکنون از عملگرهای __truediv__()، __divmod__() و __matmul__() پشتیبانی می‌کند. (مشارکت‌شده توسط Johannes Baiter در bpo-20968، و Håkan Lövdahl در bpo-23581 و bpo-23568.)

دیگر لازم نیست هنگام وصل کردن نام‌های توکار، create=True را به‌صورت صریح به تابع patch() ارسال کنید. (مشارکت‌شده توسط کوشال داس در bpo-17660.)

urllib

کلاس جدید request.HTTPPasswordMgrWithPriorAuth اجازه می‌دهد اطلاعات احراز هویت پایه‌ی HTTP به‌گونه‌ای مدیریت شوند که رسیدگی غیرضروری به پاسخ 401 حذف شود، یا اینکه اطلاعات احراز هویت به‌طور بی‌قید و شرط در نخستین درخواست ارسال شوند تا امکان برقراری ارتباط با سرورهایی که در صورت عدم ارسال سرآیند Authorization به‌جای پاسخ 401 پاسخ 404 برمی‌گردانند فراهم شود. (مشارکت‌شده توسط Matej Cepl در bpo-19494 و Akshit Khurana در bpo-7159.)

آرگومان جدید quote_via برای تابع parse.urlencode() در صورت نیاز، راهی برای کنترل کدگذاری بخش‌های پرس‌وجو فراهم می‌کند. (مشارکت‌شده توسط Samwyse و Arnon Yaari در bpo-13866.)

تابع request.urlopen() یک شیء ssl.SSLContext را به‌عنوان آرگومان زمینه می‌پذیرد که برای اتصال HTTPS استفاده خواهد شد. (ارائه‌شده توسط الکس گینور در bpo-22366.)

تابع parse.urljoin() به‌روزرسانی شد تا برای حل URL‌های نسبی، به‌جای RFC 1808 و RFC 2396 از معناشناسی RFC 3986 استفاده کند. (مشارکت‌شده توسط Demian Brecht و Senthil Kumaran در bpo-22118.)

wsgiref

آرگومان headers در سازنده‌ی کلاس headers.Headers اکنون اختیاری است. (مشارکت‌شده توسط Pablo Torres Navarrete و SilentGhost در bpo-5800.)

xmlrpc

کلاس client.ServerProxy اکنون از پروتکل مدیر زمینه پشتیبانی می‌کند. (مشارکت‌شده توسط Claudiu Popa در bpo-20627.)

سازنده‌ی client.ServerProxy اکنون یک نمونه‌ی اختیاری از ssl.SSLContext را می‌پذیرد. (مشارکت‌شده توسط الکس گینور در bpo-22960.)

xml.sax

پارسرهای SAX اکنون از جریان نویسه‌ی شیء xmlreader.InputSource پشتیبانی می‌کنند. (مشارکت‌شده توسط Serhiy Storchaka در bpo-2175.)

parseString() اکنون یک نمونه‌ی str را می‌پذیرد. (با مشارکت Serhiy Storchaka در bpo-10590.)

zipfile

خروجی ZIP اکنون می‌تواند در جریان‌های غیرقابل مکان‌یابی نوشته شود. (مشارکت‌شده توسط Serhiy Storchaka در bpo-23252.)

آرگومان حالت از متد ZipFile.open() اکنون "x" را برای درخواست ایجاد انحصاری می‌پذیرد. (مشارکت Serhiy Storchaka در bpo-21717.)

سایر تغییرات در سطح ماژول

بسیاری از توابع در ماژول‌های mmap، ossaudiodev، socket، ssl و codecs اکنون اشیاء شبه‌بایت قابل نوشتن را می‌پذیرند. (مشارکت‌شده توسط Serhiy Storchaka در bpo-23001.)

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

سرعت تابع os.walk() در سیستم‌های POSIX ۳ تا ۵ برابر و در ویندوز ۷ تا ۲۰ برابر افزایش یافته است. این کار با استفاده از تابع جدید os.scandir() انجام شده است که اطلاعات پرونده را از فراخوانی‌های سیستمی زیرین readdir یا FindFirstFile/FindNextFile در دسترس قرار می‌دهد. (مشارکت‌شده توسط بن هویت با کمک ویکتور استینر در bpo-23605.)

ساخت bytes(int) (پرشده با بایت‌های صفر) برای اشیاء بزرگ سریع‌تر است و از حافظه کمتری استفاده می‌کند. به‌جای malloc() از calloc() برای تخصیص حافظه به این اشیاء استفاده می‌شود. (مشارکت ویکتور استینر در bpo-21233.)

برخی عملیات‌های ipaddress روی IPv4Network و IPv6Network به‌طور چشمگیری سریع‌تر شده‌اند، مانند subnets()، supernet()، summarize_address_range() و collapse_addresses(). این افزایش سرعت می‌تواند از ۳ تا ۱۵ برابر باشد. (مشارکت‌شده توسط آنتوان پی‌ترو، میشل آلبرت و مارکوس در bpo-21486، bpo-21487، bpo-20826 و bpo-23266.)

پیکل‌سازی اشیاء ipaddress بهینه شد تا خروجی به‌طور قابل توجهی کوچک‌تری تولید کند. (مشارکت‌شده توسط Serhiy Storchaka در bpo-23133.)

بسیاری از عملیات‌های io.BytesIO اکنون ۵۰ تا ۱۰۰ درصد سریع‌تر شده‌اند. (مشارکت‌شده توسط Serhiy Storchaka در bpo-15381 و David Wilson در bpo-22003.)

تابع marshal.dumps() اکنون سریع‌تر است: ۶۵--۸۵٪ با نسخه‌های 3 و 4، ۲۰--۲۵٪ با نسخه‌های 0 تا 2 روی داده‌های معمول، و تا ۵ برابر در بهترین حالت‌ها. (ارائه‌شده توسط Serhiy Storchaka در bpo-20416 و bpo-23344.)

کدگذار UTF-32 اکنون ۳ تا ۷ برابر سریع‌تر شده است. (مشارکت‌شده توسط Serhiy Storchaka در bpo-15027.)

عبارت‌های باقاعده اکنون تا ۱۰٪ سریع‌تر تجزیه می‌شوند. (مشارکت‌شده توسط Serhiy Storchaka در bpo-19380.)

تابع json.dumps() بهینه‌سازی شد تا با ensure_ascii=False به همان سرعتی اجرا شود که با ensure_ascii=True. (مشارکت‌شده توسط نائوکی اینادا در bpo-23206.)

توابع PyObject_IsInstance() و PyObject_IsSubclass() در حالت رایجی که آرگومان دوم، type را به‌عنوان فراکلاس خود داشته باشد، سریع‌تر شده‌اند. (مشارکت Georg Brandl در bpo-22540.)

نهان‌گذاری متدها اندکی بهبود یافت که در برخی بنچمارک‌ها تا ۵ درصد بهبود عملکرد به همراه داشت. (مشارکت bpo-22847 توسط آنتوان پی‌ترو.)

اشیاء ماژول random اکنون در نسخه‌های ۶۴ بیتی ۵۰٪ حافظه کمتری مصرف می‌کنند. (مشارکت Serhiy Storchaka در bpo-23488.)

فراخوانی‌های getter @property تا ۲۵ درصد سریع‌تر شده‌اند. (مشارکت‌شده توسط Joe Jevnik در bpo-23910.)

نمونه‌سازی fractions.Fraction اکنون تا ۳۰ درصد سریع‌تر شده است. (مشارکت‌شده توسط Stefan Behnel در bpo-22464.)

متدهای رشته find()، rfind()، split()، partition() و عملگر رشته‌ای in اکنون برای جستجوی زیررشته‌های تک‌نویسه‌ای به‌طور چشمگیری سریع‌تر شده‌اند. (مشارکت‌شده توسط Serhiy Storchaka در bpo-23573.)

تغییرات ساخت و C API

توابع calloc جدیدی افزوده شدند:

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

توابع کمکی جدید برای کدگذاری/کدگشایی:

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

تابع جدید PyCodec_NameReplaceErrors() برای جایگزینی خطای کدگذاری یونیکد با گریزهای \N{...}. (مشارکت‌شده توسط Serhiy Storchaka در bpo-19676.)

تابع جدید PyErr_FormatV() مشابه PyErr_Format()، اما یک آرگومان va_list می‌پذیرد. (مشارکت‌شده توسط Antoine Pitrou در bpo-18711.)

استثنای جدید PyExc_RecursionError. (مشارکت‌شده توسط Georg Brandl در bpo-19235.)

توابع جدید PyModule_FromDefAndSpec()، PyModule_FromDefAndSpec2() و PyModule_ExecDef() که توسط PEP 489 معرفی شدند -- مقداردهی اولیه چندمرحله‌ای ماژول توسعه‌ای. (مشارکت‌شده توسط Petr Viktorin در bpo-24268.)

توابع جدید PyNumber_MatrixMultiply() و PyNumber_InPlaceMatrixMultiply() برای انجام ضرب ماتریسی. (مشارکت‌شده توسط Benjamin Peterson در bpo-21176. برای جزئیات، PEP 465 را نیز ببینید.)

جایگاه PyTypeObject.tp_finalize اکنون بخشی از ABI پایدار است.

ساخت‌های ویندوز اکنون به Microsoft Visual C++ 14.0 نیاز دارند که به‌عنوان بخشی از Visual Studio 2015 در دسترس است.

ماژول‌های توسعه‌ای اکنون در برخی پلتفرم‌ها یک برچسب اطلاعات پلتفرم را در نام پرونده‌ی خود می‌گنجانند (این برچسب اختیاری است و سی‌پایتون ماژول‌های توسعه‌ای را بدون آن ایمپورت می‌کند، هرچند اگر برچسب موجود باشد و مطابقت نداشته باشد، آن ماژول توسعه‌ای بارگذاری نخواهد شد):

  • در لینوکس، نام پرونده‌های ماژول توسعه‌ای به .cpython-<major><minor>m-<architecture>-<os>.pyd پایان می‌یابند:

    • <major> شماره‌ی اصلی نسخه‌ی پایتون است؛ برای پایتون 3.5 این شماره 3 است.

    • <minor> شماره فرعی نسخه پایتون است؛ برای پایتون 3.5 این مقدار 5 است.

    • <architecture> معماری سخت‌افزاری‌ای است که ماژول توسعه‌ای برای اجرا بر روی آن ساخته شده است. این مقدار معمولاً یا i386 برای پلتفرم‌های ۳۲-بیتی اینتل است یا x86_64 برای پلتفرم‌های ۶۴-بیتی اینتل (و AMD).

    • <os> همیشه linux-gnu است، به‌جز برای ماژول‌های توسعه‌ای که برای تعامل با ABI ۳۲بیتی روی پلتفرم‌های ۶۴بیتی ساخته‌شده‌اند؛ در این حالت برابر linux-gnu32 است (و <architecture> برابر x86_64 خواهد بود).

  • در ویندوز، نام پرونده‌های ماژول توسعه‌ای با <debug>.cp<major><minor>-<platform>.pyd پایان می‌یابند:

    • <major> شماره‌ی اصلی نسخه‌ی پایتون است؛ برای پایتون 3.5 این شماره 3 است.

    • <minor> شماره فرعی نسخه پایتون است؛ برای پایتون 3.5 این مقدار 5 است.

    • <platform> پلتفرمی است که ماژول توسعه‌ای برای آن ساخته‌شده است؛ این مقدار می‌تواند win32 برای Win32، win_amd64 برای Win64، win_ia64 برای Windows Itanium 64 یا win_arm برای Windows on ARM باشد.

    • اگر در حالت اشکال‌زدایی ساخته شود، <debug> برابر با _d خواهد بود؛ در غیر این صورت خالی خواهد بود.

  • در پلتفرم‌های OS X، نام پرونده‌های ماژول‌های توسعه‌ای اکنون به -darwin.so ختم می‌شوند.

  • در تمام پلتفرم‌های دیگر، نام پرونده‌های ماژول‌های توسعه‌ای همان است که در پایتون 3.4 بود.

منسوخ

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

توصیه نمی‌شود از async و await به‌عنوان نام متغیر، کلاس، تابع یا ماژول استفاده کنید. این دو که توسط PEP 492 در پایتون 3.5 معرفی شدند، در پایتون 3.7 به کلیدواژه‌های تمام‌عیار تبدیل خواهند شد.

رفتار منسوخ پایتون

ایجاد استثنای StopIteration درون یک تولیدگر از این پس یک PendingDeprecationWarning بی‌صدا تولید خواهد کرد که در پایتون 3.6 به یک هشدار منسوخ‌شدن غیربی‌صدا تبدیل خواهد شد و در پایتون 3.7 منجر به RuntimeError خواهد شد. برای جزئیات به PEP 479: تغییر نحوه‌ی برخورد با StopIteration درون تولیدگرها مراجعه کنید.

سیستم‌عامل‌های پشتیبانی‌نشده

ویندوز XP دیگر توسط مایکروسافت پشتیبانی نمی‌شود؛ بنابراین، طبق PEP 11، سی‌پایتون 3.5 دیگر به‌طور رسمی روی این سیستم‌عامل پشتیبانی نمی‌شود.

ماژول‌ها، توابع و متدهای منسوخ پایتون

ماژول formatter اکنون به منسوخ‌شدگی کامل رسیده است و همچنان قرار است در پایتون 3.6 حذف شود.

تابع asyncio.async() به نفع ensure_future() منسوخ شده است.

ماژول smtpd در گذشته همیشه بخش DATA از پیام‌های ایمیل را با استفاده از کدک utf-8 کدگشایی می‌کرد. اکنون می‌توان این رفتار را با کلیدواژه جدید decode_data در SMTPServer کنترل کرد. مقدار پیش‌فرض True است، اما این پیش‌فرض منسوخ شده است. برای پرهیز از هشدار منسوخ‌شدن، کلیدواژه decode_data را با مقداری مناسب تعیین کنید.

انتساب مستقیم مقادیر به key، value و coded_value در شیءهای http.cookies.Morsel منسوخ شده است. به‌جای آن از متد set() استفاده کنید. علاوه بر این، پارامتر مستندنشده‌ی LegalChars در set() منسوخ شده است و اکنون نادیده گرفته می‌شود.

ارسال یک رشته قالب‌بندی به‌عنوان آرگومان کلیدواژه‌ای format_string به متد format() از کلاس string.Formatter منسوخ شده است. (مشارکت‌شده توسط Serhiy Storchaka در bpo-23671.)

توابع platform.dist() و platform.linux_distribution() اکنون منسوخ شده‌اند. توزیع‌های لینوکس از روش‌های بسیار متفاوتی برای توصیف خود استفاده می‌کنند، بنابراین این قابلیت به یک بسته واگذار شده است. (مشارکت‌شده توسط Vajrasky Kok و Berker Peksag در bpo-1322.)

متدهای from_function و from_builtin از inspect.Signature که پیش‌تر مستند نشده بودند، منسوخ شده‌اند. به جای آن‌ها از متد جدید Signature.from_callable() استفاده کنید. (ارائه‌شده توسط Yury Selivanov در bpo-24248.)

تابع inspect.getargspec() منسوخ شده است و قرار است در پایتون 3.6 حذف شود. (برای جزئیات به bpo-20438 مراجعه کنید.)

توابع getfullargspec()، getcallargs() و formatargspec() در ماژول inspect به نفع API inspect.signature() منسوخ شده‌اند. (مشارکت‌شده توسط Yury Selivanov در bpo-20438.)

توابع getargvalues() و formatargvalues() به‌طور ناخواسته با انتشار پایتون 3.5.0 به عنوان منسوخ علامت‌گذاری شدند.

استفاده از پرچم re.LOCALE با الگوهای str یا re.ASCII اکنون منسوخ شده است. (با مشارکت Serhiy Storchaka در bpo-22407.)

استفاده از دنباله‌های ویژه‌ی ناشناخته‌ی متشکل از '\' و یک حرف اسکی در الگوهای عبارت باقاعده و الگوهای جایگزینی، اکنون باعث صدور هشدار منسوخ‌شدن می‌شود و در پایتون 3.6 ممنوع خواهد شد. (نوشته‌ی Serhiy Storchaka در bpo-23622.)

آرگومان پیش‌فرض مستند‌نشده و غیررسمی use_load_tests از متد unittest.TestLoader.loadTestsFromModule() اکنون منسوخ شده است و نادیده گرفته می‌شود. (ارائه‌شده توسط Robert Collins و Barry A. Warsaw در bpo-16662.)

حذف‌شده

حذف APIها و قابلیت‌ها

API‌ها و قابلیت‌های منسوخ و پیش‌تر از رده خارج‌شده‌ی زیر حذف شده‌اند:

  • ویژگی __version__ از بسته‌ی email حذف شده است. کد email مدت‌هاست که جداگانه از کتابخانه استاندارد توزیع نشده است و رشته‌ی __version__ در چند نسخه‌ی اخیر به‌روزرسانی نشده بود.

  • کلاس داخلی Netrc در ماژول ftplib در نسخه 3.4 منسوخ شد و اکنون حذف شده است. (مشارکت Matt Chaput در bpo-6623.)

  • مفهوم پرونده‌های .pyo حذف شده است.

  • کلاس JoinableQueue در ماژول آزمایشی asyncio در نسخه 3.4.4 منسوخ شد و اکنون حذف شده است. (با مشارکت A. Jesse Jiryu Davis در bpo-23464.)

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

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

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

  • به دلیل یک سهو، نسخه‌های پیشین پایتون به‌اشتباه سینتکس زیر را می‌پذیرفتند:

    f(1 for x in [1], *args)
    f(1 for x in [1], **kwargs)
    

    پایتون 3.5 اکنون به‌درستی SyntaxError ایجاد می‌کند، زیرا عبارت‌های تولیدگر باید در پرانتز قرار بگیرند، مگر آنکه تنها آرگومان یک تابع باشند.

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

  • PEP 475: اکنون فراخوانی‌های سیستمی هنگامی که توسط یک سیگنال قطع شوند، دوباره تلاش می‌شوند؛ به‌جای اینکه در صورتی که گرداننده‌ی سیگنال پایتون استثنایی پرتاب نکند، InterruptedError را پرتاب کنند.

  • پیش از پایتون 3.5، شیء datetime.time در صورتی که نشان‌دهنده‌ی نیمه‌شب به وقت UTC بود، نادرست در نظر گرفته می‌شد. این رفتار مبهم و مستعد خطا تلقی می‌شد و در پایتون 3.5 حذف شده است. برای جزئیات کامل به bpo-13936 مراجعه کنید.

  • متد ssl.SSLSocket.send() اکنون روی یک سوکت غیرمسدودکننده، در صورتی که عملیات مسدود شود، استثنای ssl.SSLWantReadError یا ssl.SSLWantWriteError را ایجاد می‌کند. پیش‌تر، این متد مقدار 0 را برمی‌گرداند. (مشارکت توسط Nikolaus Rath در bpo-20951.)

  • ویژگی __name__ تولیدگرها اکنون از نام تابع تنظیم می‌شود، به جای آنکه از نام کد تنظیم شود. برای بازیابی نام کد از gen.gi_code.co_name استفاده کنید. تولیدگرها همچنین ویژگی جدید __qualname__، یعنی نام کامل، دارند که اکنون برای نمایش یک تولیدگر (repr(gen)) استفاده می‌شود. (ارائه‌شده توسط Victor Stinner در bpo-21205.)

  • حالت و آرگومان منسوخ «strict» در HTMLParser، HTMLParser.error() و استثنای HTMLParserError حذف شده‌اند. (مشارکت‌شده توسط عزیو ملتی در bpo-15114.) آرگومان convert_charrefs در HTMLParser اکنون به‌طور پیش‌فرض True است. (مشارکت‌شده توسط برکر پکساگ در bpo-21047.)

  • هرچند این موضوع به‌طور رسمی بخشی از API نیست، برای اهداف انتقال (یعنی: اصلاح آزمون‌ها) شایان ذکر است که پیام‌های خطایی که پیش‌تر به شکل «'sometype' does not support the buffer protocol» بودند، اکنون به شکل «a bytes-like object is required, not 'sometype'» هستند. (مشارکت‌شده توسط Ezio Melotti در bpo-16518.)

  • اگر پوشه‌ی فعلی به پوشه‌ای تنظیم شده باشد که دیگر وجود ندارد، دیگر استثنای FileNotFoundError مطرح نمی‌شود و در عوض find_spec() مقدار None را برمی‌گرداند، بدون نهانگاه کردن None در sys.path_importer_cache، که این مورد با حالت معمول متفاوت است (bpo-22834).

  • کد‌ها و پیام‌های وضعیت HTTP از http.client و http.server به یک enum مشترک HTTPStatus بازآرایی شدند. مقادیر موجود در http.client و http.server برای سازگاری با نسخه‌های پیشین همچنان در دسترس هستند. (ارائه‌شده توسط Demian Brecht در bpo-21793.)

  • وقتی یک بارگذار ایمپورت exec_module() را تعریف می‌کند، اکنون انتظار می‌رود create_module() را نیز تعریف کند (اکنون یک DeprecationWarning ایجاد می‌کند و در پایتون 3.6 خطا خواهد بود). اگر بارگذار از importlib.abc.Loader ارث‌بری کند، هیچ کاری لازم نیست انجام دهید؛ در غیر این صورت، کافی است create_module() را به‌گونه‌ای تعریف کنید که None را برگرداند. (مشارکت‌شده توسط برت کانون در bpo-23014.)

  • تابع re.split() همیشه تطبیق‌های خالی الگو را نادیده می‌گرفت، بنابراین الگوی "x*" مانند "x+" کار می‌کرد و الگوی "\b" هرگز کار نمی‌کرد. اکنون re.split() در صورتی که الگو بتواند با رشته خالی تطبیق یابد، هشدار می‌دهد. برای سازگاری، از الگوهایی استفاده کنید که هرگز با رشته خالی تطبیق نمی‌یابند (مثلاً "x+" به جای "x*"). الگوهایی که فقط می‌توانند با رشته خالی تطبیق یابند (مانند "\b") اکنون خطا ایجاد می‌کنند. (مشارکت‌شده توسط Serhiy Storchaka در bpo-22818.)

  • رابط شبه‌دیکشنریِ http.cookies.Morsel خودسازگار شده است: مقایسه‌ی مورسل‌ها (morsel) اکنون key و value را در نظر می‌گیرد، copy() اکنون به جای یک dict، نمونه‌ای از Morsel را برمی‌گرداند، و update() اکنون در صورتی که هر یک از کلیدهای دیکشنریِ به‌روزرسانی نامعتبر باشد، استثنایی ایجاد خواهد کرد. علاوه بر این، پارامتر مستندنشده‌ی LegalChars در set() منسوخ شده و اکنون نادیده گرفته می‌شود. (مشارکت‌شده توسط Demian Brecht در bpo-2211.)

  • PEP 488 پرونده‌های .pyo را از پایتون حذف کرده و برچسب اختیاری opt- را در نام پرونده‌های .pyc معرفی کرده است. تابع importlib.util.cache_from_source() پارامتر بهینه‌سازی را برای کمک به کنترل برچسب opt- به دست آورده است. به همین دلیل، پارامتر debug_override این تابع اکنون منسوخ شده است. پرونده‌های .pyo همچنین دیگر به‌عنوان آرگومان پرونده برای مفسر پایتون پشتیبانی نمی‌شوند و بنابراین وقتی به‌تنهایی توزیع می‌شوند (یعنی توزیع کد بدون منبع) هیچ کاربردی ندارند. از آنجا که عدد جادویی بایت‌کد در پایتون 3.5 تغییر کرده است، تمام پرونده‌های .pyo قدیمی مربوط به نسخه‌های قبلی پایتون، صرف‌نظر از این PEP، نامعتبر هستند.

  • ماژول socket اکنون ثابت CAN_RAW_FD_FRAMES را در لینوکس 3.6 و بالاتر اکسپورت می‌کند.

  • تابع ssl.cert_time_to_seconds() اکنون مطابق RFC 5280 زمان ورودی را به‌عنوان UTC و نه به‌عنوان زمان محلی تفسیر می‌کند. علاوه بر این، مقدار بازگشتی همیشه یک int است. (ارائه‌شده توسط آکیرا لی در bpo-19940.)

  • ابزار pygettext.py اکنون از قالب استاندارد +NNNN برای منطقه‌های زمانی در سرآیند POT-Creation-Date استفاده می‌کند.

  • ماژول smtplib اکنون برای خروجی اشکال‌زدایی، به جای متغیر قبلی stderr در سطح ماژول، از sys.stderr استفاده می‌کند. اگر برنامه (آزمون) شما برای گرفتن خروجی اشکال‌زدایی به مانکی‌پچ کردن متغیر سطح ماژول وابسته است، باید آن را به‌روزرسانی کنید تا به جای آن، sys.stderr را بگیرد.

  • متد‌های str.startswith() و str.endswith() دیگر هنگامی که رشته خالی را می‌یابند و اندیس‌ها کاملاً خارج از محدوده هستند، True برنمی‌گردانند. (نوشته‌شده توسط Serhiy Storchaka در bpo-24284.)

  • تابع inspect.getdoc() اکنون رشته‌های مستندِ به ارث رسیده از کلاس‌های پایه را برمی‌گرداند. اگر مستندات به ارث رسیده مناسب باشد، دیگر نیازی به تکرار رشته‌های مستند نیست. برای سرکوب کردن رشته‌ی به ارث رسیده، باید یک رشته‌ی خالی مشخص شود (یا می‌توان مستندات را تکمیل کرد). این تغییر بر خروجی ماژول pydoc و تابع help() تأثیر می‌گذارد. (مشارکت‌شده توسط Serhiy Storchaka در bpo-15582.)

  • فراخوانی‌های تودرتوی functools.partial() اکنون تخت‌سازی می‌شوند. اگر به رفتار قبلی تکیه داشتید، اکنون می‌توانید یا ویژگی‌ای را به شیء functools.partial() اضافه کنید یا زیرکلاسی از functools.partial() ایجاد کنید. (مشارکت‌شده توسط الکساندر بلوپولسکی در bpo-7830.)

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

  • عضو مستند‌نشده‌ی format از ساختار (غیر‌عمومی) PyMemoryViewObject حذف شده است. همه‌ی ماژول‌های توسعه‌ای که به بخش‌های مربوطه در memoryobject.h وابسته‌اند، باید بازسازی شوند.

  • ساختار PyMemAllocator به PyMemAllocatorEx تغییر نام یافت و فیلد جدید calloc افزوده شد.

  • ماکروی مستند‌نشده‌ی PyObject_REPR() که ارجاع‌ها را نشت می‌داد، حذف شد. برای قالب‌بندی repr() شیء، از نویسه‌ی قالب %R در توابعی مانند PyUnicode_FromFormat() استفاده کنید. (مشارکت‌شده توسط Serhiy Storchaka در bpo-22453.)

  • از آنجا که فقدان ویژگی __module__ پیکل‌سازی و درون‌نگری را مختل می‌کند، اکنون برای نوع‌های توکاری که ویژگی __module__ را ندارند، هشدار منسوخ‌شدنی صادر می‌شود. این در آینده به AttributeError تبدیل خواهد شد. (مشارکت‌شده توسط Serhiy Storchaka در bpo-20204.)

  • به عنوان بخشی از پیاده‌سازی PEP 492، جایگاه tp_reserved در PyTypeObject با جایگاه tp_as_async جایگزین شد. برای نوع‌ها، ساختارها و توابع جدید به شیءهای هم‌روال رجوع کنید.

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

هدف ساخت جدید make regen-all

برای ساده‌سازی کامپایل متقاطع، و برای اطمینان از اینکه سی‌پایتون می‌تواند بدون نیاز به نسخه‌ای از پایتون که از قبل در دسترس باشد، به‌طور قابل‌اتکا کامپایل شود، سیستم ساخت مبتنی بر autotools دیگر تلاش نمی‌کند پرونده‌های تولیدشده را بر اساس زمان‌های تغییر پرونده به‌طور ضمنی بازکامپایل کند.

در عوض، دستور جدید make regen-all اضافه شده است تا در صورت نیاز، این پرونده‌ها را به‌اجبار بازتولید کند (مثلاً پس از آنکه نسخه‌ی اولیه‌ای از پایتون بر اساس نسخه‌های از پیش تولیدشده ساخته شده باشد).

اهداف بازتولید گزینشی‌تری نیز تعریف شده‌اند — برای جزئیات به Makefile.pre.in مراجعه کنید.

(با مشارکت Victor Stinner در bpo-23404.)

اضافه شده در نسخه‌ی 3.5.4.

حذف هدف ساخت make touch

هدف ساخت make touch که پیش‌تر برای درخواست بازتولید ضمنی پرونده‌های تولیدشده از طریق به‌روزرسانی زمان‌های تغییر آن‌ها استفاده می‌شد، حذف شده است.

این هدف با هدف جدید make regen-all جایگزین شده است.

(با مشارکت Victor Stinner در bpo-23404.)

تغییر یافته در نسخه‌ی 3.5.4.