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

ویرایشگرها:

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

این مقاله ویژگی‌های جدید پایتون 3.6 را در مقایسه با 3.5 توضیح می‌دهد. پایتون 3.6 در ۲۳ دسامبر ۲۰۱۶ منتشر شد. برای فهرست کامل تغییرات، تغییرنامه (changelog) را ببینید.

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

PEP 494 - زمان‌بندی انتشار پایتون 3.6

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

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

  • PEP 498، مقادیر لفظی رشته‌ای قالب‌بندی‌شده.

  • PEP 515، زیرسطرها در مقادیر لفظی عددی.

  • PEP 526، سینتکس حاشیه‌نویسی متغیر.

  • PEP 525، تولیدگرهای ناهمگام.

  • PEP 530: درک‌های ناهمگام.

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

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

بهبودهای چشمگیر در کتابخانه استاندارد:

  • ماژول asyncio ویژگی‌های جدید، بهبودهای چشمگیر در کاربردپذیری و کارایی، و تعداد قابل‌توجهی رفع اشکال دریافت کرده است. از پایتون 3.6 به بعد، ماژول asyncio دیگر آزمایشی نیست و API آن پایدار در نظر گرفته می‌شود.

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

  • ماژول datetime پشتیبانی از رفع ابهام زمان محلی را به دست آورده است.

  • ماژول typing تعدادی بهبود دریافت کرد.

  • ماژول tracemalloc به‌طور قابل توجهی بازنویسی شده است و اکنون برای ارائه‌ی خروجی بهتر برای ResourceWarning و همچنین ارائه‌ی تشخیص‌های بهتر برای خطاهای تخصیص حافظه استفاده می‌شود. برای اطلاعات بیشتر، بخش PYTHONMALLOC را ببینید.

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

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

  • در لینوکس، os.urandom() اکنون برای افزایش امنیت، تا زمانی که استخر آنتروپی urandom سیستم مقداردهی اولیه شود، مسدود می‌شود. برای اطلاع از دلایل این تغییر، PEP 524 را ببینید.

  • ماژول‌های hashlib و ssl اکنون از OpenSSL 1.1.0 پشتیبانی می‌کنند.

  • تنظیمات پیش‌فرض و مجموعه قابلیت‌های ماژول ssl بهبود یافته‌اند.

  • ماژول hashlib پشتیبانی از الگوریتم‌های هش BLAKE2، SHA-3 و SHAKE و تابع استخراج کلید scrypt() را دریافت کرد.

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

  • PEP 528 و PEP 529، کدگذاری سامانه فایل‌بندی و کنسول ویندوز به UTF-8 تغییر کرد.

  • راه‌انداز py.exe هنگامی که به‌صورت تعاملی استفاده می‌شود، در صورتی که کاربر نسخه‌ای را مشخص نکرده باشد (از طریق آرگومان‌های خط فرمان یا پرونده پیکربندی)، دیگر Python 2 را به Python 3 ترجیح نمی‌دهد. مدیریت سطرهای shebang بدون تغییر باقی می‌ماند — در این حالت، «python» به Python 2 اشاره دارد.

  • python.exe و pythonw.exe به‌عنوان آگاه از مسیرهای بلند (long-path aware) علامت‌گذاری شده‌اند، که به این معناست که محدودیت مسیر ۲۶۰ نویسه ممکن است دیگر اعمال نشود. برای جزئیات به حذف محدودیت MAX_PATH مراجعه کنید.

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

  • پرونده‌ی python36.zip اکنون به‌عنوان نشانه‌ای برای استنباط PYTHONHOME عمل می‌کند. برای اطلاعات بیشتر به مستندات مراجعه کنید.

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

PEP 498: رشته‌های لفظی قالب‌بندی‌شده

PEP 498 نوع جدیدی از مقادیر لفظی رشته‌ای را معرفی می‌کند: اف‌استرینگ‌ها یا مقادیر لفظی رشته‌ای قالب‌بندی‌شده.

لفظ‌های رشته‌ای قالب‌بندی‌شده دارای پیشوند 'f' هستند و مشابه رشته‌های قالب هستند که str.format() می‌پذیرد. این رشته‌ها شامل فیلدهای جایگزینی هستند که با آکولادها احاطه شده‌اند. فیلدهای جایگزینی عبارت‌هایی هستند که در زمان اجرا ارزیابی می‌شوند و سپس با استفاده از پروتکل format() قالب‌بندی می‌شوند:

>>> name = "Fred"
>>> f"He said his name is {name}."
'He said his name is Fred.'
>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal("12.34567")
>>> f"result: {value:{width}.{precision}}"  # nested fields
'result:      12.35'

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

PEP 498 -- درون‌یابی رشته لفظی.

PEP نوشته و پیاده‌سازی‌شده توسط Eric V. Smith.

مستندات قابلیت.

PEP 526: سینتکس حاشیه‌نویسی متغیرها

PEP 484 استاندارد حاشیه‌نویسی نوع برای پارامترهای تابع (که با نام راهنمای نوع نیز شناخته می‌شود) را معرفی کرد. این PEP نحوی برای حاشیه‌نویسی انواع متغیرها، از جمله متغیرهای کلاس و متغیرهای نمونه، به پایتون اضافه می‌کند:

primes: List[int] = []

captain: str  # Note: no initial value!

class Starship:
    stats: Dict[str, int] = {}

درست مانند حاشیه‌نویسی توابع، مفسر پایتون هیچ معنای خاصی به حاشیه‌نویسی متغیرها نسبت نمی‌دهد و تنها آن‌ها را در ویژگی __annotations__ یک کلاس یا ماژول ذخیره می‌کند.

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

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

PEP 526 -- سینتکس حاشیه‌نویسی متغیر.

PEP نوشته‌شده توسط Ryan Gonzalez، Philip House، Ivan Levkivskyi، Lisa Roach و Guido van Rossum. پیاده‌سازی‌شده توسط Ivan Levkivskyi.

ابزارهایی که از سینتکس جدید استفاده می‌کنند یا خواهند کرد: mypy، pytype، PyCharm و غیره.

PEP 515: زیرسطرها در مقادیر لفظی عددی

PEP 515 امکان استفاده از زیرخط در مقادیر لفظی عددی را برای بهبود خوانایی اضافه می‌کند. برای مثال:

>>> 1_000_000_000_000_000
1000000000000000
>>> 0x_FF_FF_FF_FF
4294967295

زیرسطرهای تکی بین ارقام و پس از هر مشخص‌کننده مبنای عدد مجاز هستند. زیرخط در ابتدای عدد، در انتهای آن، یا چند زیرخط پشت سر هم مجاز نیست.

زبان قالب‌بندی رشته اکنون نیز از گزینه‌ی '_' برای نشان‌دادن استفاده از زیرخط به‌عنوان جداکننده‌ی هزارگان برای انواع نمایش ممیز شناور و برای نوع نمایش عدد صحیح 'd' پشتیبانی می‌کند. برای انواع نمایش عدد صحیح 'b'، 'o'، 'x' و 'X'، هر ۴ رقم یک زیرخط درج می‌شود:

>>> '{:_}'.format(1000000)
'1_000_000'
>>> '{:_x}'.format(0xFFFFFFFF)
'ffff_ffff'

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

PEP 515 -- زیرسطرها در مقادیر لفظی عددی

PEP نوشته‌شده توسط Georg Brandl و Serhiy Storchaka.

PEP 525: تولیدگرهای ناهمگام

PEP 492 پشتیبانی از هم‌روال‌های بومی و سینتکس async / await را در پایتون 3.5 معرفی کرد. یک محدودیت قابل‌توجه در پیاده‌سازی پایتون 3.5 این بود که امکان استفاده از await و yield در همان بدنه‌ی تابع وجود نداشت. در پایتون 3.6 این محدودیت برداشته شده و امکان تعریف تولیدگرهای ناهمگام فراهم شده است:

async def ticker(delay, to):
    """اعداد از ۰ تا *to* را هر *delay* ثانیه تولید می‌کند."""
    for i in range(to):
        yield i
        await asyncio.sleep(delay)

سینتکس جدید امکان نوشتن کد سریع‌تر و مختصرتر را فراهم می‌کند.

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

PEP 525 -- تولیدگرهای ناهمگام

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

PEP 530: درک‌های ناهمگام

PEP 530 پشتیبانی از استفاده از async for در درک‌های فهرست، مجموعه و دیکشنری و عبارت‌های تولیدگر را اضافه می‌کند:

result = [i async for i in aiter() if i % 2]

علاوه بر این، عبارت‌های await در همه‌ی انواع درک‌ها پشتیبانی می‌شوند:

result = [await fun() for fun in funcs if await condition()]

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

PEP 530 -- درک‌های ناهمگام

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

PEP 487: سفارشی‌سازی ساده‌تر ایجاد کلاس

اکنون می‌توان ایجاد زیرکلاس را بدون استفاده از فراکلاس سفارشی‌سازی کرد. classmethod جدید __init_subclass__ هر زمان که زیرکلاس جدیدی ایجاد شود، روی کلاس پایه فراخوانی می‌شود:

class PluginBase:
    subclasses = []

    def __init_subclass__(cls, **kwargs):
        super().__init_subclass__(**kwargs)
        cls.subclasses.append(cls)

class Plugin1(PluginBase):
    pass

class Plugin2(PluginBase):
    pass

به‌منظور اینکه فراخوانی‌های بدون آرگومان super() از پیاده‌سازی‌های __init_subclass__() به‌درستی کار کنند، فراکلاس‌های سفارشی باید اطمینان حاصل کنند که ورودی جدید فضای نام __classcell__ به type.__new__ منتقل می‌شود (همان‌طور که در ایجاد شیء کلاس توضیح داده شده است).

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

PEP 487 -- سفارشی‌سازی ساده‌تر ایجاد کلاس

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

مستندات قابلیت

PEP 487: بهبودهای پروتکل توصیف‌گر

PEP 487 پروتکل توصیف‌گر را گسترش می‌دهد تا متد اختیاری جدید __set_name__() را نیز در بر بگیرد. هرگاه کلاس جدیدی تعریف شود، متد جدید بر روی تمام توصیف‌گرهای گنجانده‌شده در تعریف فراخوانی می‌شود و ارجاعی به کلاسی که در حال تعریف است و نامی که به توصیف‌گر در فضای نام کلاس داده شده است را در اختیار آن‌ها قرار می‌دهد. به عبارت دیگر، نمونه‌های توصیف‌گرها اکنون می‌توانند نام ویژگی توصیف‌گر را در کلاس مالک بدانند:

class IntField:
    def __get__(self, instance, owner):
        return instance.__dict__[self.name]

    def __set__(self, instance, value):
        if not isinstance(value, int):
            raise ValueError(f'expecting integer in {self.name}')
        instance.__dict__[self.name] = value

    # this is the new initializer:
    def __set_name__(self, owner, name):
        self.name = name

class Model:
    int_field = IntField()

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

PEP 487 -- سفارشی‌سازی ساده‌تر ایجاد کلاس

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

مستندات ویژگی

PEP 519: افزودن پروتکل مسیر سامانه فایل‌بندی

مسیرهای سامانه فایل‌بندی به‌طور تاریخی به‌صورت اشیای str یا bytes نمایش داده شده‌اند. این امر باعث شده است افرادی که کدی می‌نویسند که روی مسیرهای سامانه فایل‌بندی کار می‌کند، فرض کنند که چنین اشیایی تنها یکی از آن دو نوع هستند (یک int که نمایانگر توصیف‌گر پرونده است به حساب نمی‌آید، زیرا مسیر پرونده نیست). متأسفانه این فرض مانع از آن می‌شود که نمایش‌های جایگزین مسیرهای سامانه فایل‌بندی به‌صورت شیء، مانند pathlib، با کدهای از پیش موجود، از جمله کتابخانه استاندارد پایتون، کار کنند.

برای رفع این وضعیت، رابط جدیدی که با os.PathLike نمایندگی می‌شود تعریف شده است. با پیاده‌سازی متد __fspath__()، یک شیء اعلام می‌کند که نماینده‌ی یک مسیر است. در این صورت، یک شیء می‌تواند نمایش سطح پایین یک مسیر سامانه فایل‌بندی را به‌صورت یک شیء str یا bytes ارائه کند. این بدان معناست که یک شیء در صورتی شبه‌مسیر محسوب می‌شود که os.PathLike را پیاده‌سازی کند یا شیئی از نوع str یا bytes باشد که نماینده‌ی یک مسیر سامانه فایل‌بندی است. کد می‌تواند از os.fspath()، os.fsdecode() یا os.fsencode() استفاده کند تا به‌طور صریح نمایش str و/یا bytes یک شیء شبه‌مسیر را به دست آورد.

تابع توکار open() به‌روزرسانی شده است تا اشیاء os.PathLike را بپذیرد؛ تمام توابع مرتبط در ماژول‌های os و os.path و همچنین بیشتر توابع و کلاس‌های دیگر در کتابخانه استاندارد نیز به‌روزرسانی شده‌اند. کلاس os.DirEntry و کلاس‌های مرتبط در pathlib نیز برای پیاده‌سازی os.PathLike به‌روزرسانی شده‌اند.

امید است که به‌روزرسانی توابع بنیادی برای کار با مسیرهای سامانه فایل‌بندی باعث شود کدهای شخص ثالث بدون هیچ تغییری در کد، یا دست‌کم با تغییرات بسیار ناچیز (مثلاً فراخوانی os.fspath() در ابتدای کد پیش از کار با یک شیء شبه‌مسیر)، به‌طور ضمنی از همه‌ی اشیاء شبه‌مسیر پشتیبانی کنند.

در ادامه چند نمونه از اینکه رابط جدید چگونه امکان می‌دهد pathlib.Path آسان‌تر و شفاف‌تر با کدِ از پیش موجود استفاده شود، آمده است:

>>> import pathlib
>>> with open(pathlib.Path("README")) as f:
...     contents = f.read()
...
>>> import os.path
>>> os.path.splitext(pathlib.Path("some_file.txt"))
('some_file', '.txt')
>>> os.path.join("/a/b", pathlib.Path("c"))
'/a/b/c'
>>> import os
>>> os.fspath(pathlib.Path("some_file.txt"))
'some_file.txt'

(پیاده‌سازی‌شده توسط Brett Cannon، Ethan Furman، Dusty Phillips و Jelle Zijlstra.)

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

PEP 519 -- افزودن یک پروتکل مسیر سامانه فایل‌بندی

PEP نوشته‌شده توسط Brett Cannon و Koos Zevenhoven.

PEP 495: رفع ابهام زمان محلی

در بیشتر مکان‌های جهان، زمان‌هایی وجود داشته و خواهد داشت که در آن‌ها ساعت‌های محلی به عقب کشیده می‌شوند. در چنین زمان‌هایی، بازه‌هایی پدید می‌آیند که در آن‌ها ساعت‌های محلی یک زمان واحد را دو بار در همان روز نشان می‌دهند. در این وضعیت‌ها، اطلاعات نمایش‌داده‌شده روی یک ساعت محلی (یا ذخیره‌شده در یک نمونه‌ی datetime پایتون) برای شناسایی یک لحظه‌ی مشخص در زمان کافی نیست.

PEP 495 ویژگی جدید fold را به نمونه‌های کلاس‌های datetime.datetime و datetime.time اضافه می‌کند تا بین دو لحظه در زمان که زمان‌های محلی‌شان یکسان است، تمایز قائل شود:

>>> u0 = datetime(2016, 11, 6, 4, tzinfo=timezone.utc)
>>> for i in range(4):
...     u = u0 + i*HOUR
...     t = u.astimezone(Eastern)
...     print(u.time(), 'UTC =', t.time(), t.tzname(), t.fold)
...
04:00:00 UTC = 00:00:00 EDT 0
05:00:00 UTC = 01:00:00 EDT 0
06:00:00 UTC = 01:00:00 EST 1
07:00:00 UTC = 02:00:00 EST 0

مقادیر ویژگی fold برای همه‌ی نمونه‌ها 0 است، به‌جز نمونه‌هایی که در یک حالت مبهم، لحظه‌ی دوم (از نظر ترتیب زمانی) را نشان می‌دهند.

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

PEP 495 -- ابهام‌زدایی زمان محلی

PEP توسط الکساندر بلوپولسکی و تیم پیترز نوشته شده و پیاده‌سازی آن توسط الکساندر بلوپولسکی انجام شده است.

PEP 529: تغییر کدگذاری سامانه فایل‌بندی ویندوز به UTF-8

بهترین روش برای نمایش مسیرهای سامانه فایل‌بندی، استفاده از str (یونیکد) به جای bytes است. با این حال، موقعیت‌هایی وجود دارد که در آن‌ها استفاده از bytes کافی و صحیح است.

پیش از پایتون 3.6، استفاده از مسیرهای بایتی در ویندوز می‌توانست به از دست رفتن داده‌ها منجر شود. با این تغییر، استفاده از بایت‌ها برای نمایش مسیرها اکنون در ویندوز پشتیبانی می‌شود، به شرط آنکه این بایت‌ها با کدگذاری بازگردانده‌شده توسط sys.getfilesystemencoding() کدگذاری‌شده باشند که اکنون به طور پیش‌فرض 'utf-8' است.

برنامه‌هایی که از str برای نمایش مسیرها استفاده نمی‌کنند، باید از os.fsencode() و os.fsdecode() استفاده کنند تا مطمئن شوند بایت‌هایشان به‌درستی کدگذاری شده‌اند. برای بازگشت به رفتار پیشین، PYTHONLEGACYWINDOWSFSENCODING را تنظیم کنید یا sys._enablelegacywindowsfsencoding() را فراخوانی کنید.

برای اطلاعات بیشتر و بحث درباره‌ی تغییراتی که ممکن است در کد لازم باشد، PEP 529 را ببینید.

PEP 528: تغییر کدگذاری کنسول ویندوز به UTF-8

کنسول پیش‌فرض در ویندوز اکنون تمام نویسه‌های یونیکد را می‌پذیرد و شیءهای str به‌درستی خوانده‌شده را به کد پایتون ارائه می‌دهد. sys.stdin، sys.stdout و sys.stderr اکنون به‌طور پیش‌فرض از کدگذاری utf-8 استفاده می‌کنند.

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

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

PEP 528 -- تغییر کدگذاری کنسول ویندوز به UTF-8

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

PEP 520: حفظ ترتیب تعریف ویژگی‌های کلاس

ویژگی‌ها در بدنه تعریف کلاس ترتیبی طبیعی دارند: همان ترتیبی که نام‌ها در کد منبع ظاهر می‌شوند. این ترتیب اکنون در ویژگی __dict__ کلاس جدید حفظ می‌شود.

همچنین، فضای نام مؤثرِ پیش‌فرضِ اجرای کلاس (که از type.__prepare__() برگردانده می‌شود) اکنون یک نگاشت حفظ‌کننده‌ی ترتیب درج است.

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

PEP 520 -- حفظ ترتیب تعریف ویژگی‌های کلاس

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

PEP 468: حفظ ترتیب آرگومان‌های کلیدواژه‌ای

**kwargs در امضای یک تابع اکنون تضمین شده است که نگاشتی باشد که ترتیب درج را حفظ می‌کند.

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

PEP 468 -- حفظ ترتیب آرگومان‌های کلیدواژه‌ای

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

پیاده‌سازی جدید dict

نوع dict اکنون از نمایشی «فشرده» استفاده می‌کند که بر پایه‌ی پیشنهاد ری‌موند هتینگر است؛ پیشنهادی که نخستین‌بار در PyPy پیاده‌سازی شد. مصرف حافظه‌ی dict() جدید نسبت به پایتون 3.5 بین ۲۰٪ و ۲۵٪ کمتر است.

جنبه حفظ ترتیب در این پیاده‌سازی جدید جزئیات پیاده‌سازی محسوب می‌شود و نباید به آن تکیه کرد (این ممکن است در آینده تغییر کند، اما مطلوب است که این پیاده‌سازی جدید dict برای چند نسخه در زبان وجود داشته باشد پیش از آنکه مشخصات زبان به‌گونه‌ای تغییر کند که معناشناسی حفظ ترتیب را برای تمام پیاده‌سازی‌های کنونی و آینده پایتون الزامی سازد؛ این همچنین به حفظ سازگاری با نسخه‌های قدیمی‌تر زبان کمک می‌کند که در آن‌ها ترتیب پیمایش تصادفی همچنان برقرار است، مثلاً Python 3.5).

(مشارکت‌شده توسط INADA Naoki در bpo-27350. ایده در اصل توسط Raymond Hettinger پیشنهاد شده.)

PEP 523: افزودن API ارزیابی فریم (frame evaluation) به سی‌پایتون

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

PEP 523 با فراهم کردن یک API که ارزیابی فریم را در سطح C قابل اتصال می‌کند، این وضعیت را تغییر می‌دهد. این امر به ابزارهایی مانند اشکال‌زداها و JIT‌ها اجازه می‌دهد تا ارزیابی فریم را پیش از آغاز اجرای کد پایتون رهگیری کنند. این امر استفاده از پیاده‌سازی‌های ارزیابی جایگزین برای کد پایتون، پیگیری ارزیابی فریم و غیره را ممکن می‌سازد.

این API بخشی از API محدود C نیست و به‌عنوان خصوصی علامت‌گذاری شده است تا نشان دهد که انتظار می‌رود استفاده از این API محدود باشد و فقط برای موارد استفاده‌ی بسیار خاص و سطح‌پایین کاربرد داشته باشد. معناشناسی این API در صورت نیاز همراه با پایتون تغییر خواهد کرد.

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

PEP 523 -- افزودن API ارزیابی فریم به سی‌پایتون

PEP نوشته‌شده توسط Brett Cannon و Dino Viehland.

متغیر محیطی PYTHONMALLOC

متغیر محیطی جدید PYTHONMALLOC امکان تنظیم تخصیص‌دهنده‌های حافظه‌ی پایتون و نصب قلاب‌های اشکال‌زدایی را فراهم می‌کند.

اکنون با استفاده از PYTHONMALLOC=debug، می‌توان قلاب‌های اشکال‌زدایی را روی تخصیص‌دهنده‌های حافظه‌ی پایتونی که در حالت انتشار کامپایل شده است نصب کرد. اثرات قلاب‌های اشکال‌زدایی:

  • حافظه تازه تخصیص‌یافته با بایت 0xCB پر می‌شود

  • حافظه‌ی آزادشده با بایت 0xDB پر می‌شود

  • تشخیص نقض‌های API تخصیص‌دهنده حافظه پایتون. برای مثال، فراخوانی PyObject_Free() روی بلوک حافظه‌ای که توسط PyMem_Malloc() تخصیص یافته است.

  • تشخیص نوشتن‌های پیش از ابتدای بافر (زیرریزی بافر (buffer underflow))

  • تشخیص نوشتن پس از انتهای بافر (سرریز بافر)

  • بررسی کنید که هنگام فراخوانی توابع تخصیص‌دهنده حافظه در دامنه‌های PYMEM_DOMAIN_OBJ (مثلاً PyObject_Malloc()) و PYMEM_DOMAIN_MEM (مثلاً PyMem_Malloc()قفل مفسر سراسری نگه داشته شده باشد.

بررسی اینکه آیا قفل مفسر سراسری (GIL) نگه داشته شده است نیز ویژگی جدیدی در پایتون 3.6 است.

برای قلاب‌های اشکال‌زدایی در تخصیص‌دهنده‌های حافظه پایتون، به تابع PyMem_SetupDebugHooks() مراجعه کنید.

اکنون همچنین می‌توان با استفاده از PYTHONMALLOC=malloc، به‌کارگیری تخصیص‌دهنده‌ی malloc() کتابخانه‌ی C را برای تمام تخصیص‌های حافظه‌ی پایتون اجباری کرد. این کار هنگام استفاده از اشکال‌زداهای حافظه‌ی خارجی مانند Valgrind روی پایتونی که در حالت انتشار کامپایل شده است، سودمند است.

در صورت وقوع خطا، قلاب‌های اشکال‌زدایی روی تخصیص‌دهنده‌های حافظه پایتون اکنون از ماژول tracemalloc برای به‌دست‌آوردن ردگیری محل تخصیص یک بلوک حافظه استفاده می‌کنند.

مثالی از خطای مهلک هنگام سرریز بافر با استفاده از python3.6 -X tracemalloc=5 (ذخیره‌ی ۵ فریم در ردگیری‌ها):

Debug memory block at address p=0x7fbcd41666f8: API 'o'
    4 bytes originally requested
    The 7 pad bytes at p-7 are FORBIDDENBYTE, as expected.
    The 8 pad bytes at tail=0x7fbcd41666fc are not all FORBIDDENBYTE (0xfb):
        at tail+0: 0x02 *** OUCH
        at tail+1: 0xfb
        at tail+2: 0xfb
        at tail+3: 0xfb
        at tail+4: 0xfb
        at tail+5: 0xfb
        at tail+6: 0xfb
        at tail+7: 0xfb
    The block was made by call #1233329 to debug malloc/realloc.
    Data at p: 1a 2b 30 00

Memory block allocated at (most recent call first):
  File "test/test_bytes.py", line 323
  File "unittest/case.py", line 600
  File "unittest/case.py", line 648
  File "unittest/suite.py", line 122
  File "unittest/suite.py", line 84

Fatal Python error: bad trailing pad byte

Current thread 0x00007fbcdbd32700 (most recent call first):
  File "test/test_bytes.py", line 323 in test_hex
  File "unittest/case.py", line 600 in run
  File "unittest/case.py", line 648 in __call__
  File "unittest/suite.py", line 122 in run
  File "unittest/suite.py", line 84 in __call__
  File "unittest/suite.py", line 122 in run
  File "unittest/suite.py", line 84 in __call__
  ...

(مشارکت‌شده توسط Victor Stinner در bpo-26516 و bpo-26564.)

پشتیبانی از کاوشگری (probing) با DTrace و SystemTap

پایتون اکنون می‌تواند با --with-dtrace ساخته شود که نشانگرهای ایستا را برای رویدادهای زیر در مفسر فعال می‌کند:

  • فراخوانی/بازگشت تابع

  • آغاز/پایان زباله‌روبی

  • سطر کد اجرا‌شده.

این می‌تواند برای ابزاردهی (instrument) مفسرهای در حال اجرا در محیط عملیاتی استفاده شود، بدون نیاز به کامپایل مجدد ساخت‌های اشکال‌زدایی خاص یا فراهم کردن کد پروفایل‌گیری/اشکال‌زدایی اختصاصی برنامه.

جزئیات بیشتر در ابزارسازی CPython با DTrace و SystemTap.

پیاده‌سازی فعلی روی لینوکس و macOS آزموده شده است. ممکن است در آینده نشانگرهای بیشتری افزوده شوند.

(مشارکت‌شده توسط Łukasz Langa در bpo-21590، بر اساس وصل‌های Jesús Cea Avión، David Malcolm و Nikhil Benesch.)

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

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

  • اکنون دستور global یا nonlocal باید از نظر متنی پیش از نخستین استفاده از نام تحت تأثیر در همان محدوده ظاهر شود. پیش‌تر این مورد یک SyntaxWarning بود.

  • اکنون می‌توان یک متد ویژه را برابر None قرار داد تا مشخص شود که عملیات مربوطه در دسترس نیست. برای مثال، اگر کلاسی __iter__() را برابر None قرار دهد، آن کلاس پیمایش‌پذیر نیست. (مشارکت توسط Andrew Barnert و Ivan Levkivskyi در bpo-25958.)

  • دنباله‌های طولانی از سطرهای تکراری ردگیری اکنون به‌صورت "[Previous line repeated {count} more times]" خلاصه می‌شوند (برای مشاهده‌ی نمونه به traceback مراجعه کنید). (مشارکت‌شده توسط Emanuel Barry در bpo-26823.)

  • ایمپورت اکنون هنگامی که نتواند ماژولی را پیدا کند، استثنای جدید ModuleNotFoundError (زیرکلاس ImportError) را ایجاد می‌کند. کدهایی که در حال حاضر ImportError را بررسی می‌کنند (در try-except) همچنان کار خواهند کرد. (مشارکت‌شده توسط Eric Snow در bpo-15767.)

  • متدهای کلاسی که به super() بدون آرگومان تکیه دارند، اکنون هنگام فراخوانی از متدهای فراکلاس در حین ایجاد کلاس به‌درستی کار می‌کنند. (مشارکت‌شده توسط Martin Teichmann در bpo-23722.)

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

secrets

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

هشدار

توجه داشته باشید که مولدهای شبه‌تصادفی در ماژول random به هیچ وجه نباید برای مقاصد امنیتی استفاده شوند. در پایتون 3.6 و نسخه‌های بعدی از secrets و در پایتون 3.5 و نسخه‌های قبلی از os.urandom() استفاده کنید.

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

PEP 506 -- افزودن ماژول Secrets به کتابخانه استاندارد

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

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

array

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

ارائه‌شده توسط Serhiy Storchaka در bpo-26492.

ast

گره AST جدید ast.Constant افزوده شده است. این گره می‌تواند توسط بهینه‌سازهای خارجی AST به منظور تاشدگی ثابت (constant folding) استفاده شود.

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

asyncio

از پایتون 3.6 به بعد، ماژول asyncio دیگر آزمایشی نیست و API آن پایدار در نظر گرفته می‌شود.

تغییرات قابل توجه در ماژول asyncio از زمان پایتون 3.5.0 (همگی به دلیل وضعیت آزمایشی، به 3.5.x بک‌پورت شده‌اند):

  • تابع get_event_loop() به‌گونه‌ای تغییر کرده است که هنگام فراخوانی از هم‌روال‌ها و کال‌بک‌ها، همیشه حلقه‌ی در حال اجرا را بازگرداند. (مشارکت‌شده توسط یوری سلیوانوف در bpo-28613.)

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

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

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

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

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

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

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

  • کارایی StreamReader.readexactly() بهبود یافته است. (مشارکت Mark Korenberg در bpo-28370.)

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

  • متد loop.stop() به‌گونه‌ای تغییر کرده است که حلقه را بلافاصله پس از پیمایش جاری متوقف می‌کند. هر کال‌بک جدیدی که در نتیجه‌ی آخرین پیمایش زمان‌بندی شده باشد، دور ریخته خواهد شد. (مشارکت‌شده توسط Guido van Rossum در bpo-25593.)

  • Future.set_exception اکنون هنگامی که نمونه‌ای از استثنای StopIteration به آن داده شود، TypeError ایجاد می‌کند. (مشارکت‌شده توسط Chris Angelico در bpo-26221.)

  • متد جدید loop.connect_accepted_socket() برای استفاده توسط سرورهایی که اتصالات را خارج از asyncio می‌پذیرند، اما از asyncio برای مدیریت آن‌ها استفاده می‌کنند. (ارائه‌شده توسط Jim Fulton در bpo-27392.)

  • پرچم TCP_NODELAY اکنون به‌طور پیش‌فرض برای همه‌ی انتقال‌دهنده‌های (transport) TCP تنظیم می‌شود. (با مشارکت Yury Selivanov در bpo-27456.)

  • متد جدید loop.shutdown_asyncgens() که تولیدگرهای ناهمگام در انتظار را پیش از بستن حلقه به‌درستی می‌بندد. (مشارکت Yury Selivanov در bpo-28003.)

  • کلاس‌های Future و Task اکنون یک پیاده‌سازی بهینه‌شده به زبان C دارند که کد asyncio را تا ۳۰ درصد سریع‌تر می‌کند. (ارائه‌شده توسط Yury Selivanov و INADA Naoki در bpo-26081 و bpo-28544.)

binascii

تابع b2a_base64() اکنون یک آرگومان کلیدواژه‌ای اختیاری newline را می‌پذیرد تا کنترل کند که آیا نویسه سطر جدید به مقدار بازگشتی افزوده می‌شود یا خیر. (ارائه‌شده توسط Victor Stinner در bpo-25357.)

cmath

ثابت جدید cmath.tau (τ) افزوده شده است. (مشارکت‌شده توسط Lisa Roach در bpo-12345، برای جزئیات به PEP 628 مراجعه کنید.)

ثابت‌های جدید: cmath.inf و cmath.nan برای مطابقت با math.inf و math.nan، و همچنین cmath.infj و cmath.nanj برای مطابقت با قالب استفاده‌شده در repr اعداد مختلط. (مشارکت Mark Dickinson در bpo-23229.)

collections

کلاس پایه انتزاعی جدید Collection برای نمایش کلاس‌های ظرف پیمایش‌پذیرِ اندازه‌دار افزوده شده است. (با مشارکت Ivan Levkivskyi و مستندسازی Neil Girdhar در bpo-27598.)

کلاس پایه انتزاعی جدید Reversible نماینده‌ی کلاس‌های پیمایش‌پذیری است که متد __reversed__() را نیز ارائه می‌کنند. (مشارکت‌شده توسط Ivan Levkivskyi در bpo-25987.)

کلاس پایه انتزاعی جدید AsyncGenerator تولیدگرهای ناهمگام را نمایش می‌دهد. (با مشارکت Yury Selivanov در bpo-28720.)

تابع namedtuple() اکنون یک آرگومان کلیدواژه‌ای اختیاری به نام module را می‌پذیرد که در صورت تعیین شدن، برای ویژگی __module__ کلاس تاپل نام‌دار بازگردانده‌شده استفاده می‌شود. (مشارکت Raymond Hettinger در bpo-17941.)

آرگومان‌های verbose و rename برای namedtuple() اکنون فقط کلیدواژه‌ای هستند. (مشارکت‌شده توسط Raymond Hettinger در bpo-25628.)

نمونه‌های بازگشتی collections.deque را اکنون می‌توان پیکل کرد. (با مشارکت Serhiy Storchaka در bpo-26482.)

concurrent.futures

سازنده‌ی کلاس ThreadPoolExecutor اکنون یک آرگومان اختیاری thread_name_prefix را می‌پذیرد تا امکان سفارشی‌سازی نام نخ‌هایی که توسط استخر ایجاد می‌شوند فراهم شود. (مشارکت‌شده توسط Gregory P. Smith در bpo-27664.)

contextlib

کلاس contextlib.AbstractContextManager برای فراهم کردن یک کلاس پایه انتزاعی برای مدیرهای زمینه اضافه شده است. این کلاس یک پیاده‌سازی پیش‌فرض منطقی برای __enter__() فراهم می‌کند که self را برمی‌گرداند و __exit__() را به‌عنوان یک متد انتزاعی باقی می‌گذارد. یک کلاس منطبق نیز با نام typing.ContextManager به ماژول typing اضافه شده است. (مشارکت Brett Cannon در bpo-25609.)

datetime

کلاس‌های datetime و time ویژگی جدید fold را دارند که در صورت نیاز برای رفع ابهام زمان محلی استفاده می‌شود. بسیاری از توابع در datetime برای پشتیبانی از رفع ابهام زمان محلی به‌روزرسانی شده‌اند. برای اطلاعات بیشتر، بخش رفع ابهام زمان محلی را ببینید. (ارائه‌شده توسط Alexander Belopolsky در bpo-24773.)

متد‌های datetime.strftime() و date.strftime() اکنون از دایرکتیو‌های تاریخ ISO 8601 شامل %G، %u و %V پشتیبانی می‌کنند. (مشارکت‌شده توسط Ashley Anderson در bpo-12006.)

تابع datetime.isoformat() اکنون آرگومان اختیاری timespec را می‌پذیرد که مشخص می‌کند چه تعداد جزء اضافی از مقدار زمان باید گنجانده شود. (مشارکت Alessandro Cucci و Alexander Belopolsky در bpo-19475.)

متد datetime.combine() اکنون یک آرگومان اختیاری tzinfo می‌پذیرد. (مشارکت الکساندر بلوپولسکی در bpo-27661.)

decimal

متد جدید Decimal.as_integer_ratio() که جفت (n, d) از اعداد صحیح را برمی‌گرداند که نمونه‌ی داده‌شده‌ی Decimal را به‌صورت یک کسر، به ساده‌ترین شکل و با مخرج مثبت نشان می‌دهد:

>>> Decimal('-3.14').as_integer_ratio()
(-157, 50)

(مشارکت‌شده توسط Stefan Krah و Mark Dickinson در bpo-25928.)

distutils

ویژگی default_format از distutils.command.sdist.sdist حذف شده است و ویژگی formats به طور پیش‌فرض ['gztar'] است. هرچند این مورد پیش‌بینی نشده بود، ممکن است هر کدی که به وجود default_format متکی است نیاز به تطبیق داشته باشد. برای جزئیات بیشتر به bpo-27819 مراجعه کنید.

email

API جدید ایمیل، که با ارسال کلیدواژه‌ی policy به سازنده‌های گوناگون فعال می‌شود، دیگر آزمایشی نیست. مستندات email بازسازماندهی و بازنویسی شده است تا بر API جدید تمرکز کند، در حالی که مستندات قدیمی مربوط به API میراثی نیز حفظ شده است. (مشارکت‌شده توسط R. David Murray در bpo-24277.)

کلاس‌های email.mime اکنون همگی یک کلیدواژه‌ی اختیاری policy را می‌پذیرند. (مشارکت‌شده توسط برکر پکساگ در bpo-27331.)

DecodedGenerator اکنون از کلیدواژه‌ی policy پشتیبانی می‌کند.

یک ویژگی جدید در policy وجود دارد، message_factory، که کنترل می‌کند پارسر هنگام ساخت اشیاء پیام جدید به‌طور پیش‌فرض از کدام کلاس استفاده کند. برای سیاست email.policy.compat32 این کلاس Message است و برای سیاست‌های جدید EmailMessage است. (ارائه‌شده توسط R. David Murray در bpo-20476.)

encodings

در ویندوز، کدگذاری 'oem' برای استفاده از CP_OEMCP و نام مستعار 'ansi' برای کدگذاری موجود 'mbcs' که از صفحه‌ی کد CP_ACP استفاده می‌کند، افزوده شد. (مشارکت‌شده توسط استیو داور در bpo-27959.)

enum

دو کلاس پایه enum جدید به ماژول enum اضافه شده‌اند: Flag و IntFlag. هر دو برای تعریف ثابت‌هایی به کار می‌روند که می‌توان آن‌ها را با استفاده از عملگرهای بیتی ترکیب کرد. (مشارکت‌شده توسط Ethan Furman در bpo-23591.)

بسیاری از ماژول‌های کتابخانه استاندارد به‌روزرسانی شده‌اند تا از کلاس IntFlag برای ثابت‌های خود استفاده کنند.

مقدار جدید enum.auto را می‌توان برای انتساب خودکار مقادیر به اعضای enum به کار برد:

>>> from enum import Enum, auto
>>> class Color(Enum):
...     red = auto()
...     blue = auto()
...     green = auto()
...
>>> list(Color)
[<Color.red: 1>, <Color.blue: 2>, <Color.green: 3>]

faulthandler

در ویندوز، ماژول faulthandler اکنون هندلری برای استثناهای ویندوز نصب می‌کند: faulthandler.enable() را ببینید. (مشارکت‌شده توسط ویکتور استینر در bpo-23848.)

fileinput

hook_encoded() اکنون از آرگومان errors پشتیبانی می‌کند. (مشارکت‌شده توسط Joseph Hackman در bpo-25788.)

hashlib

hashlib از OpenSSL 1.1.0 پشتیبانی می‌کند. حداقل نسخه‌ی توصیه‌شده 1.0.2 است. (مشارکت‌شده توسط Christian Heimes در bpo-26470.)

توابع هش BLAKE2 به ماژول افزوده شدند. blake2b() و blake2s() همیشه دسترس‌پذیر هستند و از مجموعه کامل قابلیت‌های BLAKE2 پشتیبانی می‌کنند. (ارائه‌شده توسط Christian Heimes در bpo-26798 بر پایه کدی از Dmitry Chestnykh و Samuel Neves. مستندات نوشته‌شده توسط Dmitry Chestnykh.)

توابع هش SHA-3 یعنی sha3_224()، sha3_256()، sha3_384()، sha3_512() و همچنین توابع هش SHAKE یعنی shake_128() و shake_256() افزوده شدند. (مشارکت‌شده توسط Christian Heimes در bpo-16113. Keccak Code Package توسط Guido Bertoni، Joan Daemen، Michaël Peeters، Gilles Van Assche و Ronny Van Keer.)

تابع استخراج کلید مبتنی بر گذرواژه scrypt() اکنون با OpenSSL 1.1.0 و نسخه‌های جدیدتر دسترس‌پذیر است. (مشارکت‌شده توسط Christian Heimes در bpo-27928.)

http.client

HTTPConnection.request() و endheaders() هر دو اکنون از بدنه‌های درخواست با کدگذاری بخش‌بندی‌شده پشتیبانی می‌کنند. (مشارکت Demian Brecht و Rolf Krahl در bpo-12319.)

idlelib و IDLE

بسته‌ی idlelib در حال نوسازی و بازآرایی است تا ظاهر و عملکرد IDLE بهتر شود و فهمیدن، آزمودن و بهبود دادن کد آسان‌تر باشد. بخشی از بهتر کردن ظاهر IDLE، به‌ویژه در لینوکس و مک، استفاده از ابزارک‌های ttk است که عمدتاً در کادرهای گفت‌وگو به کار می‌روند. در نتیجه، IDLE دیگر با tcl/tk 8.4 اجرا نمی‌شود و اکنون به tcl/tk 8.5 یا 8.6 نیاز دارد. توصیه می‌کنیم آخرین نسخه‌ی هرکدام را اجرا کنید.

«نوسازی» شامل تغییر نام و تجمیع ماژول‌های idlelib است. تغییر نام پرونده‌هایی که نام‌هایشان تا حدی با حروف بزرگ است، مشابه تغییر نام Tkinter و TkFont، برای مثال، به tkinter و tkinter.font در 3.0 است. در نتیجه، ایمپورت‌های پرونده‌های idlelib که در 3.5 کار می‌کردند، معمولاً در 3.6 کار نخواهند کرد. حداقل یک تغییر نام ماژول لازم خواهد بود (به idlelib/README.txt مراجعه کنید)، گاهی بیشتر. (تغییرات نام با مشارکت Al Swiegart و Terry Reedy در bpo-24225 انجام شده است. بیشتر پچ‌های idlelib از آن زمان بخشی از این فرایند بوده‌اند و خواهند بود.)

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

جدید در 3.6.2:

چندین اصلاح برای تکمیل خودکار. (مشارکت‌شده توسط Louie Lu در bpo-15786.)

افزوده‌شده در نسخه 3.6.3:

مرورگر ماژول (در منوی File، که پیش‌تر مرورگر کلاس نامیده می‌شد)، اکنون علاوه بر توابع و کلاس‌های سطح بالا، توابع و کلاس‌های تودرتو را نیز نمایش می‌دهد. (مشارکت‌شده توسط Guilherme Polo، Cheryl Sabella و Terry Jan Reedy در bpo-1612262.)

قابلیت‌های IDLE که پیش‌تر به‌صورت افزونه پیاده‌سازی شده بودند، به‌عنوان قابلیت‌های عادی بازپیاده‌سازی شده‌اند. تنظیمات آن‌ها از زبانه‌ی Extensions به زبانه‌های دیگر پنجره‌ی گفت‌وگو منتقل شده است. (با مشارکت Charles Wohlganger و Terry Jan Reedy در bpo-27099.)

گفت‌وگوی تنظیمات (Options، Configure IDLE) برای بهبود هم ظاهر و هم عملکرد آن، تا حدی بازنویسی شده است. (مشارکت‌شده توسط Cheryl Sabella و Terry Jan Reedy در چندین مورد .)

جدید در 3.6.4:

نمونه قلم اکنون گزیده‌ای از نویسه‌های غیرلاتین را در بر می‌گیرد تا کاربران بتوانند اثر انتخاب یک قلم خاص را بهتر ببینند. (مشارکت‌شده توسط Terry Jan Reedy در bpo-13802.) نمونه را می‌توان ویرایش کرد تا نویسه‌های دیگر را در بر بگیرد. (مشارکت‌شده توسط Serhiy Storchaka در bpo-31860.)

جدید در نسخه 3.6.6:

گزینه‌ی زمینه کد در ویرایشگر بازبینی شد. جعبه تمام سطرهای زمینه را تا maxlines نمایش می‌دهد. با کلیک روی یک سطر زمینه، ویرایشگر به آن سطر پرش می‌کند. رنگ‌های زمینه برای تم‌های سفارشی به زبانه‌ی برجسته‌سازی (Highlights) در گفت‌وگوی تنظیمات اضافه شد. (مشارکت‌شده توسط Cheryl Sabella و Terry Jan Reedy در bpo-33642، bpo-33768 و bpo-33679.)

در ویندوز، یک فراخوانی API جدید به ویندوز می‌گوید که tk برای DPI مقیاس‌بندی می‌کند. در ویندوز 8.1+ یا 10، در صورتی که ویژگی‌های سازگاری DPI پرونده دودویی پایتون بدون تغییر باشد و وضوح نمایشگر بیش از ۹۶ DPI باشد، این باید متن و سطرها را واضح‌تر کند. در غیر این صورت، نباید هیچ تأثیری داشته باشد. (مشارکت‌شده توسط Terry Jan Reedy در bpo-33656.)

جدید در نسخه‌ی 3.6.7:

خروجی بیش از N سطر (به‌طور پیش‌فرض ۵۰) به یک دکمه فشرده (squeeze) می‌شود. مقدار N را می‌توان در بخش PyShell از صفحه‌ی General در پنجره‌ی تنظیمات تغییر داد. سطرهای کمتر، اما احتمالاً بسیار بلند، را می‌توان با راست‌کلیک کردن روی خروجی فشرده کرد. خروجی فشرده‌شده را می‌توان با دوبار کلیک کردن روی دکمه، در همان‌جا گسترش داد، یا با راست‌کلیک کردن روی دکمه، به کلیپ‌بورد یا یک پنجره‌ی جداگانه گسترش داد. (مشارکت‌شده توسط Tal Einat در bpo-1529353.)

importlib

ایمپورت اکنون هنگامی که نمی‌تواند ماژولی را پیدا کند، استثنای جدید ModuleNotFoundError (زیرکلاسی از ImportError) را ایجاد می‌کند. کدهایی که در حال حاضر ImportError را بررسی می‌کنند (در try-except)، همچنان کار خواهند کرد. (مشارکت‌شده توسط Eric Snow در bpo-15767.)

importlib.util.LazyLoader اکنون create_module() را روی بارگذار پوشش‌داده‌شده فراخوانی می‌کند و محدودیتی را که importlib.machinery.BuiltinImporter و importlib.machinery.ExtensionFileLoader نمی‌توانستند با importlib.util.LazyLoader استفاده شوند، حذف می‌کند.

importlib.util.cache_from_source()، importlib.util.source_from_cache() و importlib.util.spec_from_file_location() اکنون یک شیء شبه‌مسیر را می‌پذیرند.

inspect

تابع inspect.signature() اکنون پارامترهای ضمنی .0 تولیدشده توسط کامپایلر برای محدوده‌های درک و عبارت تولیدگر را به‌گونه‌ای گزارش می‌کند که گویی پارامترهایی صرفاً جایگاهی به نام implicit0 هستند. (مشارکت‌شده توسط Jelle Zijlstra در bpo-19611.)

برای کاهش تغییرات مکرر کد (code churn) هنگام ارتقا از Python 2.7 و API قدیمی inspect.getargspec()، منسوخ‌شدنی که پیش‌تر برای inspect.getfullargspec() مستند شده بود، واگردانی شده است. هرچند این تابع برای پایه‌های کد تک‌منبعی Python 2/3 سودمند است، رابط غنی‌تر inspect.signature() همچنان رویکرد توصیه‌شده برای کد جدید است. (با مشارکت Nick Coghlan در bpo-27172)

json

json.load() و json.loads() اکنون از ورودی دودویی پشتیبانی می‌کنند. JSON کدگذاری‌شده باید با استفاده از یکی از UTF-8، UTF-16 یا UTF-32 نمایش داده شود. (با مشارکت Serhiy Storchaka در bpo-17909.)

گزارش‌گیری

متد جدید WatchedFileHandler.reopenIfNeeded() برای افزودن قابلیت بررسی اینکه آیا پرونده گزارش نیاز به بازگشایی دارد یا خیر، اضافه شده است. (مشارکت Marian Horban در bpo-24884.)

math

ثابت تاو (τ) به ماژول‌های math و cmath افزوده شده است. (ارائه‌شده توسط Lisa Roach در bpo-12345؛ برای جزئیات به PEP 628 مراجعه کنید.)

multiprocessing

شیءهای پراکسی که توسط multiprocessing.Manager() بازگردانده می‌شوند، اکنون می‌توانند تودرتو باشند. (با مشارکت Davin Potts در bpo-6766.)

os

برای جزئیات درباره‌ی اینکه چگونه ماژول‌های os و os.path اکنون از اشیاء شبه‌مسیر پشتیبانی می‌کنند، به خلاصه‌ی PEP 519 مراجعه کنید.

scandir() اکنون از مسیر‌های bytes در ویندوز پشتیبانی می‌کند.

متد جدید close() اجازه می‌دهد که پیمایش‌گر scandir() را به‌طور صریح ببندید. پیمایش‌گر scandir() اکنون از پروتکل مدیر زمینه پشتیبانی می‌کند. اگر پیمایش‌گر scandir() نه به پایان رسیده باشد و نه به‌طور صریح بسته باشد، ResourceWarning در مخرب آن منتشر خواهد شد. (ارائه‌شده توسط Serhiy Storchaka در bpo-25994.)

در لینوکس، os.urandom() اکنون برای افزایش امنیت، تا زمانی که استخر آنتروپی urandom سیستم مقداردهی اولیه شود، مسدود می‌شود. برای اطلاع از دلایل این تغییر، PEP 524 را ببینید.

فراخوانی سیستمی getrandom() در لینوکس (دریافت بایت‌های تصادفی) اکنون به‌عنوان تابع جدید os.getrandom() در دسترس قرار گرفته است. (مشارکت‌شده توسط Victor Stinner، بخشی از PEP 524)

pathlib

pathlib اکنون از اشیاء شبه‌مسیر پشتیبانی می‌کند. (مشارکت‌شده توسط Brett Cannon در bpo-27186.)

برای جزئیات، خلاصه‌ی PEP 519 را ببینید.

pdb

سازنده‌ی کلاس Pdb یک آرگومان اختیاری جدید readrc دارد که کنترل می‌کند آیا پرونده‌های .pdbrc باید خوانده شوند یا خیر.

pickle

اشیایی که نیاز دارند __new__ آن‌ها با آرگومان‌های کلیدواژه‌ای فراخوانی شود، اکنون می‌توانند با استفاده از پروتکل‌های پیکل قدیمی‌تر از نسخه 4 پروتکل پیکل شوند. نسخه 4 پروتکل از قبل از این حالت پشتیبانی می‌کند. (مشارکت Serhiy Storchaka در bpo-24164.)

pickletools

pickletools.dis() اکنون اندیس ضمنی ممو (memo) را برای آپ‌کد MEMOIZE خروجی می‌دهد. (مشارکت‌شده توسط Serhiy Storchaka در bpo-25382.)

pydoc

ماژول pydoc یاد گرفته است که متغیر محیطی MANPAGER را رعایت کند. (مشارکت Matthias Klose در bpo-8637.)

help() و pydoc اکنون می‌توانند فیلدهای تاپل نام‌دار را به ترتیبی که تعریف شده‌اند فهرست کنند، نه به ترتیب الفبایی. (مشارکت Raymond Hettinger در bpo-24879.)

random

تابع جدید choices() فهرستی از عناصر با اندازه‌ی مشخص را از جمعیت داده‌شده با وزن‌های اختیاری برمی‌گرداند. (با مشارکت Raymond Hettinger در bpo-18844.)

re

پشتیبانی از گستره‌های تغییردهنده (modifier spans) در عبارت‌های باقاعده افزوده شد. مثال‌ها: '(?i:p)ython' با 'python' و 'Python' تطبیق می‌کند، اما با 'PYTHON' تطبیق نمی‌کند؛ '(?i)g(?-i:v)r' با 'GvR' و 'gvr' تطبیق می‌کند، اما با 'GVR' تطبیق نمی‌کند. (مشارکت‌شده توسط Serhiy Storchaka در bpo-433028.)

به گروه‌های شیء تطبیق می‌توان با __getitem__، که معادل group() است، دسترسی داشت. بنابراین mo['name'] اکنون معادل mo.group('name') است. (مشارکت‌شده توسط اریک اسمیت در bpo-24454.)

اشیای Match اکنون از اشیای شبه‌اندیس به‌عنوان اندیس‌های گروه پشتیبانی می‌کنند. (ارائه‌شده توسط Jeroen Demeyer و Xiang Zhang در bpo-27177.)

readline

تابع set_auto_history() برای فعال یا غیرفعال کردن افزودن خودکار ورودی به فهرست تاریخچه افزوده شد. (مشارکت‌شده توسط Tyler Crompton در bpo-26870.)

rlcompleter

نام‌های ویژگی‌های خصوصی و ویژه اکنون حذف می‌شوند، مگر آنکه پیشوند با زیرخط آغاز شود. پس از برخی کلیدواژه‌های تکمیل‌شده، یک فاصله یا دونقطه افزوده می‌شود. (مشارکت‌شده توسط Serhiy Storchaka در bpo-25011 و bpo-25209.)

shlex

کلاس shlex از طریق آرگومان جدید punctuation_chars، که کنترل می‌کند کدام نویسه‌ها به‌عنوان نقطه‌گذاری در نظر گرفته شوند، دارای سازگاری بسیار بهبودیافته با پوسته است. (مشارکت‌شده توسط وینای ساجیپ در bpo-1521950.)

site

هنگام مشخص کردن مسیرهایی برای افزودن به sys.path در یک پرونده‌ی .pth، اکنون می‌توانید علاوه بر پوشه‌ها، مسیرهای پرونده را نیز مشخص کنید (مثلاً پرونده‌های zip). (ارائه‌شده توسط Wolfgang Langner در bpo-26587).

sqlite3

sqlite3.Cursor.lastrowid now supports the REPLACE statement. (Contributed by Alex LordThorsen in bpo-16864.)

socket

تابع ioctl() اکنون از کد کنترل SIO_LOOPBACK_FAST_PATH پشتیبانی می‌کند. (نوشته‌شده توسط Daniel Stokes در bpo-26536.)

ثابت‌های getsockopt() شامل SO_DOMAIN، SO_PROTOCOL، SO_PEERSEC و SO_PASSSEC اکنون پشتیبانی می‌شوند. (مشارکت‌شده توسط Christian Heimes در bpo-26907.)

setsockopt() اکنون از شکل setsockopt(level, optname, None, optlen: int) پشتیبانی می‌کند. (مشارکت‌شده توسط Christian Heimes در bpo-27744.)

ماژول socket اکنون از خانواده آدرس AF_ALG برای تعامل با API رمزنگاری کرنل لینوکس پشتیبانی می‌کند. ALG_*، SOL_ALG و sendmsg_afalg() افزوده شدند. (با مشارکت Christian Heimes در bpo-27744 و با پشتیبانی از Victor Stinner.)

ثابت‌های جدید لینوکس TCP_USER_TIMEOUT و TCP_CONGESTION افزوده شدند. (مشارکت: Omar Sandoval، bpo-26273).

socketserver

سرورهای مبتنی بر ماژول socketserver، از جمله سرورهای تعریف‌شده در http.server، xmlrpc.server و wsgiref.simple_server، اکنون از پروتکل مدیر زمینه پشتیبانی می‌کنند. (مشارکت‌شده توسط آویو پالیوودا در bpo-26404.)

ویژگی wfile از کلاس‌های StreamRequestHandler اکنون رابط نوشتنی io.BufferedIOBase را پیاده‌سازی می‌کند. به‌ویژه، اکنون تضمین شده است که فراخوانی write() داده‌ها را به‌طور کامل ارسال می‌کند. (مشارکت Martin Panter در bpo-26721.)

ssl

ssl از OpenSSL 1.1.0 پشتیبانی می‌کند. حداقل نسخه‌ی توصیه‌شده 1.0.2 است. (مشارکت‌شده توسط Christian Heimes در bpo-26470.)

3DES از مجموعه‌های رمز پیش‌فرض حذف شده است و مجموعه‌های رمز ChaCha20 Poly1305 افزوده شده‌اند. (مشارکت‌شده توسط Christian Heimes در bpo-27850 و bpo-27766.)

SSLContext پیکربندی پیش‌فرض بهتری برای گزینه‌ها و رمزها دارد. (ارائه‌شده توسط Christian Heimes در bpo-28043.)

نشست SSL را می‌توان با کلاس جدید SSLSession از یک اتصال سمت کلاینت به اتصال دیگری کپی کرد. ازسرگیری نشست TLS می‌تواند دست‌دهی اولیه را تسریع کند، تأخیر را کاهش دهد و کارایی را بهبود بخشد (مشارکت‌شده توسط Christian Heimes در bpo-19500 بر اساس پیش‌نویسی از Alex Warhawk.)

از متد جدید get_ciphers() می‌توان برای دریافت فهرستی از رمزهای فعال‌شده به ترتیب اولویت رمز استفاده کرد.

همه‌ی ثابت‌ها و پرچم‌ها به IntEnum و IntFlag تبدیل شده‌اند. (با مشارکت کریستین هایمز در bpo-28025.)

پروتکل‌های TLS اختصاصی سمت سرور و کلاینت برای SSLContext افزوده شدند. (مشارکت‌شده توسط Christian Heimes در bpo-28085.)

ssl.SSLContext.post_handshake_auth برای فعال‌سازی و ssl.SSLSocket.verify_client_post_handshake() برای آغاز احراز هویت پس از دست‌دهی TLS 1.3 افزوده شدند. (مشارکت‌شده توسط Christian Heimes در gh-78851.)

statistics

تابع جدید harmonic_mean() اضافه شده است. (مشارکت‌شده توسط Steven D'Aprano در bpo-27181.)

struct

struct اکنون از اعداد ممیز شناور با دقت نصف IEEE 754 از طریق مشخص‌کننده قالب 'e' پشتیبانی می‌کند. (مشارکت‌شده توسط Eli Stevens و Mark Dickinson در bpo-11734.)

subprocess

مخرب subprocess.Popen اکنون در صورتی که فرایند فرزند همچنان در حال اجرا باشد، هشدار ResourceWarning منتشر می‌کند. برای خواندن وضعیت خروج فرایند فرزند، از پروتکل مدیر زمینه (with proc: ...) استفاده کنید یا متد wait() را به‌طور صریح فراخوانی کنید. (ارائه‌شده توسط Victor Stinner در bpo-26741.)

سازنده‌ی subprocess.Popen و تمام توابعی که آرگومان‌ها را به آن منتقل می‌کنند، اکنون آرگومان‌های encoding و errors را می‌پذیرند. مشخص کردن هر یک از این دو، حالت متنی را برای جریان‌های stdin، stdout و stderr فعال می‌کند. (مشارکت‌شده توسط Steve Dower در bpo-6135.)

sys

تابع جدید getfilesystemencodeerrors() نام حالت خطای استفاده‌شده برای تبدیل میان نام پرونده‌های یونیکد و نام پرونده‌های بایتی را برمی‌گرداند. (ارائه‌شده توسط Steve Dower در bpo-27781.)

در ویندوز، مقدار بازگشتی تابع getwindowsversion() اکنون شامل فیلد platform_version است که نسخه‌ی اصلی، نسخه‌ی فرعی و شماره‌ی ساخت دقیق سیستم‌عامل فعلی را در بر می‌گیرد، نه نسخه‌ای که برای فرایند شبیه‌سازی می‌شود (مشارکت توسط Steve Dower در bpo-27932.)

telnetlib

telnetlib.Telnet اکنون یک مدیر زمینه است (مشارکت‌شده توسط Stéphane Wirtel در bpo-25485).

time

ویژگی‌های tm_gmtoff و tm_zone در struct_time اکنون در تمام پلتفرم‌ها در دسترس هستند.

timeit

متد کاربردی جدید Timer.autorange() افزوده شده است تا Timer.timeit() را به‌طور مکرر فراخوانی کند، به‌گونه‌ای که زمان اجرای کل بزرگ‌تر یا مساوی ۲۰۰ میلی‌ثانیه باشد. (مشارکت‌شده توسط استیون دآپرانو در bpo-6422.)

timeit اکنون هشدار می‌دهد زمانی که واریانس قابل‌توجهی (۴ برابر) بین بهترین و بدترین زمان‌ها وجود داشته باشد. (ارائه‌شده توسط Serhiy Storchaka در bpo-23552.)

tkinter

متدهای Variable.trace_add()، Variable.trace_remove() و trace_info() به کلاس tkinter.Variable اضافه شدند. این متدها جایگزین متدهای قدیمی trace_variable()، trace()، trace_vdelete() و trace_vinfo() می‌شوند که از دستورهای منسوخ Tcl استفاده می‌کنند و ممکن است در نسخه‌های آینده Tcl کار نکنند. (مشارکت‌شده توسط Serhiy Storchaka در bpo-22115).

traceback

هم ماژول traceback و هم نمایش توکار استثنا در مفسر، اکنون دنباله‌های طولانی سطرهای تکراری را در ردگیری‌های پشته خلاصه می‌کنند، همان‌طور که در مثال زیر نشان داده شده است:

>>> def f(): f()
...
>>> f()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in f
  File "<stdin>", line 1, in f
  File "<stdin>", line 1, in f
  [Previous line repeated 995 more times]
RecursionError: maximum recursion depth exceeded

(مشارکت Emanuel Barry در bpo-26823.)

tracemalloc

ماژول tracemalloc اکنون از ردگیری تخصیص‌های حافظه در چندین فضای آدرس متفاوت پشتیبانی می‌کند.

کلاس فیلتر جدید DomainFilter برای فیلتر کردن ردگیری‌های بلوک بر اساس فضای آدرس (دامنه) آن‌ها افزوده شده است.

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

typing

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

ماژول typing پشتیبانی بسیار بهبود‌یافته‌ای از مستعارهای نوع عام دارد. برای مثال، Dict[str, Tuple[S, T]] اکنون یک حاشیه‌نویسی نوع معتبر است. (مشارکت‌شده توسط گیدو ون روسوم در Github #195.)

کلاس typing.ContextManager برای نمایش contextlib.AbstractContextManager افزوده شده است. (مشارکت‌شده توسط Brett Cannon در bpo-25609.)

کلاس typing.Collection برای نمایش collections.abc.Collection افزوده شده است. (مشارکت‌شده توسط Ivan Levkivskyi در bpo-27598.)

سازه‌ی نوع typing.ClassVar برای نشانه‌گذاری متغیرهای کلاس افزوده شده است. همان‌طور که در PEP 526 معرفی شد، حاشیه‌نویسی متغیری که در ClassVar دربرگرفته شده است، نشان می‌دهد که ویژگی مورد نظر قرار است به‌عنوان یک متغیر کلاس استفاده شود و نباید روی نمونه‌های آن کلاس تنظیم شود. (مشارکت‌شده توسط Ivan Levkivskyi در Github #280.)

ثابت جدید TYPE_CHECKING که بررسی‌گرهای نوع ایستا آن را True فرض می‌کنند، اما در ران‌تایم False است. (مشارکت‌شده توسط Guido van Rossum در Github #230.)

تابع کمکی جدید NewType() برای ایجاد نوع‌های متمایزِ سبک‌وزن برای حاشیه‌نویسی افزوده شده است:

from typing import NewType

UserId = NewType('UserId', int)
some_id = UserId(524313)

بررسی‌گر نوع ایستا نوع جدید را طوری در نظر خواهد گرفت که گویی زیرکلاسی از نوع اصلی است. (مشارکت Ivan Levkivskyi در Github #189.)

unicodedata

ماژول unicodedata اکنون از داده‌های Unicode 9.0.0 استفاده می‌کند. (مشارکت‌شده توسط Benjamin Peterson.)

unittest.mock

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

  • دو متد جدید، Mock.assert_called() و Mock.assert_called_once() برای بررسی اینکه آیا شیء ماک فراخوانی شده است یا خیر. (مشارکت‌شده توسط آمیت ساها در bpo-26323.)

  • متد Mock.reset_mock() اکنون دو آرگومان اختیاریِ فقط‌کلیدواژه‌ای دارد: return_value و side_effect. (مشارکت‌شده توسط کوشال داس در bpo-21271.)

urllib.request

اگر درخواست HTTP بدنه‌ای از نوع پرونده یا شیء پیمایش‌پذیر (به‌جز شیء بایت) داشته باشد ولی سرآیند Content-Length نداشته باشد، AbstractHTTPHandler به جای خطا دادن، اکنون به استفاده از کدگذاری انتقال بخش‌بندی‌شده روی می‌آورد. (مشارکت‌شده توسط Demian Brecht و Rolf Krahl در bpo-12319.)

urllib.robotparser

RobotFileParser اکنون از افزونه‌های Crawl-delay و Request-rate پشتیبانی می‌کند. (با مشارکت Nikolay Bogoychev در bpo-16099.)

venv

ماژول venv پارامتر جدید --prompt را می‌پذیرد. این پارامتر پیشوندی جایگزین برای محیط مجازی فراهم می‌کند. (پیشنهادشده از سوی Łukasz Balcerzak و منتقل‌شده به 3.6 توسط Stéphane Wirtel در bpo-22829.)

warnings

پارامتر اختیاری جدید source به تابع warnings.warn_explicit() افزوده شده است: شیء نابودشده‌ای که ResourceWarning را منتشر کرده است. ویژگی source نیز به warnings.WarningMessage افزوده شده است (با مشارکت ویکتور استینر در bpo-26568 و bpo-26567).

هنگامی که هشدار ResourceWarning ثبت می‌شود، اکنون از ماژول tracemalloc برای تلاش در بازیابی ردگیری مربوط به جایی که شیء تخریب‌شده در آن تخصیص یافته بود، استفاده می‌شود.

مثالی با اسکریپت example.py:

import warnings

def func():
    return open(__file__)

f = func()
f = None

خروجی فرمان python3.6 -Wd -X tracemalloc=5 example.py:

example.py:7: ResourceWarning: unclosed file <_io.TextIOWrapper name='example.py' mode='r' encoding='UTF-8'>
  f = None
Object allocated at (most recent call first):
  File "example.py", lineno 4
    return open(__file__)
  File "example.py", lineno 6
    f = func()

ردگیری «Object allocated at» جدید است و تنها در صورتی نمایش داده می‌شود که tracemalloc در حال ردگیری تخصیص‌های حافظه پایتون باشد و ماژول warnings از پیش ایمپورت شده باشد.

winreg

نوع عدد صحیح ۶۴ بیتی REG_QWORD اضافه شد. (ارائه‌شده توسط Clement Rouault در bpo-23026.)

winsound

امکان ارسال آرگومان‌های کلیدواژه‌ای به Beep، MessageBeep و PlaySound فراهم شد (bpo-27982).

xmlrpc.client

ماژول xmlrpc.client اکنون از مارشال‌گشایی نوع‌های داده‌ی اضافی استفاده‌شده توسط پیاده‌سازی Apache XML-RPC برای اعداد و None پشتیبانی می‌کند. (با مشارکت Serhiy Storchaka در bpo-26885.)

zipfile

یک متد کلاس جدید ZipInfo.from_file() امکان ساختن یک نمونه‌ی ZipInfo از یک پرونده‌ی سامانه فایل‌بندی را فراهم می‌کند. یک متد جدید ZipInfo.is_dir() را می‌توان برای بررسی اینکه آیا نمونه‌ی ZipInfo یک پوشه را نشان می‌دهد یا نه، به کار برد. (مشارکت‌شده توسط Thomas Kluyver در bpo-26039.)

از متد ZipFile.open() اکنون می‌توان برای نوشتن داده‌ها در یک پرونده‌ی ZIP و همچنین برای استخراج داده‌ها استفاده کرد. (ارائه‌شده توسط Thomas Kluyver در bpo-26039.)

zlib

توابع compress() و decompress() اکنون آرگومان‌های کلیدواژه‌ای را می‌پذیرند. (به ترتیب توسط Aviv Palivoda در bpo-26243 و Xiang Zhang در bpo-16764 مشارکت شده است.)

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

  • مفسر پایتون اکنون به‌جای بایت‌کد از کد واژه‌ای ۱۶ بیتی (wordcode) استفاده می‌کند که امکان انجام تعدادی بهینه‌سازی آپ‌کد را فراهم کرد. (ارائه‌شده توسط Demur Rumed با دریافت ورودی و بازبینی از سوی Serhiy Storchaka و Victor Stinner در bpo-26647 و bpo-28050.)

  • کلاس asyncio.Future اکنون دارای یک پیاده‌سازی بهینه‌شده به زبان C است. (ارائه‌شده توسط Yury Selivanov و INADA Naoki در bpo-26081.)

  • کلاس asyncio.Task اکنون یک پیاده‌سازی بهینه‌شده به زبان C دارد. (مشارکت‌شده توسط Yury Selivanov در bpo-28544.)

  • بهبودهای گوناگون در پیاده‌سازی ماژول typing (مانند نهان‌گذاری نوع‌های عام) امکان بهبود عملکرد تا ۳۰ برابر و کاهش مصرف حافظه را فراهم می‌کنند.

  • کدگشای اسکی اکنون برای هندلرهای خطای surrogateescape، ignore و replace تا ۶۰ برابر سریع‌تر شده است (مشارکت‌شده توسط Victor Stinner در bpo-24870).

  • کدگذارهای اسکی و Latin1 اکنون برای هندلر خطای surrogateescape تا ۳ برابر سریع‌تر شده‌اند (مشارکت‌شده توسط Victor Stinner در bpo-25227).

  • کدگذار UTF-8 اکنون برای هندلرهای خطای ignore، replace، surrogateescape و surrogatepass تا ۷۵ برابر سریع‌تر شده است (مشارکت‌شده توسط Victor Stinner در bpo-25267).

  • کدگشای UTF-8 اکنون برای هندلرهای خطای ignore، replace و surrogateescape تا ۱۵ برابر سریع‌تر شده است (مشارکت‌شده توسط Victor Stinner در bpo-25301).

  • bytes % args اکنون تا ۲ برابر سریع‌تر شده است. (مشارکت: Victor Stinner در bpo-25349).

  • bytearray % args اکنون بین ۲٫۵ و ۵ برابر سریع‌تر شده است. (مشارکت‌شده توسط Victor Stinner در bpo-25399.)

  • bytes.fromhex() و bytearray.fromhex() بهینه‌سازی شدند: این متدها اکنون بین ۲ تا ۳.۵ برابر سریع‌تر هستند. (مشارکت‌شده توسط Victor Stinner در bpo-25401).

  • بهینه‌سازی bytes.replace(b'', b'.') و bytearray.replace(b'', b'.'): تا ۸۰٪ سریع‌تر. (مشارکت‌شده توسط Josh Snider در bpo-26574.)

  • توابع تخصیص‌دهنده‌ی دامنه‌ی PyMem_Malloc() (PYMEM_DOMAIN_MEM) اکنون به جای تابع malloc() کتابخانه‌ی C، از تخصیص‌دهنده حافظه‌ی pymalloc استفاده می‌کنند. تخصیص‌دهنده pymalloc برای اشیاء کوچک‌تر یا مساوی ۵۱۲ بایت با عمر کوتاه بهینه‌شده است و برای بلوک‌های حافظه‌ی بزرگ‌تر از malloc() استفاده می‌کند. (مشارکت‌شده توسط Victor Stinner در bpo-26249).

  • pickle.load() و pickle.loads() اکنون هنگام سریال‌زدایی تعداد زیادی شیء کوچک تا ۱۰٪ سریع‌تر شده‌اند (مشارکت‌شده توسط Victor Stinner در bpo-27056).

  • ارسال آرگومان‌های کلیدواژه‌ای به یک تابع در مقایسه با ارسال آرگومان‌های جایگاهی سرباری دارد. اکنون در توابع توسعه‌ای که با استفاده از Argument Clinic پیاده‌سازی شده‌اند، این سربار به‌طور چشمگیری کاهش یافته است. (مشارکت توسط Serhiy Storchaka در bpo-27574).

  • توابع glob() و iglob() در ماژول glob بهینه‌سازی شدند؛ این توابع اکنون حدود ۳--۶ برابر سریع‌تر هستند. (مشارکت‌شده توسط Serhiy Storchaka در bpo-25596).

  • تطبیق الگو (globbing) در pathlib با استفاده از os.scandir() بهینه‌سازی شد؛ اکنون حدود ۱٫۵ تا ۴ برابر سریع‌تر است. (مشارکت‌شده توسط Serhiy Storchaka در bpo-26032.)

  • کارایی پارس، پیمایش و کپی عمیق در xml.etree.ElementTree به‌طور چشمگیری بهبود یافته است. (مشارکت‌شده توسط Serhiy Storchaka در bpo-25638، bpo-25873 و bpo-25869.)

  • ایجاد نمونه‌های fractions.Fraction از اعداد ممیز شناور و دسیمال (decimal) اکنون ۲ تا ۳ برابر سریع‌تر شده است. (ارائه‌شده توسط Serhiy Storchaka در bpo-25971.)

تغییرات ساخت و API زبان C

  • پایتون اکنون برای ساخت به پشتیبانی از برخی قابلیت‌های C99 در زنجیره ابزار (toolchain) نیاز دارد. قابل‌توجه‌ترین مورد این است که پایتون اکنون به‌جای ماکروهای سفارشی مانند PY_LONG_LONG از نوع‌های عدد صحیح و ماکروهای استاندارد استفاده می‌کند. برای اطلاعات بیشتر، PEP 7 و bpo-17884 را ببینید.

  • کامپایل متقاطع سی‌پایتون با Android NDK، در حالی که سطح API اندروید روی 21 (Android 5.0 Lollipop) یا بالاتر تنظیم‌شده باشد، با موفقیت انجام می‌شود. اگرچه اندروید هنوز پلتفرم پشتیبانی‌شده‌ای نیست، بدنه آزمون‌های پایتون روی شبیه‌ساز اندروید اجرا می‌شود و تنها حدود ۱۶ آزمون شکست می‌خورند. مسئله فرا (meta-issue) اندروید را در bpo-26865 ببینید.

  • پرچم --enable-optimizations به configure اضافه شده است. فعال کردن آن، بهینه‌سازی‌های پرهزینه‌ای مانند PGO را فعال می‌کند. (وصله‌ی اصلی توسط Alecsandru Patrascu از Intel در bpo-26359.)

  • اکنون هنگام فراخوانی توابع تخصیص‌دهنده‌ی دامنه‌های PYMEM_DOMAIN_OBJ (مثلاً PyObject_Malloc()) و PYMEM_DOMAIN_MEM (مثلاً PyMem_Malloc()) باید قفل مفسر سراسری نگه داشته شود.

  • API جدید Py_FinalizeEx() که نشان می‌دهد آیا تخلیه داده‌های بافر‌شده شکست خورده است یا خیر. (مشارکت‌شده توسط Martin Panter در bpo-5319.)

  • PyArg_ParseTupleAndKeywords() اکنون از پارامترهای صرفاً جایگاهی پشتیبانی می‌کند. پارامترهای صرفاً جایگاهی با نام‌های خالی تعریف می‌شوند. (مشارکت‌شده توسط Serhiy Storchaka در bpo-26282).

  • متد PyTraceback_Print اکنون دنباله‌های طولانی از سطرهای تکراری را به‌صورت "[Previous line repeated {count} more times]" خلاصه می‌کند. (مشارکت‌شده توسط Emanuel Barry در bpo-26823.)

  • تابع جدید PyErr_SetImportErrorSubclass() امکان تعیین زیرکلاسی از ImportError برای برانگیختن را فراهم می‌کند. (مشارکت اریک اسنو در bpo-15767.)

  • از تابع جدید PyErr_ResourceWarning() می‌توان برای تولید یک ResourceWarning که منشأ تخصیص منبع را ارائه می‌دهد، استفاده کرد. (مشارکت‌شده توسط Victor Stinner در bpo-26567.)

  • تابع جدید PyOS_FSPath() بازنمایی سامانه فایل‌بندی یک path-like object را برمی‌گرداند. (مشارکت‌شده توسط Brett Cannon در bpo-27186.)

  • توابع PyUnicode_FSConverter() و PyUnicode_FSDecoder() اکنون اشیاء شبه‌مسیر را می‌پذیرند.

بهبودهای دیگر

  • وقتی --version (شکل کوتاه: -V) دو بار ارائه شود، پایتون sys.version را برای اطلاعات دقیق چاپ می‌کند.

    $ ./python -VV
    Python 3.6.0b4+ (3.6:223967b49e49+, Nov 21 2016, 20:55:04)
    [GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]
    

منسوخ

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

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

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

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

اکنون انتظار می‌رود متد __aiter__() مستقیماً یک پیمایش‌گر ناهمگام را بازگرداند، نه اینکه مانند گذشته یک شیء انتظارپذیر بازگرداند. انجام کار نخست یک DeprecationWarning را به‌وجود خواهد آورد. سازگاری با نسخه‌های پیشین در پایتون 3.7 حذف خواهد شد. (مشارکت‌شده توسط Yury Selivanov در bpo-27243.)

جفت بک‌اسلش-نویسه‌ای که دنباله گریز معتبری نیست، اکنون یک DeprecationWarning ایجاد می‌کند. اگرچه این موضوع در نهایت به یک SyntaxError تبدیل خواهد شد، اما این اتفاق تا چندین نسخه‌ی پایتون دیگر رخ نخواهد داد. (مشارکت‌شده توسط Emanuel Barry در bpo-27364.)

هنگام انجام یک ایمپورت نسبی، بازگشت به __name__ و __path__ از ماژول فراخواننده در صورتی که __spec__ یا __package__ تعریف نشده باشند، اکنون یک ImportWarning ایجاد می‌کند. (مشارکت‌شده توسط Rose Ames در bpo-25791.)

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

asynchat

ماژول asynchat به نفع asyncio منسوخ شده است. (مشارکت Mariatta در bpo-25002.)

asyncore

ماژول asyncore به نفع asyncio منسوخ شده است. (ارائه‌شده توسط Mariatta در bpo-25002.)

dbm

برخلاف سایر پیاده‌سازی‌های dbm، ماژول dbm.dumb پایگاه‌های داده را با حالت 'rw' ایجاد می‌کند و اجازه‌ی تغییر پایگاه داده‌ی باز‌شده با حالت 'r' را می‌دهد. این رفتار اکنون منسوخ شده است و در نسخه‌ی 3.8 حذف خواهد شد. (مشارکت‌شده توسط Serhiy Storchaka در bpo-21708.)

distutils

آرگومان مستندنشده‌ی extra_path در سازنده‌ی distutils.Distribution اکنون منسوخ در نظر گرفته می‌شود و در صورت تنظیم، هشداری نشان خواهد داد. پشتیبانی از این پارامتر در نسخه‌های آینده‌ی پایتون حذف خواهد شد. برای جزئیات به bpo-27919 مراجعه کنید.

grp

پشتیبانی از آرگومان‌های غیر از اعداد صحیح در getgrgid() منسوخ شده است. (با مشارکت Serhiy Storchaka در bpo-26129.)

importlib

متدهای importlib.machinery.SourceFileLoader.load_module() و importlib.machinery.SourcelessFileLoader.load_module() اکنون منسوخ شده‌اند. آن‌ها تنها پیاده‌سازی‌های باقی‌مانده‌ی importlib.abc.Loader.load_module() در importlib بودند که در نسخه‌های پیشین پایتون به نفع importlib.abc.Loader.exec_module() منسوخ نشده بودند.

کلاس importlib.machinery.WindowsRegistryFinder اکنون منسوخ شده است. از نسخه‌ی 3.6.0، این کلاس همچنان به‌صورت پیش‌فرض به sys.meta_path اضافه می‌شود (در ویندوز)، اما این امر ممکن است در نسخه‌های آینده تغییر کند.

os

پشتیبانی مستندنشده از اشیای عمومیِ شبه‌بایت به‌عنوان مسیرها در توابع os، compile() و توابع مشابه، اکنون منسوخ شده است. (با مشارکت Serhiy Storchaka در bpo-25791 و bpo-26754.)

re

پشتیبانی از پرچم‌های درون‌خطی (?letters) در میانه‌ی عبارت باقاعده منسوخ شده است و در نسخه‌ی آینده‌ی پایتون حذف خواهد شد. پرچم‌ها در ابتدای عبارت باقاعده همچنان مجاز هستند. (مشارکت‌شده توسط Serhiy Storchaka در bpo-22493.)

ssl

نسخه‌های OpenSSL 0.9.8، 1.0.0 و 1.0.1 منسوخ شده‌اند و دیگر پشتیبانی نمی‌شوند. در آینده، ماژول ssl حداقل به OpenSSL 1.0.2 یا 1.1.0 نیاز خواهد داشت.

آرگومان‌های مرتبط با SSL مانند certfile، keyfile و check_hostname در ftplib، http.client، imaplib، poplib و smtplib به نفع context منسوخ شده‌اند. (مشارکت‌شده توسط Christian Heimes در bpo-28022.)

چند پروتکل و تابع از ماژول ssl اکنون منسوخ شده‌اند. برخی قابلیت‌ها در نسخه‌های آینده OpenSSL دیگر در دسترس نخواهند بود. سایر قابلیت‌ها به نفع API متفاوتی منسوخ شده‌اند. (مشارکت‌شده توسط Christian Heimes در bpo-28022 و bpo-26470.)

tkinter

ماژول tkinter.tix اکنون منسوخ شده است. کاربران tkinter باید به‌جای آن از tkinter.ttk استفاده کنند.

venv

اسکریپت pyvenv به نفع python3 -m venv منسوخ شده است. این کار از سردرگمی درباره‌ی اینکه اسکریپت pyvenv به کدام مفسر پایتون متصل است و در نتیجه کدام مفسر پایتون توسط محیط مجازی استفاده خواهد شد، جلوگیری می‌کند. (با مشارکت Brett Cannon در bpo-25154.)

xml

  • به‌عنوان اقدامی برای کاهش خطر بازیابی DTD و موجودیت‌های خارجی، ماژول‌های xml.dom.minidom و xml.sax دیگر به‌طور پیش‌فرض موجودیت‌های خارجی را پردازش نمی‌کنند. (مشارکت Christian Heimes در gh-61441.)

توابع و نوع‌های منسوخ C API

توابع مستندنشده‌ی PyUnicode_AsEncodedObject()، PyUnicode_AsDecodedObject()، PyUnicode_AsEncodedUnicode() و PyUnicode_AsDecodedUnicode() اکنون منسوخ شده‌اند. به جای آن از API عام مبتنی بر کدک استفاده کنید.

گزینه‌های ساخت منسوخ

پرچم پیکربندی --with-system-ffi اکنون به‌طور پیش‌فرض بر روی سکوهای UNIX غیر از macOS فعال است. می‌توان آن را با استفاده از --without-system-ffi غیرفعال کرد، اما استفاده از این پرچم منسوخ شده و در پایتون 3.7 پذیرفته نخواهد شد. macOS از این تغییر تأثیر نمی‌پذیرد. توجه داشته باشید که بسیاری از توزیع‌کنندگان سیستم‌عامل هنگام ساخت پایتون سیستمی خود، از پرچم --with-system-ffi استفاده می‌کنند.

حذف‌شده

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

  • گریزهای ناشناخته‌ای که از '\' و یک حرف اسکی تشکیل شده‌اند، در عبارت‌های باقاعده اکنون باعث خطا می‌شوند. در قالب‌های جایگزینی برای re.sub() همچنان مجاز هستند، اما منسوخ شده‌اند. پرچم re.LOCALE اکنون فقط با الگوهای دودویی قابل استفاده است.

  • inspect.getmoduleinfo() حذف شد (از سی‌پایتون 3.3 منسوخ شده بود). برای به‌دست‌آوردن نام ماژول برای یک مسیر معین، باید از inspect.getmodulename() استفاده کرد. (مشارکت‌شده توسط یوری سلیوانوف در bpo-13248.)

  • کلاس traceback.Ignore و متد‌های traceback.usage، traceback.modname، traceback.fullmodname، traceback.find_lines_from_code، traceback.find_lines، traceback.find_strings و traceback.find_executable_lines از ماژول traceback حذف شدند. این متد‌ها مستند‌نشده بودند، از پایتون 3.2 منسوخ شده بودند و کارکرد معادل آن‌ها از طریق متد‌های خصوصی در دسترس است.

  • متدهای ساختگی tk_menuBar() و tk_bindForTraversal() در کلاس‌های ابزارک ماژول tkinter حذف شدند (فرمان‌های متناظر Tk از زمان Tk 4.0 منسوخ شده بودند).

  • متد open() از کلاس zipfile.ZipFile دیگر حالت 'U' را پشتیبانی نمی‌کند (از پایتون 3.4 منسوخ شده بود). برای خواندن پرونده‌های متنی فشرده در حالت universal newlines از io.TextIOWrapper استفاده کنید.

  • ماژول‌های بدون مستندات IN، CDROM، DLFCN، TYPES، CDIO و STROPTS حذف شده‌اند. این ماژول‌ها پیش‌تر در پوشه‌های مخصوص پلتفرم Lib/plat-*/ در دسترس بودند، اما دائماً از تاریخ افتاده بودند، در پلتفرم‌های مختلف به‌طور ناسازگار در دسترس بودند و نگهداری نمی‌شدند. اسکریپتی که این ماژول‌ها را ایجاد می‌کرد، همچنان در توزیع کد منبع، در Tools/scripts/h2py.py، در دسترس است.

  • کلاس منسوخ asynchat.fifo حذف شده است.

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

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

تغییرات در رفتار دستور «python»

  • خروجی یک ساخت خاص از پایتون که ماکروهای COUNT_ALLOCS، SHOW_ALLOC_COUNT یا SHOW_TRACK_COUNT در آن تعریف شده‌اند، اکنون به‌صورت پیش‌فرض خاموش است. می‌توان آن را با استفاده از گزینه‌ی -X showalloccount دوباره فعال کرد. اکنون خروجی به‌جای stdout به stderr ارسال می‌شود. (مشارکت‌شده توسط Serhiy Storchaka در bpo-23034.)

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

  • open() دیگر اجازه نمی‌دهد پرچم حالت 'U' با '+' ترکیب شود. (با مشارکت Jeff Balogh و John O'Connor در bpo-2091.)

  • sqlite3 دیگر پیش از دستورهای DDL، یک تراکنش باز را به‌طور ضمنی ثبت نهایی نمی‌کند.

  • در لینوکس، os.urandom() اکنون تا زمانی که استخر آنتروپی urandom سیستم مقدار‌دهی اولیه شود، مسدود می‌ماند تا امنیت افزایش یابد.

  • هنگامی که importlib.abc.Loader.exec_module() تعریف شده باشد، importlib.abc.Loader.create_module() نیز باید تعریف شود.

  • PyErr_SetImportError() اکنون هنگامی که آرگومان msg آن تنظیم نشده باشد، TypeError را تنظیم می‌کند. پیش‌تر تنها NULL برگردانده می‌شد.

  • قالب ویژگی co_lnotab در اشیاء کد تغییر کرد تا از دلتای منفی شماره سطر پشتیبانی کند. به‌طور پیش‌فرض، پایتون بایت‌کدی با دلتای منفی شماره سطر تولید نمی‌کند. توابعی که از frame.f_lineno، PyFrame_GetLineNumber() یا PyCode_Addr2Line() استفاده می‌کنند، تحت تأثیر قرار نمی‌گیرند. توابعی که مستقیماً co_lnotab را کدگشایی می‌کنند، باید به‌روزرسانی شوند تا برای دلتای شماره سطر از نوع عدد صحیح ۸ بیتی علامت‌دار استفاده کنند، اما این کار تنها برای پشتیبانی از برنامه‌هایی که از دلتای منفی شماره سطر استفاده می‌کنند، لازم است. برای اطلاع از قالب co_lnotab و نحوه‌ی کدگشایی آن، Objects/lnotab_notes.txt را ببینید، و برای اطلاع از دلایل آن، PEP 511 را ببینید.

  • توابع ماژول compileall اکنون به جای 1 یا 0 که به ترتیب موفقیت یا شکست را نشان می‌دادند، مقدار بولی برمی‌گردانند. از آنجا که بولی‌ها زیرکلاسی از اعداد صحیح هستند، این تنها در صورتی مشکل‌ساز خواهد بود که در حال انجام بررسی‌های هویت برای 1 یا 0 بوده باشید. به bpo-25768 مراجعه کنید.

  • خواندن ویژگی port از نتایج urllib.parse.urlsplit() و urlparse() اکنون برای مقادیر خارج از محدوده استثنای ValueError ایجاد می‌کند، به‌جای بازگرداندن None. به bpo-20059 مراجعه کنید.

  • ماژول imp اکنون به‌جای PendingDeprecationWarning، DeprecationWarning ایجاد می‌کند.

  • APIهای مفقود به ویژگی‌های __all__ ماژول‌های زیر اضافه شده‌اند تا با APIهای مستند مطابقت داشته باشند: calendar، cgi، csv، ElementTree، enum، fileinput، ftplib، logging، mailbox، mimetypes، optparse، plistlib، smtpd، subprocess، tarfile، threading و wave. این بدان معناست که ماژول‌های مذکور هنگام استفاده از import * نمادهای جدیدی را اکسپورت خواهند کرد. (مشارکت‌شده توسط Joel Taddei و Jacek Kołodziej در bpo-23883.)

  • هنگام انجام ایمپورت نسبی، اگر __package__ در مقایسه با __spec__.parent برابر نباشد، استثنای ImportWarning ارائه می‌شود. (با مشارکت Brett Cannon در bpo-25791.)

  • هنگامی که یک ایمپورت نسبی انجام شود و هیچ بسته والدی شناخته‌نشده باشد، استثنای ImportError مطرح خواهد شد. پیش از این، ممکن بود استثنای SystemError مطرح شود. (مشارکت‌شده توسط Brett Cannon در bpo-18018.)

  • سرورهای مبتنی بر ماژول socketserver، از جمله سرورهایی که در http.server، xmlrpc.server و wsgiref.simple_server تعریف شده‌اند، اکنون فقط استثنا‌های مشتق از Exception را می‌گیرند. بنابراین اگر هندلر درخواست استثنایی مانند SystemExit یا KeyboardInterrupt ایجاد کند، handle_error() دیگر فراخوانی نمی‌شود و استثنا سرور تک‌نخی را متوقف می‌کند. (مشارکت‌شده توسط Martin Panter در bpo-23430.)

  • spwd.getspnam() اکنون اگر کاربر دارای امتیاز نباشد، به جای KeyError استثنای PermissionError ایجاد می‌کند.

  • متد socket.socket.close() اکنون در صورتی که خطایی (مثلاً EBADF) توسط فراخوانی سیستمی زیرین گزارش شده باشد، استثنا ایجاد می‌کند. (مشارکت‌شده توسط مارتین پانتر در bpo-26685.)

  • آرگومان decode_data برای سازنده‌های smtpd.SMTPChannel و smtpd.SMTPServer اکنون به‌طور پیش‌فرض False است. این بدان معناست که آرگومان ارسال‌شده به process_message() اکنون به‌طور پیش‌فرض یک شیء بایت است و آرگومان‌های کلیدواژه‌ای به process_message() ارسال خواهند شد. کدی که پیش‌تر مطابق با هشدار منسوخ‌شدن تولیدشده توسط 3.5 به‌روزرسانی شده است، تحت تأثیر قرار نخواهد گرفت.

  • تمام آرگومان‌های اختیاری توابع dump()، dumps()، load() و loads() و سازنده‌های کلاس‌های JSONEncoder و JSONDecoder در ماژول json اکنون فقط‌کلیدواژه‌ای هستند. (مشارکت‌شده توسط Serhiy Storchaka در bpo-18726.)

  • زیرکلاس‌هایی از type که type.__new__ را بازتعریف نمی‌کنند، دیگر نمی‌توانند از شکل تک‌آرگومانی برای به‌دست آوردن نوع یک شیء استفاده کنند.

  • به‌عنوان بخشی از PEP 487، مدیریت آرگومان‌های کلیدواژه‌ای که به type ارسال می‌شوند (به‌جز راهنمای فراکلاس، یعنی metaclass)، اکنون به‌طور یکسان به object.__init_subclass__() واگذار می‌شود. این بدان معناست که type.__new__ و type.__init__ هر دو اکنون آرگومان‌های کلیدواژه‌ای دلخواه را می‌پذیرند، اما object.__init_subclass__() (که از type.__new__ فراخوانی می‌شود) به‌طور پیش‌فرض آن‌ها را رد می‌کند. فراکلاس‌های سفارشی که آرگومان‌های کلیدواژه‌ای اضافی را می‌پذیرند، باید فراخوانی‌های خود به type.__new__ (چه مستقیم و چه از طریق super) را متناسب با این موضوع تنظیم کنند.

  • در distutils.command.sdist.sdist، ویژگی default_format حذف شده است و دیگر اعمال نمی‌شود. در عوض، قالب tar فشرده‌شده با gzip در همه‌ی پلتفرم‌ها پیش‌فرض است و هیچ انتخاب مخصوص به پلتفرم انجام نمی‌شود. در محیط‌هایی که توزیع‌ها روی ویندوز ساخته می‌شوند و توزیع‌های zip مورد نیاز هستند، پروژه را با یک پرونده‌ی setup.cfg حاوی موارد زیر پیکربندی کنید:

    [sdist]
    formats=zip
    

    این رفتار همچنین توسط Setuptools 26.0.0 به نسخه‌های قدیمی‌تر پایتون بک‌پورت شده است.

  • در ماژول urllib.request و متد http.client.HTTPConnection.request()، اگر هیچ فیلد سرآیند Content-Length مشخص نشده باشد و بدنه درخواست یک شیء پرونده باشد، اکنون با کدگذاری بخش‌بندی‌شده HTTP 1.1 ارسال می‌شود. اگر لازم باشد یک شیء پرونده به یک سرور HTTP 1.0 ارسال شود، مقدار Content-Length اکنون باید توسط فراخوان‌کننده مشخص شود. (مشارکت‌کرده توسط Demian Brecht و Rolf Krahl با اصلاحاتی از Martin Panter در bpo-12319.)

  • DictReader اکنون ردیف‌هایی از نوع OrderedDict برمی‌گرداند. (مشارکت‌شده توسط Steve Holden در bpo-27842.)

  • crypt.METHOD_CRYPT در صورتی که توسط پلتفرم پشتیبانی نشود، دیگر به crypt.methods اضافه نمی‌شود. (مشارکت‌شده توسط Victor Stinner در bpo-25287.)

  • آرگومان‌های verbose و rename برای namedtuple() اکنون فقط کلیدواژه‌ای هستند. (مشارکت‌شده توسط Raymond Hettinger در bpo-25628.)

  • در لینوکس، ctypes.util.find_library() اکنون در LD_LIBRARY_PATH به دنبال کتابخانه‌های اشتراکی می‌گردد. (مشارکت‌شده توسط Vinay Sajip در bpo-9998.)

  • کلاس imaplib.IMAP4 اکنون پرچم‌های حاوی نویسه ']' را در پیام‌های ارسال‌شده از سمت سرور مدیریت می‌کند تا سازگاری در دنیای واقعی بهبود یابد. (مشارکت‌شده توسط Lita Cho در bpo-21815.)

  • تابع mmap.mmap.write() اکنون مانند سایر متدهای نوشتن، تعداد بایت‌های نوشته‌شده را برمی‌گرداند. (مشارکت‌شده توسط Jakub Stasiak در bpo-26335.)

  • توابع pkgutil.iter_modules() و pkgutil.walk_packages() اکنون تاپل‌های نام‌دار ModuleInfo را برمی‌گردانند. (مشارکت‌شده توسط Ramchandra Apte در bpo-17211.)

  • تابع re.sub() اکنون حتی اگر الگو در رشته یافت نشود، برای ارجاع‌های عددی نامعتبر گروه در قالب‌های جایگزینی خطا ایجاد می‌کند. پیام خطای ارجاع‌های نامعتبر گروه اکنون شامل اندیس گروه و موقعیت ارجاع است. (مشارکت‌شده توسط SilentGhost و Serhiy Storchaka در bpo-25953.)

  • zipfile.ZipFile اکنون برای مقادیر فشرده‌سازی ناشناخته NotImplementedError ایجاد می‌کند. پیش‌تر یک RuntimeError ساده ایجاد می‌شد. علاوه بر این، فراخوانی متدهای ZipFile روی یک ZipFile بسته‌شده یا فراخوانی متد write() روی یک ZipFile که با حالت 'r' ایجاد شده است، یک ValueError ایجاد می‌کند. پیش‌تر در این موارد RuntimeError ایجاد می‌شد.

  • هنگامی که فراکلاس‌های سفارشی با super() بدون آرگومان یا ارجاع‌های مستقیم از متدها به متغیر بستار ضمنی __class__ ترکیب شوند، ورودی ضمنی __classcell__ در فضای نام اکنون باید برای مقداردهی اولیه به type.__new__ ارسال شود. عدم انجام این کار در پایتون 3.6 به DeprecationWarning و در پایتون 3.8 به RuntimeError منجر خواهد شد.

  • با معرفی ModuleNotFoundError، ممکن است مصرف‌کنندگان سیستم ایمپورت از جایگزین‌های سیستم ایمپورت انتظار داشته باشند که در موارد مناسب، آن استثنای خاص‌تر را ایجاد کنند، نه ImportError که کمتر خاص است. برای فراهم کردن سازگاری آتی با چنین مصرف‌کنندگانی، پیاده‌سازان سیستم‌های ایمپورت جایگزین که به‌طور کامل __import__() را جایگزین می‌کنند، باید پیاده‌سازی‌های خود را به‌روزرسانی کنند تا در مواردی که یک ماژول به‌هیچ‌وجه یافت نمی‌شود، زیرکلاس جدید را ایجاد کنند. پیاده‌سازان افزونه‌های منطبق بر سیستم ایمپورت پیش‌فرض نباید نیازی به اعمال هیچ تغییری داشته باشند، زیرا سیستم ایمپورت پیش‌فرض در موارد مناسب زیرکلاس جدید را ایجاد خواهد کرد.

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

  • خانواده‌ی تخصیص‌دهنده‌های PyMem_Malloc() اکنون به جای malloc() سیستم، از تخصیص‌دهنده‌ی pymalloc استفاده می‌کند. برنامه‌هایی که بدون در اختیار داشتن قفل مفسر سراسری (GIL) PyMem_Malloc() را فراخوانی می‌کنند، اکنون ممکن است فروپاشی کنند. برای اعتبارسنجی استفاده از تخصیص‌دهنده‌های حافظه در برنامه‌ی خود، متغیر محیطی PYTHONMALLOC را روی debug تنظیم کنید. به bpo-26249 مراجعه کنید.

  • Py_Exit() (و مفسر اصلی) اکنون در صورت شکست در تخلیه داده‌های بافر‌شده، وضعیت خروج را با 120 بازنویسی می‌کنند. به bpo-5319 مراجعه کنید.

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

چندین تغییر عمده در bytecode پایتون 3.6 صورت گرفته است.

  • مفسر پایتون اکنون به‌جای بایت‌کد از کد واژه‌ای ۱۶-بیتی (wordcode) استفاده می‌کند. (مشارکت Demur Rumed به‌همراه نظرات و بازبینی‌های Serhiy Storchaka و Victor Stinner در bpo-26647 و bpo-28050.)

  • آپ‌کد‌های جدید FORMAT_VALUE و BUILD_STRING به‌عنوان بخشی از پیاده‌سازی رشته لفظی قالب‌بندی‌شده. (مشارکت‌شده توسط Eric Smith در bpo-25483 و Serhiy Storchaka در bpo-27078.)

  • آپ‌کد جدید BUILD_CONST_KEY_MAP برای بهینه‌سازی ایجاد دیکشنری‌هایی با کلیدهای ثابت. (ارائه‌شده توسط Serhiy Storchaka در bpo-27140.)

  • کدهای عمل فراخوانی تابع برای کارایی بهتر و پیاده‌سازی ساده‌تر به‌طور اساسی بازطراحی شده‌اند. کدهای عمل MAKE_FUNCTION، CALL_FUNCTION، CALL_FUNCTION_KW و BUILD_MAP_UNPACK_WITH_CALL تغییر داده شده‌اند، کدهای عمل جدید CALL_FUNCTION_EX و BUILD_TUPLE_UNPACK_WITH_CALL افزوده شده‌اند، و کدهای عمل CALL_FUNCTION_VAR، CALL_FUNCTION_VAR_KW و MAKE_CLOSURE حذف شده‌اند. (مشارکت‌شده توسط Demur Rumed در bpo-27095، و Serhiy Storchaka در bpo-27213 و bpo-28257.)

  • آپ‌کد‌های جدید SETUP_ANNOTATIONS و STORE_ANNOTATION برای پشتیبانی از سینتکس جدید حاشیه‌نویسی متغیر اضافه‌شده‌اند. (مشارکت‌شده توسط Ivan Levkivskyi در bpo-27985.)

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

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

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

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

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

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

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

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

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

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

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

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

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

تک‌نمونه PyExc_RecursionErrorInst که بخشی از API عمومی بود حذف شده است، زیرا این‌که اعضای آن هرگز پاک‌سازی نمی‌شوند ممکن است در حین نهایی‌سازی مفسر باعث خطای قطعه‌بندی (segmentation fault) شود. (مشارکت‌شده توسط Xavier de Gaye در bpo-22898 و bpo-30697.)

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

تابع locale.localeconv() اکنون در برخی موارد، locale مربوط به LC_CTYPE را به‌طور موقت به locale مربوط به LC_NUMERIC تنظیم می‌کند. (مشارکت‌شده توسط Victor Stinner در bpo-31900.)

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

ماژول‌های xml.dom.minidom و xml.sax دیگر موجودیت‌های خارجی را به‌طور پیش‌فرض پردازش نمی‌کنند. همچنین gh-61441 را ببینید.

در 3.6.7 ماژول tokenize اکنون هنگامی که ورودی‌ای بدون سطر جدید انتهایی دریافت می‌کند، به‌صورت ضمنی توکن NEWLINE تولید می‌کند. این رفتار اکنون با آنچه توکن‌ساز C به‌صورت داخلی انجام می‌دهد مطابقت دارد. (مشارکت‌شده توسط Ammar Askar در bpo-33899.)

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

به دلیل نگرانی‌های امنیتی قابل‌توجه، پارامتر reuse_address در asyncio.loop.create_datagram_endpoint() دیگر پشتیبانی نمی‌شود. دلیل این امر، رفتار گزینه‌ی سوکت SO_REUSEADDR در UDP است. برای جزئیات بیشتر، مستندات loop.create_datagram_endpoint() را ببینید. (با مشارکت Kyle Stanley، Antoine Pitrou و Yury Selivanov در bpo-37228.)

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

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

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

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

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