تازههای پایتون 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: درکهای ناهمگام.
ماژولهای جدید کتابخانه:
بهبودهای پیادهسازی سیپایتون:
نوع dict بازپیادهسازی شده است تا از نمایش فشردهتری استفاده کند که بر اساس پیشنهادی از Raymond Hettinger و مشابه PyPy dict implementation است. این امر باعث شد دیکشنریها در مقایسه با پایتون 3.5، ۲۰٪ تا ۲۵٪ حافظهی کمتری مصرف کنند.
سفارشیسازی ایجاد کلاس با پروتکل جدید سادهسازی شده است.
ترتیب تعریف ویژگیهای کلاس اکنون حفظ میشود.
ترتیب عناصر در
**kwargsاکنون با ترتیبی مطابقت دارد که آرگومانهای کلیدواژهای به تابع ارسال شدهاند.پشتیبانی از کاوش (probing) برای DTrace و SystemTap اضافه شده است.
متغیر محیطی جدید PYTHONMALLOC اکنون میتواند برای اشکالزدایی خطاهای تخصیص حافظه و دسترسی در مفسر استفاده شود.
بهبودهای چشمگیر در کتابخانه استاندارد:
ماژول
asyncioویژگیهای جدید، بهبودهای چشمگیر در کاربردپذیری و کارایی، و تعداد قابلتوجهی رفع اشکال دریافت کرده است. از پایتون 3.6 به بعد، ماژولasyncioدیگر آزمایشی نیست و API آن پایدار در نظر گرفته میشود.پروتکل مسیر سامانه فایلبندی جدیدی برای پشتیبانی از اشیاء شبهمسیر پیادهسازی شده است. تمام توابع کتابخانه استاندارد که بر روی مسیرها عمل میکنند، برای کار با پروتکل جدید بهروزرسانی شدهاند.
ماژول
datetimeپشتیبانی از رفع ابهام زمان محلی را به دست آورده است.ماژول
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 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__
...
پشتیبانی از کاوشگری (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)