تازههای پایتون 3.7¶
- ویرایشگر:
Elvis Pranskevichus <elvis@magic.io>
این مقاله ویژگیهای جدید پایتون 3.7 را در مقایسه با 3.6 توضیح میدهد. پایتون 3.7 در ۲۷ ژوئن ۲۰۱۸ منتشر شد. برای جزئیات کامل، فهرست تغییرات را ببینید.
خلاصه -- نکات برجسته انتشار¶
ویژگیهای جدید سینتکس:
PEP 563، ارزیابی به تعویقافتادهی حاشیهنویسیهای نوع.
تغییرات نحوی ناسازگار به عقب:
ماژولهای جدید کتابخانه:
قابلیتهای جدید توکار:
PEP 553، تابع جدید
breakpoint().
بهبودهای مدل داده پایتون:
PEP 562، سفارشیسازی دسترسی به ویژگیهای ماژول.
PEP 560، پشتیبانی هستهای برای ماژول typing و نوعهای عام.
ویژگی حفظ ترتیب درج در اشیای dict بهعنوان بخشی رسمی از مشخصات زبان پایتون اعلام شده است (has been declared).
بهبودهای چشمگیر در کتابخانه استاندارد:
ماژول
asyncioویژگیهای جدیدی و بهبودهای چشمگیر در کاربردپذیری و کارایی دریافت کرده است.ماژول
timeپشتیبانی از توابع با دقت نانوثانیه را به دست آورد.
بهبودهای پیادهسازی سیپایتون:
پرهیز از استفاده از اسکی بهعنوان کدگذاری متن پیشفرض:
PEP 552، پروندههای .pyc قطعی
PEP 565، بهبود مدیریت
DeprecationWarning
بهبودهای C API:
PEP 539، API جدید C برای ذخیرهسازی نخمحلی
بهبودهای مستندسازی:
این نسخه شامل بهبودهای عملکرد قابل توجه در بسیاری از حوزهها است. بخش بهینهسازیها آنها را بهتفصیل فهرست میکند.
برای فهرستی از تغییراتی که ممکن است بر سازگاری با نسخههای قبلی پایتون تأثیر بگذارند، لطفاً به بخش انتقال به پایتون 3.7 مراجعه کنید.
قابلیتهای جدید¶
PEP 563: ارزیابی معوق حاشیهنویسیها¶
با ظهور راهنماهای نوع در پایتون، دو مشکل چشمگیر کاربردپذیری در کارکرد حاشیهنویسیهایی که در PEP 3107 افزوده شده و در PEP 526 بیش از پیش پالایش یافته بودند، آشکار شد:
حاشیهنویسیها تنها میتوانستند از نامهایی استفاده کنند که از قبل در محدوده فعلی در دسترس بودند، به عبارت دیگر آنها هیچگونه ارجاع پیشرو را پشتیبانی نمیکردند؛ و
حاشیهنویسی کد منبع اثرات نامطلوبی بر زمان راهاندازی برنامههای پایتون داشت.
هر دوی این مشکلات با به تعویق انداختن ارزیابی حاشیهنویسیها رفع میشوند. بهجای کامپایل کردن کدی که عبارتهای درون حاشیهنویسیها را در زمان تعریفشان اجرا میکند، کامپایلر حاشیهنویسی را به شکل رشتهای معادل درخت سینتکس انتزاعی (AST) عبارت مورد نظر ذخیره میکند. در صورت نیاز، میتوان حاشیهنویسیها را در زمان اجرا با استفاده از typing.get_type_hints() حل کرد. در حالت رایجی که این کار لازم نیست، حاشیهنویسیها ارزانتر ذخیره میشوند (چون مفسر رشتههای کوتاه را درونیسازی (interning) میکند) و زمان راهاندازی را سریعتر میکنند.
از نظر کاربردپذیری، حاشیهنویسیها اکنون از ارجاعهای پیشرو پشتیبانی میکنند و همین امر سینتکس زیر را معتبر میسازد:
class C:
@classmethod
def from_string(cls, source: str) -> C:
...
def validate_b(self, obj: B) -> bool:
...
class B:
...
از آنجا که این تغییر سازگاری را میشکند، لازم است رفتار جدید در پایتون 3.7 به ازای هر ماژول با استفاده از یک ایمپورت __future__ فعال شود:
from __future__ import annotations
این در پایتون 3.10 به پیشفرض تبدیل خواهد شد.
همچنین ملاحظه نمائید
- PEP 563 -- ارزیابی معوق حاشیهنویسیها
PEP نوشته و پیادهسازیشده توسط Łukasz Langa.
PEP 538: اجبار locale C قدیمی¶
یک چالش مداوم در سری پایتون ۳، تعیین راهبرد پیشفرض منطقی برای برخورد با فرض کدگذاری متن «اسکی ۷-بیتی» بوده است؛ فرضی که در حال حاضر استفاده از locale پیشفرض C یا POSIX در پلتفرمهای غیر ویندوزی بر آن دلالت میکند.
PEP 538 رابط خط فرمان پیشفرض مفسر را بهروزرسانی میکند تا آن locale را بهطور خودکار به یک locale موجود مبتنی بر UTF-8 تبدیل کند، همانطور که در مستندات متغیر محیطی جدید PYTHONCOERCECLOCALE شرح داده شده است. تنظیم خودکار LC_CTYPE به این شکل بدین معناست که هم هستهی مفسر و هم افزونههای C که از locale آگاهاند (مانند readline)، استفاده از UTF-8 را بهعنوان کدگذاری متن پیشفرض فرض خواهند کرد، نه اسکی.
تعریف پشتیبانی پلتفرم در PEP 11 نیز بهروزرسانی شده است تا پشتیبانی کامل از مدیریت متن به localeهای مبتنی بر غیراسکی که بهدرستی پیکربندی شدهاند محدود شود.
بهعنوان بخشی از این تغییر، هنگامی که از هر یک از localeهای هدف الزام (coercion) تعریفشده استفاده میشود (در حال حاضر C.UTF-8، C.utf8 و UTF-8)، هندلر خطای پیشفرض برای stdin و stdout اکنون surrogateescape است (بهجای strict). هندلر خطای پیشفرض برای stderr همچنان backslashreplace است، بدون توجه به locale.
اجبار locale (locale coercion) بهطور پیشفرض بیصدا است، اما برای کمک به اشکالزدایی مشکلات یکپارچهسازی که احتمالاً به locale مرتبط هستند، میتوان با تنظیم PYTHONCOERCECLOCALE=warn هشدارهای صریح (که مستقیماً روی stderr منتشر میشوند) را درخواست کرد. این تنظیم همچنین باعث میشود در صورتی که locale قدیمی C هنگام مقداردهی اولیهی هستهی مفسر همچنان فعال باشد، رانتایم پایتون هشداری منتشر کند.
اگرچه اجبار locale در PEP 538 این مزیت را دارد که بر ماژولهای توسعهای (مانند GNU readline) و همچنین فرایندهای فرزند (از جمله آنهایی که برنامههای غیرپایتونی و نسخههای قدیمیتر پایتون را اجرا میکنند) نیز اثر میگذارد، این عیب را دارد که نیازمند آن است که locale هدف مناسبی روی سیستم در حال اجرا وجود داشته باشد. برای مدیریت بهتر حالتی که هیچ locale هدف مناسبی در دسترس نیست (همانطور که برای مثال در RHEL/CentOS 7 رخ میدهد)، پایتون 3.7 همچنین PEP 540: حالت اجباری UTF-8 در رانتایم را پیادهسازی میکند.
همچنین ملاحظه نمائید
- PEP 538 -- تبدیل اجباری locale قدیمی C به locale مبتنی بر UTF-8
PEP توسط Nick Coghlan نوشته و پیادهسازیشده است.
PEP 540: حالت اجباری UTF-8 در رانتایم¶
از گزینهی جدید خط فرمان -X utf8 و متغیر محیطی PYTHONUTF8 میتوان برای فعالسازی حالت UTF-8 پایتون استفاده کرد.
در حالت UTF-8، سیپایتون تنظیمات locale را نادیده میگیرد و بهطور پیشفرض از کدگذاری UTF-8 استفاده میکند. هندلرهای خطا برای جریانهای sys.stdin و sys.stdout روی surrogateescape تنظیم میشوند.
از حالت اجباری UTF-8 میتوان برای تغییر رفتار مدیریت متن در یک مفسر پایتون تعبیهشده، بدون تغییر تنظیمات locale برنامهی تعبیهکننده استفاده کرد.
اگرچه حالت UTF-8 PEP 540 این مزیت را دارد که فارغ از اینکه کدام localeها روی سیستم در حال اجرا در دسترس هستند، کار میکند، اما این عیب را دارد که هیچ تأثیری بر ماژولهای توسعهای (مانند GNU readline)، فرایندهای فرزندی که برنامههای غیرپایتونی را اجرا میکنند و فرایندهای فرزندی که نسخههای قدیمیتر پایتون را اجرا میکنند، ندارد. برای کاهش خطر خرابی دادههای متنی هنگام برقراری ارتباط با چنین کامپوننتهایی، پایتون 3.7 همچنین PEP 540: حالت اجباری UTF-8 در رانتایم را پیادهسازی میکند).
حالت UTF-8 بهطور پیشفرض فعال میشود زمانی که locale برابر با C یا POSIX باشد و ویژگی اجبار locale در PEP 538 نتواند آن را به جایگزینی مبتنی بر UTF-8 تغییر دهد (چه این شکست به دلیل تنظیمشدن PYTHONCOERCECLOCALE=0 باشد، چه به دلیل تنظیمشدن LC_ALL، و چه به دلیل نبود locale هدف مناسب).
همچنین ملاحظه نمائید
- PEP 540 -- افزودن حالت جدید UTF-8
PEP (پیشنهاد بهبود پایتون) نوشته و پیادهسازیشده توسط Victor Stinner
PEP 553: تابع توکار breakpoint()¶
پایتون 3.7 تابع توکار جدید breakpoint() را بهعنوان راهی آسان و سازگار برای ورود به اشکالزدای پایتون در بر میگیرد.
تابع توکار breakpoint()، sys.breakpointhook() را فراخوانی میکند. بهصورت پیشفرض، دومی pdb را ایمپورت میکند و سپس pdb.set_trace() را فراخوانی میکند، اما با مقید کردن sys.breakpointhook() به تابع دلخواه خودتان، breakpoint() میتواند وارد هر دیباگری شود. علاوه بر این، میتوان متغیر محیط PYTHONBREAKPOINT را برابر با فراخوانیپذیر دیباگر دلخواه خودتان قرار داد. برای غیرفعالسازی کامل breakpoint() توکار، PYTHONBREAKPOINT=0 را تنظیم کنید.
همچنین ملاحظه نمائید
- PEP 553 -- تابع توکار breakpoint()
PEP (پیشنهاد بهبود پایتون) توسط Barry Warsaw نوشته و پیادهسازی شده است
PEP 539: C API جدید برای ذخیرهسازی نخمحلی¶
در حالی که پایتون یک C API برای پشتیبانی از ذخیرهسازی نخمحلی ارائه میدهد، API ذخیرهسازی نخمحلی (TLS) موجود از int برای نمایش کلیدهای TLS در همهی پلتفرمها استفاده کرده است. این موضوع بهطور کلی برای پلتفرمهای دارای پشتیبانی رسمی مشکلی نبوده است، اما این نه با POSIX سازگار است و نه به هیچ معنای عملی قابل حمل است.
PEP 539 این وضعیت را با فراهم کردن یک API ذخیرهسازی اختصاصی نخ (TSS) جدید برای سیپایتون تغییر میدهد که جایگزین استفاده از API موجود TLS درون مفسر سیپایتون میشود و همزمان API موجود را منسوخ میکند. API مربوط به TSS بهجای int از نوع جدید Py_tss_t برای نمایش کلیدهای TSS استفاده میکند — نوعی مات که تعریف آن ممکن است به پیادهسازی TLS زیرین بستگی داشته باشد. بنابراین، این امر امکان ساخت سیپایتون روی پلتفرمهایی را فراهم میکند که کلید TLS بومی در آنها به شکلی تعریف شده که نمیتوان آن را بهطور ایمن به int تبدیل نوع کرد.
توجه داشته باشید که در سکوهایی که کلید TLS بومی بهگونهای تعریف شده است که نتوان آن را بهطور امن به int قالبریزی کرد، تمام توابع API موجود TLS عملیات بیاثر خواهند بود و بلافاصله شکست را برمیگردانند. این بهوضوح نشان میدهد که API قدیمی در سکوهایی که نمیتوان از آن بهطور قابلاعتماد استفاده کرد، پشتیبانی نمیشود و هیچ تلاشی برای افزودن چنین پشتیبانیای انجام نخواهد شد.
همچنین ملاحظه نمائید
- PEP 539 -- C-API جدید برای ذخیرهسازی نخمحلی در سیپایتون
PEP نوشتهشده توسط Erik M. Bray؛ پیادهسازی توسط Masayuki Yamamoto.
PEP 562: سفارشیسازی دسترسی به ویژگیهای ماژول¶
پایتون 3.7 اجازه میدهد __getattr__() را روی ماژولها تعریف کنید و هرگاه ویژگی ماژول از طریقهای دیگر یافت نشود، آن را فراخوانی میکند. اکنون تعریف __dir__() روی ماژولها نیز مجاز است.
یک مثال نمونه از مواردی که این ممکن است مفید باشد، منسوخسازی ویژگیهای ماژول و بارگذاری تنبل (lazy loading) است.
همچنین ملاحظه نمائید
- PEP 562 -- ماژول
__getattr__و__dir__ PEP نوشتهشده و پیادهسازیشده توسط ایوان لِوکیوسکی
PEP 564: توابع زمانی جدید با وضوح نانوثانیهای¶
وضوح ساعتها در سیستمهای مدرن میتواند از دقت محدودِ عدد ممیز شناوری که تابع time.time() و گونههای آن بازمیگردانند فراتر رود. برای جلوگیری از افت دقت، PEP 564 شش گونهی جدید «نانوثانیهای» از توابع زمانسنج موجود را به ماژول time اضافه میکند:
توابع جدید تعداد نانوثانیهها را به صورت یک مقدار عدد صحیح برمیگردانند.
اندازهگیریها نشان میدهند که در لینوکس و ویندوز، وضوح time.time_ns() تقریباً ۳ برابر بهتر از وضوح time.time() است.
همچنین ملاحظه نمائید
- PEP 564 -- افزودن توابع زمانی جدید با وضوح نانوثانیه
PEP (پیشنهاد بهبود پایتون) نوشته و پیادهسازیشده توسط Victor Stinner
PEP 565: نمایش DeprecationWarning در __main__¶
برخورد پیشفرض با DeprecationWarning بهگونهای تغییر کرده است که این هشدارها یکبار دیگر بهصورت پیشفرض نمایش داده میشوند، اما تنها زمانی که کد فعالکنندهی آنها مستقیماً در ماژول __main__ در حال اجرا باشد. در نتیجه، توسعهدهندگان اسکریپتهای تکپروندهای و کسانی که پایتون را بهصورت تعاملی به کار میبرند، باید دوباره شروع کنند به دیدن هشدارهای منسوخشدن برای APIهایی که استفاده میکنند، اما هشدارهای منسوخشدنی که توسط ماژولهای ایمپورتشدهی برنامه، کتابخانه و چارچوب فعال میشوند، همچنان بهصورت پیشفرض پنهان باقی خواهند ماند.
در نتیجهی این تغییر، کتابخانه استاندارد اکنون به توسعهدهندگان اجازه میدهد تا بین سه رفتار مختلف برای هشدار منسوخشدگی یکی را انتخاب کنند:
FutureWarning: همیشه بهصورت پیشفرض نمایش داده میشود و برای هشدارهایی که در نظر گرفتهشدهاند تا کاربران نهایی برنامه آنها را ببینند، توصیه میشود (مثلاً برای تنظیمات پیکربندی برنامه که منسوخ شدهاند).DeprecationWarning: بهطور پیشفرض فقط در__main__و هنگام اجرای آزمونها نمایش داده میشود؛ برای هشدارهایی که در نظر گرفته شدهاند تا توسط سایر توسعهدهندگان پایتون دیده شوند، در مواردی که ارتقای نسخه ممکن است به تغییر رفتار یا بروز خطا منجر شود، توصیه میشود.PendingDeprecationWarning: بهطور پیشفرض فقط هنگام اجرای آزمونها نمایش داده میشود و برای مواردی در نظر گرفته شده است که ارتقای نسخهی آینده، دستهی هشدار را بهDeprecationWarningیاFutureWarningتغییر خواهد داد.
پیشتر هر دو DeprecationWarning و PendingDeprecationWarning تنها هنگام اجرای آزمونها قابل مشاهده بودند، که این بدان معنا بود که توسعهدهندگانی که عمدتاً اسکریپتهای تکپروندهای مینوشتند یا بهصورت تعاملی از پایتون استفاده میکردند، ممکن بود از تغییرات ناسازگار در APIهایی که به کار میبردند غافلگیر شوند.
همچنین ملاحظه نمائید
- PEP 565 -- نمایش DeprecationWarning در
__main__ PEP (پیشنهاد بهبود پایتون) نوشته و پیادهسازیشده توسط Nick Coghlan
PEP 560: پشتیبانی هستهای از ماژول typing و نوعهای عام¶
در ابتدا، PEP 484 به گونهای طراحی شده بود که هیچ تغییری در هستهی مفسر سیپایتون ایجاد نکند. اکنون راهنماهای نوع و ماژول typing بهطور گسترده توسط کامیونیتی استفاده میشوند، بنابراین این محدودیت برداشته شده است. این PEP دو متد ویژه __class_getitem__() و __mro_entries__() را معرفی میکند؛ این متدها اکنون توسط اکثر کلاسها و ساختارهای ویژه در ماژول typing استفاده میشوند. در نتیجه، سرعت عملیاتهای مختلف با انواع تا ۷ برابر افزایش یافته است، میتوان انواع عام را بدون تعارض فراکلاس به کار برد و چندین اشکال طولانیمدت در ماژول typing رفع شدهاند.
همچنین ملاحظه نمائید
- PEP 560 -- پشتیبانی هستهای از ماژول typing و نوعهای عام
PEP نوشتهشده و پیادهسازیشده توسط ایوان لِوکیوسکی
PEP 552: پروندههای .pyc مبتنی بر هش¶
پایتون بهطور سنتی بهروز بودن پروندههای نهانگاه بایتکد (یعنی پروندههای .pyc) را از طریق مقایسهی فرادادهی منبع (مهر زمانی آخرین تغییر و اندازه) با فرادادهی منبعِ ذخیرهشده در سرآیند پروندهی نهانگاه هنگام تولید آن بررسی کرده است. هرچند مؤثر است، این روش بیاعتبارسازی معایب خود را دارد. هنگامی که مهرهای زمانی سامانه فایلبندی بیش از حد درشت باشند، پایتون ممکن است بهروزرسانیهای منبع را از دست بدهد که این امر باعث سردرگمی کاربر میشود. علاوه بر این، وجود مهر زمانی در پروندهی نهانگاه برای بازتولیدپذیری ساخت و سیستمهای ساخت مبتنی بر محتوا مشکلساز است.
PEP 552 قالب pyc را توسعه میدهد تا بهجای مهر زمانی منبع، از هش پرونده منبع برای بیاعتبارسازی استفاده شود. پروندههای .pyc از این نوع «مبتنی بر هش» نامیده میشوند. بهطور پیشفرض، پایتون همچنان از بیاعتبارسازی مبتنی بر مهر زمانی استفاده میکند و در رانتایم پروندههای .pyc مبتنی بر هش تولید نمیکند. پروندههای .pyc مبتنی بر هش را میتوان با py_compile یا compileall تولید کرد.
پروندههای .pyc مبتنی بر هش در دو گونه ارائه میشوند: بررسیشده و بررسینشده. پایتون پروندههای .pyc مبتنی بر هشِ بررسیشده را در زمان اجرا در برابر پروندههای منبع متناظر اعتبارسنجی میکند، اما این کار را برای pycهای مبتنی بر هشِ بررسینشده انجام نمیدهد. پروندههای .pyc مبتنی بر هشِ بررسینشده بهینهسازی کارایی مفیدی برای محیطهایی هستند که در آنها سیستمی خارج از پایتون (مثلاً سیستم ساخت) مسئول بهروز نگهداشتن پروندههای .pyc است.
برای اطلاعات بیشتر به بیاعتبارسازی بایتکد نهانشده مراجعه کنید.
همچنین ملاحظه نمائید
- PEP 552 -- pycهای قطعی
PEP نوشته و پیادهسازیشده توسط بنجامین پترسون
PEP 545: ترجمههای مستندات پایتون¶
PEP 545 فرایند ایجاد و نگهداری ترجمههای مستندات پایتون را شرح میدهد.
سه ترجمهی جدید افزوده شده است:
ژاپنی: https://docs.python.org/ja/
فرانسوی: https://docs.python.org/fr/
کرهای: https://docs.python.org/ko/
همچنین ملاحظه نمائید
- PEP 545 -- ترجمههای مستندات پایتون
PEP توسط Julien Palard، Inada Naoki و Victor Stinner نوشته و پیادهسازی شده است.
حالت توسعه پایتون (-X dev)¶
میتوان از گزینهی جدید خط فرمان -X dev یا متغیر محیطی جدید PYTHONDEVMODE برای فعال کردن حالت توسعهی پایتون استفاده کرد. در حالت توسعه، پایتون بررسیهای اضافی زمان اجرا را انجام میدهد که فعال کردن آنها بهطور پیشفرض بیش از حد پرهزینه است. برای توضیح کامل، به مستندات حالت توسعهی پایتون مراجعه کنید.
سایر تغییرات زبان¶
به دلیل مشکلی در پیادهسازی، عبارت
awaitو درکهای دارای بندasync forدر عبارتهای داخل رشتههای لفظی قالببندیشده غیرمجاز بودند. در پایتون 3.7 این محدودیت لغو شد.اکنون میتوان بیش از ۲۵۵ آرگومان به یک تابع ارسال کرد، و یک تابع اکنون میتواند بیش از ۲۵۵ پارامتر داشته باشد. (مشارکتشده توسط Serhiy Storchaka در bpo-12844 و bpo-18896.)
bytes.fromhex()وbytearray.fromhex()اکنون تمام نویسههای فاصله سفید اسکی را نادیده میگیرند، نه فقط فاصلهها. (ارائهشده توسط Robert Xiao در bpo-28927.)str،bytesوbytearrayپشتیبانی از متد جدیدisascii()را دریافت کردند که میتوان از آن برای بررسی اینکه آیا یک رشته یا بایتها فقط شامل نویسههای اسکی هستند یا نه، استفاده کرد. (با مشارکت INADA Naoki در bpo-32677.)ImportErrorاکنون هنگامی کهfrom ... import ...شکست میخورد، نام ماژول و مسیر__file__ماژول را نمایش میدهد. (مشارکتشده توسط Matthias Bussonnier در bpo-29546.)اکنون از ایمپورتهای چرخهای که شامل ایمپورتهای مطلق همراه با مقید کردن یک زیرماژول به یک نام هستند، پشتیبانی میشود. (مشارکت Serhiy Storchaka در bpo-30024.)
object.__format__(x, '')اکنون معادلstr(x)است، نهformat(str(self), ''). (با مشارکت Serhiy Storchaka در bpo-28974.)برای پشتیبانی بهتر از ایجاد پویای ردگیریهای پشته،
types.TracebackTypeاکنون میتواند از کد پایتون نمونهسازی شود و ویژگیtb_nextروی ردگیریهای پشته اکنون نوشتنی است. (با مشارکت Nathaniel J. Smith در bpo-30579.)هنگام استفاده از سوئیچ
-m،sys.path[0]اکنون بلافاصله به مسیر کامل پوشهی آغازین بسط داده میشود، بهجای اینکه بهصورت پوشهی خالی باقی بماند (که اجازه میدهد در زمانی که ایمپورت رخ میدهد، ایمپورت از پوشهی کاری جاری انجام شود) (با مشارکت Nick Coghlan در bpo-33053.)میتوان از گزینهی جدید
-Ximporttimeیا متغیر محیطیPYTHONPROFILEIMPORTTIMEبرای نمایش مدتزمان ایمپورت هر ماژول استفاده کرد. (مشارکتشده توسط Inada Naoki در bpo-31415.)
ماژولهای جدید¶
contextvars¶
ماژول جدید contextvars و مجموعهای از APIهای جدید C پشتیبانی از متغیرهای زمینه را معرفی میکنند. متغیرهای زمینه از نظر مفهومی شبیه متغیرهای نخمحلی هستند. برخلاف TLS، متغیرهای زمینه بهدرستی از کد ناهمگام پشتیبانی میکنند.
ماژولهای asyncio و decimal بهروزرسانی شدهاند تا بهصورت پیشفرض از متغیرهای زمینه استفاده کنند و از آنها پشتیبانی کنند. بهویژه، زمینه فعال decimal اکنون در یک متغیر زمینه ذخیره میشود که به عملیات decimal اجازه میدهد در کد ناهمگام با زمینه صحیح کار کنند.
همچنین ملاحظه نمائید
- PEP 567 -- متغیرهای زمینه
PEP نوشته و پیادهسازیشده توسط یوری سلیوانوف
dataclasses¶
دکوراتور جدید @~dataclasses.dataclass راهی برای اعلان دیتاکلاسها فراهم میکند. یک دیتاکلاس ویژگیهای خود را با استفاده از حاشیهنویسیهای متغیر کلاس توصیف میکند. سازنده و سایر متدهای جادویی آن، مانند __repr__()، __eq__() و __hash__() بهطور خودکار تولید میشوند.
مثال:
@dataclass
class Point:
x: float
y: float
z: float = 0.0
p = Point(1.5, 2.5)
print(p) # produces "Point(x=1.5, y=2.5, z=0.0)"
همچنین ملاحظه نمائید
- PEP 557 -- دیتاکلاسها
این PEP (پیشنهاد بهبود پایتون) توسط Eric V. Smith نوشته و پیادهسازی شده است
importlib.resources¶
ماژول جدید importlib.resources چندین API جدید و یک کلاس پایه انتزاعی جدید برای دسترسی به منابع درون بستهها، باز کردن و خواندن آنها فراهم میکند. منابع تقریباً مشابه پروندههای درون بستهها هستند، اما لازم نیست پروندههای واقعی روی سامانه فایلبندی فیزیکی باشند. بارگذارهای ماژول میتوانند تابعی به نام get_resource_reader() ارائه دهند که برای پشتیبانی از این API جدید، نمونهای از importlib.abc.ResourceReader را برمیگرداند. بارگذارهای توکار مسیر پرونده و بارگذارهای پرونده zip هر دو از این پشتیبانی میکنند.
مشارکتشده توسط Barry Warsaw و Brett Cannon در bpo-32248.
همچنین ملاحظه نمائید
importlib_resources -- یک بکپورت در PyPI برای نسخههای قدیمیتر پایتون.
ماژولهای بهبودیافته¶
argparse¶
متد جدید ArgumentParser.parse_intermixed_args() اجازه میدهد گزینهها و آرگومانهای جایگاهی درهمآمیخته شوند. (مشارکتشده توسط paul.j3 در bpo-14191.)
asyncio¶
ماژول asyncio ویژگیهای جدید فراوانی، بهبودهای قابلیت استفاده و بهبودهای کارایی دریافت کرده است. تغییرات قابل توجه عبارتاند از:
میتوان از تابع جدید آزمایشی
asyncio.run()برای اجرای یک همروال از کد همگام، با ایجاد و نابود کردن خودکار حلقه رویداد، استفاده کرد. (مشارکت Yury Selivanov در bpo-32314.)به asyncio پشتیبانی از
contextvarsاضافه شد.loop.call_soon()،loop.call_soon_threadsafe()،loop.call_later()،loop.call_at()وFuture.add_done_callback()یک پارامتر جدید اختیاریِ فقطکلیدواژهای context دارند.وظیفههااکنون زمینهی خود را بهطور خودکار پیگیری میکنند. برای جزئیات بیشتر به PEP 567 مراجعه کنید. (مشارکتشده توسط Yury Selivanov در bpo-32436.)تابع جدید
asyncio.create_task()بهعنوان میانبری برایasyncio.get_event_loop().create_task()اضافه شده است. (مشارکتشده توسط Andrew Svetlov در bpo-32311.)متد جدید
loop.start_tls()میتواند برای ارتقای یک اتصال موجود به TLS استفاده شود. (مشارکتشده توسط Yury Selivanov در bpo-23749.)متد جدید
loop.sock_recv_into()امکان میدهد دادهها را از یک سوکت مستقیماً در بافر ارائهشده بخوانید و بدین ترتیب امکان کاهش کپیهای داده فراهم میشود. (مشارکتشده توسط آنتوان پیترو در bpo-31819.)تابع جدید
asyncio.current_task()نمونهی در حال اجرایTaskرا برمیگرداند، و تابع جدیدasyncio.all_tasks()مجموعهای از تمام نمونههایTaskموجود در یک حلقهی مشخص را برمیگرداند. متدهایTask.current_task()وTask.all_tasks()منسوخ شدهاند. (ارائهشده توسط Andrew Svetlov در bpo-32250.)کلاس جدید آزمایشی
BufferedProtocolامکان پیادهسازی پروتکلهای جریانی با کنترل دستی بر بافر دریافت را فراهم میکند. (مشارکتشده توسط یوری سلیوانوف در bpo-32251.)تابع جدید
asyncio.get_running_loop()حلقهی در حال اجرا را برمیگرداند و اگر هیچ حلقهای در حال اجرا نباشد، استثنایRuntimeErrorرا ایجاد میکند. این برخلافasyncio.get_event_loop()است که در صورت نبود حلقه در حال اجرا، یک حلقه رویداد جدید ایجاد میکند. (مشارکتشده توسط یوری سلیوانوف در bpo-32269.)متد همروال جدید
StreamWriter.wait_closed()اجازه میدهد منتظر بمانید تا نوشتارگر جریان (stream writer) بسته شود. متد جدیدStreamWriter.is_closing()را میتوان برای تشخیص اینکه نوشتارگر در حال بسته شدن است یا خیر، به کار برد. (مشارکتشده توسط Andrew Svetlov در bpo-32391.)متد همروال جدید
loop.sock_sendfile()اجازه میدهد پروندهها در صورت امکان با استفاده ازos.sendfileارسال شوند. (مشارکتشده توسط Andrew Svetlov در bpo-32410.)متدهای جدید
Future.get_loop()وTask.get_loop()نمونهی حلقهای را برمیگردانند که یک وظیفه یا آیندهنما در آن ایجاد شده است.Server.get_loop()امکان انجام همین کار را برای اشیاءasyncio.Serverفراهم میکند. (مشارکتشده توسط یوری سلیوانوف در bpo-32415 و سرینیواس ردی تاتیپارتی در bpo-32418.)اکنون میتوان کنترل کرد که نمونههای
asyncio.Serverچگونه سرویسدهی را آغاز میکنند. پیشتر، سرور بلافاصله پس از ایجاد، شروع به سرویسدهی میکرد. از آرگومان کلیدواژهای جدید start_serving درloop.create_server()وloop.create_unix_server()، و همچنین ازServer.start_serving()وServer.serve_forever()میتوان برای جدا کردن نمونهسازی سرور از سرویسدهی استفاده کرد. متد جدیدServer.is_serving()در صورتی که سرور در حال سرویسدهی باشد، مقدارTrueرا برمیگرداند. اشیاءServerاکنون مدیرهای زمینه ناهمگام هستند:srv = await loop.create_server(...) async with srv: # some code # At this point, srv is closed and no longer accepts new connections.
(مشارکتشده توسط Yury Selivanov در bpo-32662.)
شیءهای کالبکِ بازگرداندهشده توسط
loop.call_later()متد جدیدwhen()را به دست آوردند که یک مهر زمانی مطلق برای کالبکِ زمانبندیشده برمیگرداند. (مشارکت دادهشده توسط Andrew Svetlov در bpo-32741.)به متد
loop.create_datagram_endpoint()پشتیبانی از سوکتهای Unix اضافه شد. (مشارکتشده توسط Quentin Dawans در bpo-31245.)توابع
asyncio.open_connection()وasyncio.start_server()، متدهایloop.create_connection()،loop.create_server()وloop.create_accepted_socket()و گونههای متناظر آنها برای سوکتهای یونیکس، اکنون آرگومان کلیدواژهای ssl_handshake_timeout را میپذیرند. (با مشارکت نیل آسپینال در bpo-29970.)متد جدید
Handle.cancelled()در صورتی که کالبک لغوشده باشد،Trueرا برمیگرداند. (مشارکتشده توسط Marat Sharafutdinov در bpo-31943.)کد منبع asyncio به استفاده از سینتکس
async/awaitتبدیل شده است. (مشارکتشده توسط Andrew Svetlov در bpo-32193.)میتوان از متد جدید
ReadTransport.is_reading()برای تعیین وضعیت خواندن ترنسپورت استفاده کرد. علاوه بر این، فراخوانیهایReadTransport.resume_reading()وReadTransport.pause_reading()اکنون همتوان هستند. (مشارکتشده توسط Yury Selivanov در bpo-32356.)متدهای حلقه که مسیرهای سوکت را میپذیرند، اکنون از گذراندن اشیاء شبهمسیر پشتیبانی میکنند. (مشارکتشده توسط Yury Selivanov در bpo-32066.)
در
asyncio، سوکتهای TCP در لینوکس اکنون بهصورت پیشفرض با پرچمTCP_NODELAYفعال ایجاد میشوند. (با مشارکت Yury Selivanov و Victor Stinner در bpo-27456.)استثناهای رخداده در وظیفههای لغوشده دیگر گزارش نمیشوند. (مشارکتشده توسط یوری سلیوانوف در bpo-30508.)
کلاسهای جدید
WindowsSelectorEventLoopPolicyوWindowsProactorEventLoopPolicy. (مشارکتشده توسط Yury Selivanov در bpo-33792.)
چندین API از asyncio منسوخ شدهاند.
binascii¶
تابع b2a_uu() اکنون یک آرگومان کلیدواژهای اختیاری بکتیک (backtick) را میپذیرد. زمانی که مقدار آن درست باشد، صفرها بهجای فاصله، با '`' نمایش داده میشوند. (مشارکتشده توسط Xiang Zhang در bpo-30103.)
calendar¶
کلاس HTMLCalendar دارای ویژگیهای کلاس جدیدی است که سفارشیسازی کلاسهای CSS در گاهشماری HTML تولیدشده را آسان میکنند. (مشارکت Oz Tiram در bpo-30095.)
collections¶
collections.namedtuple() اکنون از مقادیر پیشفرض پشتیبانی میکند. (مشارکتشده توسط Raymond Hettinger در bpo-32320.)
compileall¶
compileall.compile_dir() پارامتر جدید invalidation_mode را دریافت کرد که میتوان از آن برای فعالسازی باطلسازی pyc مبتنی بر هش استفاده کرد. حالت باطلسازی همچنین میتواند در خط فرمان با استفاده از آرگومان جدید --invalidation-mode مشخص شود. (مشارکت Benjamin Peterson در bpo-31650.)
concurrent.futures¶
ProcessPoolExecutor و ThreadPoolExecutor اکنون از آرگومانهای جدید سازنده initializer و initargs پشتیبانی میکنند. (مشارکتشده توسط Antoine Pitrou در bpo-21423.)
ProcessPoolExecutor اکنون میتواند زمینهی multiprocessing را از طریق آرگومان جدید mp_context دریافت کند. (مشارکت Thomas Moreau در bpo-31540.)
contextlib¶
nullcontext() جدید، یک مدیر زمینهی عملیات بیاثر سادهتر و سریعتر از ExitStack است. (ارائهشده توسط Jesse-Bakker در bpo-10049.)
@~contextlib.asynccontextmanager، AbstractAsyncContextManager و AsyncExitStack جدید برای تکمیل همتاهای همگام خود افزوده شدهاند. (با مشارکت Jelle Zijlstra در bpo-29679 و bpo-30241، و Alexander Mohr و Ilya Kulakov در bpo-29302.)
cProfile¶
خط فرمان cProfile اکنون -m module_name را بهعنوان جایگزینی برای مسیر اسکریپت میپذیرد. (مشارکتشده توسط Sanyam Khurana در bpo-21862.)
crypt¶
ماژول crypt اکنون از روش هش Blowfish پشتیبانی میکند. (ارائهشده توسط Serhiy Storchaka در bpo-31664.)
تابع mksalt() اکنون امکان تعیین تعداد دورها برای هشکردن را فراهم میکند. (مشارکتشده توسط Serhiy Storchaka در bpo-31702.)
datetime¶
متد جدید datetime.fromisoformat() یک شیء datetime را از رشتهای در یکی از قالبهایی که datetime.isoformat() خروجی میدهد، میسازد. (مشارکت Paul Ganssle در bpo-15873.)
کلاس tzinfo اکنون از آفستهای کمتر از دقیقه پشتیبانی میکند. (مشارکت Alexander Belopolsky در bpo-5288.)
dbm¶
dbm.dumb اکنون از خواندن پروندههای فقطخواندنی پشتیبانی میکند و وقتی پرونده اندیس تغییر نکرده باشد، دیگر آن را نمینویسد.
decimal¶
ماژول decimal اکنون از متغیرهای زمینه برای ذخیرهسازی زمینه decimal استفاده میکند. (مشارکتشده توسط Yury Selivanov در bpo-32630.)
dis¶
تابع dis() اکنون میتواند اشیاء کد تودرتو را واسازی کند (کد درکها، عبارتهای تولیدگر و توابع تودرتو، و کدی که برای ساخت کلاسهای تودرتو استفاده میشود). حداکثر عمق بازگشت واسازی توسط پارامتر جدید depth کنترل میشود. (مشارکت Serhiy Storchaka در bpo-11822.)
distutils¶
README.rst اکنون در فهرست READMEهای استاندارد distutils قرار گرفته و بنابراین در توزیعهای منبع نیز گنجانده میشود. (با مشارکت Ryan Gonzalez در bpo-11913.)
enum¶
کلاس Enum ویژگی کلاس جدید _ignore_ را دریافت کرد که امکان فهرستکردن نام ویژگیهایی را فراهم میکند که نباید عضو enum شوند. (ارائهشده توسط Ethan Furman در bpo-31801.)
در پایتون 3.8، تلاش برای بررسی وجود اشیاء غیر Enum در کلاسهای Enum باعث بالا آمدن TypeError میشود (مثلاً 1 in Color)؛ به طور مشابه، تلاش برای بررسی وجود اشیاء غیر Flag در یک عضو Flag باعث بالا آمدن TypeError میشود (مثلاً 1 in Perm.RW)؛ در حال حاضر، هر دو عملیات به جای آن مقدار False را برمیگردانند و منسوخ شدهاند. (مشارکتشده توسط Ethan Furman در bpo-33217.)
functools¶
@functools.singledispatch اکنون از ثبت پیادهسازیها با استفاده از حاشیهنویسی نوع پشتیبانی میکند. (مشارکت از سوی Łukasz Langa در bpo-32227.)
gc¶
تابع جدید gc.freeze() اجازه میدهد تمام اشیاء پیگیریشده توسط زبالهروب فریزشده و از زبالهروبیهای آینده مستثنا شوند. از این قابلیت میتوان پیش از فراخوانی fork() در POSIX برای سازگار کردن GC با کپی هنگام نوشتن (copy-on-write) یا برای سرعت بخشیدن به زبالهروبی استفاده کرد. تابع جدید gc.unfreeze() این عملیات را معکوس میکند. علاوه بر این، میتوان از gc.get_freeze_count() برای به دست آوردن تعداد اشیاء فریزشدهشده استفاده کرد. (مشارکتشده توسط Li Zekun در bpo-31558.)
hmac¶
ماژول hmac اکنون یک تابع یکبارهی بهینهشدهی digest() دارد که تا سه برابر سریعتر از HMAC() است. (مشارکتشده توسط کریستین هایمز در bpo-32433.)
http.client¶
HTTPConnection و HTTPSConnection اکنون از آرگومان جدید blocksize برای بهبود توان عملیاتی بارگذاری پشتیبانی میکنند. (مشارکتشده توسط Nir Soffer در bpo-31945.)
http.server¶
SimpleHTTPRequestHandler اکنون از سرآیند If-Modified-Since در HTTP پشتیبانی میکند. اگر پروندهی هدف پس از زمان مشخصشده در سرآیند تغییری نکرده باشد، سرور وضعیت پاسخ 304 را برمیگرداند. (مشارکت Pierre Quentel در bpo-29654.)
SimpleHTTPRequestHandler علاوه بر آرگومان جدید خط فرمان --directory، آرگومان جدید directory را نیز میپذیرد. با این پارامتر، سرور پوشهی مشخصشده را ارائه میدهد؛ بهطور پیشفرض از پوشهی کاری جاری استفاده میکند. (مشارکتشده توسط Stéphane Wirtel و Julien Palard در bpo-28707.)
کلاس جدید ThreadingHTTPServer با بهرهگیری از ThreadingMixIn، از نخها برای رسیدگی به درخواستها استفاده میکند. این کلاس زمانی استفاده میشود که http.server با -m اجرا شود. (مشارکت Julien Palard در bpo-31639.)
idlelib و IDLE¶
چندین اصلاح برای تکمیل خودکار. (مشارکتشده توسط Louie Lu در bpo-15786.)
مرورگر ماژول (Module Browser) (در منوی File، که پیشتر مرورگر کلاس (Class Browser) نامیده میشد) اکنون علاوه بر توابع و کلاسهای سطح بالا، توابع و کلاسهای تودرتو را نیز نمایش میدهد. (مشارکتشده توسط Guilherme Polo، Cheryl Sabella و Terry Jan Reedy در bpo-1612262.)
گفتوگوی تنظیمات (Options, Configure IDLE) تا حدی بازنویسی شده است تا هم ظاهر و هم عملکرد آن بهبود یابد. (مشارکت Cheryl Sabella و Terry Jan Reedy در چندین مسئله .)
نمونه قلم اکنون شامل گزیدهای از نویسههای غیرلاتین است تا کاربران بتوانند اثر انتخاب یک قلم خاص را بهتر ببینند. (مشارکتشده توسط Terry Jan Reedy در bpo-13802.) نمونه را میتوان ویرایش کرد تا نویسههای دیگری را نیز در بر بگیرد. (مشارکتشده توسط Serhiy Storchaka در bpo-31860.)
قابلیتهای IDLE که پیشتر بهصورت افزونه پیادهسازی شده بودند، بهعنوان قابلیتهای عادی بازپیادهسازی شدهاند. تنظیمات آنها از زبانهی افزونهها به زبانههای دیگر کادر گفتوگو منتقل شدهاند. (مشارکتشده توسط Charles Wohlganger و Terry Jan Reedy در bpo-27099.)
گزینهی زمینه کد ویرایشگر بازنگری شد. جعبه، تمام سطرهای زمینه را تا maxlines نمایش میدهد. با کلیک روی یک سطر زمینه، ویرایشگر به آن سطر پرش میکند. رنگهای زمینه برای پوستههای سفارشی به زبانهی برجستهسازی (Highlights) در گفتوگوی تنظیمات اضافه شد. (مشارکتشده توسط Cheryl Sabella و Terry Jan Reedy در bpo-33642، bpo-33768 و bpo-33679.)
در ویندوز، یک فراخوانی API جدید به ویندوز اعلام میکند که tk مقیاسبندی DPI را انجام میدهد. در Windows 8.1+ یا 10، در صورتی که ویژگیهای سازگاری DPI دودویی پایتون بدون تغییر باشد و وضوح نمایشگر بیشتر از 96 DPI باشد، این کار باید متن و سطرها را واضحتر کند. در غیر این صورت نباید هیچ تأثیری داشته باشد. (مشارکتشده توسط Terry Jan Reedy در bpo-33656.)
جدید در نسخه 3.7.1:
خروجی بیش از N سطر (بهطور پیشفرض ۵۰) در یک دکمه جمع میشود. مقدار N را میتوان در بخش PyShell از صفحهی عمومی در گفتوگوی تنظیمات تغییر داد. سطرهای کمتر — اما احتمالاً بسیار بلند — را میتوان با کلیک راست روی خروجی جمع کرد. خروجی جمعشده را میتوان با دوبار کلیک روی دکمه در جای خود باز کرد، یا با کلیک راست روی دکمه به کلیپبورد یا یک پنجرهی جداگانه منتقل کرد. (مشارکت Tal Einat در bpo-1529353.)
تغییرات بالا به نسخههای نگهداری 3.6 بکپورت شدهاند .
جدید در 3.7.4:
گزینهی «Run Customized» به منوی Run افزوده شد تا بتوان یک ماژول را با تنظیمات سفارشی اجرا کرد. هر آرگومان خط فرمانی که وارد شود به sys.argv افزوده میشود. این آرگومانها برای اجرای سفارشی بعدی دوباره در جعبه ظاهر میشوند. همچنین میتوان از راهاندازی مجدد عادی ماژول اصلی Shell جلوگیری کرد. (با مشارکت Cheryl Sabella، Terry Jan Reedy و دیگران در bpo-5680 و bpo-37627.)
تازه در نسخهی 3.7.5:
افزودن شماره سطرهای اختیاری برای پنجرههای ویرایشگر IDLE. پنجرهها بدون شماره سطر باز میشوند، مگر آنکه در زبانهی General گفتوگوی پیکربندی خلاف آن تنظیم شود. شماره سطرهای یک پنجرهی موجود از طریق منوی Options نمایش داده و پنهان میشوند. (مشارکتشده توسط Tal Einat و Saimadhav Heblikar در bpo-17535.)
importlib¶
کلاس پایه انتزاعی importlib.abc.ResourceReader برای پشتیبانی از بارگذاری منابع از بستهها معرفی شد. همچنین importlib.resources را ببینید. (مشارکت از Barry Warsaw و Brett Cannon در bpo-32248.)
تابع importlib.reload() اکنون در صورتی که ماژول مشخصهای نداشته باشد، استثنای ModuleNotFoundError را ایجاد میکند. (مشارکتشده توسط Garvit Khatri در bpo-29851.)
importlib.util.find_spec() اکنون اگر ماژول والدِ مشخصشده یک بسته نباشد (یعنی فاقد ویژگی __path__ باشد)، به جای AttributeError استثنای ModuleNotFoundError ایجاد میکند. (مشارکتشده توسط Milan Oberkirch در bpo-30436.)
importlib.util.source_hash() جدید میتواند برای محاسبهی هش کد منبع پاسدادهشده استفاده شود. پروندهی .pyc مبتنی بر هش مقدار بازگرداندهشده توسط این تابع را تعبیه میکند.
io¶
از متد جدید TextIOWrapper.reconfigure() میتوان برای بازپیکربندی جریان متنی با تنظیمات جدید استفاده کرد. (مشارکتشده توسط Antoine Pitrou در bpo-30526 و INADA Naoki در bpo-15216.)
ipaddress¶
میتوان از متدهای جدید subnet_of() و supernet_of() در ipaddress.IPv6Network و ipaddress.IPv4Network برای آزمونهای احاطه شبکه استفاده کرد. (مشارکتشده توسط میشل آلبرت و شریل سابلا در bpo-20825.)
itertools¶
itertools.islice() اکنون شیءهای شبهعدد صحیح را بهعنوان آرگومانهای start، stop و slice میپذیرد. (مشارکتشده توسط Will Roberts در bpo-30537.)
locale¶
آرگومان جدید monetary در locale.format_string() را میتوان برای این منظور به کار برد که تبدیل از جداکنندههای هزارگان پولی و رشتههای گروهبندی استفاده کند. (مشارکتشده توسط Garvit در bpo-10379.)
تابع locale.getpreferredencoding() اکنون همیشه 'UTF-8' را روی اندروید یا در حالت اجباری UTF-8 برمیگرداند.
logging¶
نمونههای Logger اکنون میتوانند پیکل شوند. (مشارکتشده توسط Vinay Sajip در bpo-30520.)
میتوان از متد جدید StreamHandler.setStream() برای جایگزینی جریان گزارشگیر پس از ایجاد هندلر استفاده کرد. (با مشارکت Vinay Sajip در bpo-30522.)
اکنون میتوان در پیکربندیای که به logging.config.fileConfig() ارسال میشود، آرگومانهای کلیدواژهای را برای سازندههای هندلر مشخص کرد. (مشارکت Preston Landers در bpo-31080.)
math¶
تابع جدید math.remainder() عملیات باقیمانده به سبک IEEE 754 را پیادهسازی میکند. (ارائهشده توسط Mark Dickinson در bpo-29962.)
mimetypes¶
نوع MIME مربوط به .bmp از 'image/x-ms-bmp' به 'image/bmp' تغییر کرده است. (نوشتهشده توسط Nitish Chandra در bpo-22589.)
msilib¶
از متد جدید Database.Close() میتوان برای بستن پایگاه داده MSI استفاده کرد. (مشارکتشده توسط Berker Peksag در bpo-20486.)
چندپردازشی (multiprocessing)¶
متد جدید Process.close() بهطور صریح شیء فرایند را میبندد و تمام منابع مرتبط با آن را آزاد میکند. اگر فرایند زیرین هنوز در حال اجرا باشد، ValueError پرتاب میشود. (مشارکت Antoine Pitrou در bpo-30596.)
از متد جدید Process.kill() میتوان برای خاتمه دادن به فرایند با استفاده از سیگنال SIGKILL در یونیکس استفاده کرد. (مشارکتشده توسط Vitor Pereira در bpo-30794.)
نخهای غیر دِیمِنی که توسط Process ایجاد میشوند، اکنون هنگام خروج فرایند پیوست میشوند. (مشارکت آنتوان پیترو در bpo-18966.)
os¶
os.fwalk() اکنون آرگومان path را بهعنوان bytes میپذیرد. (با مشارکت Serhiy Storchaka در bpo-28682.)
به os.scandir() پشتیبانی از توصیفگرهای پرونده افزوده شد. (مشارکت Serhiy Storchaka در bpo-25996.)
تابع جدید register_at_fork() اجازه میدهد کالبکهای پایتون برای اجرا در زمان انشعاب فرایند ثبت شوند. (ارائهشده توسط Antoine Pitrou در bpo-16500.)
توابع os.preadv() (ترکیب کارکرد os.readv() و os.pread()) و os.pwritev() (ترکیب کارکرد os.writev() و os.pwrite()) اضافه شدند. (مشارکت Pablo Galindo در bpo-31368.)
آرگومان حالتِ os.makedirs() دیگر بر بیتهای مجوز پروندهی پوشههای سطح میانی که بهتازگی ایجاد شدهاند اثر نمیگذارد. (مشارکتشده توسط Serhiy Storchaka در bpo-19930.)
os.dup2() اکنون توصیفگر پروندهی جدید را برمیگرداند. پیشتر، None همیشه برگردانده میشد. (مشارکتشده توسط Benjamin Peterson در bpo-32441.)
ساختار بازگرداندهشده توسط os.stat() اکنون در Solaris و مشتقات آن شامل ویژگی st_fstype است. (مشارکتشده توسط Jesús Cea Avión در bpo-32659.)
pathlib¶
متد جدید Path.is_mount() اکنون در سیستمهای POSIX در دسترس است و میتوان از آن برای تعیین اینکه آیا یک مسیر نقطه اتصال (mount point) است یا خیر استفاده کرد. (مشارکتشده توسط Cooper Ry Lees در bpo-30897.)
pdb¶
pdb.set_trace() اکنون یک آرگومان فقطکلیدواژهای اختیاری به نام header میپذیرد. اگر این آرگومان ارائه شود، درست پیش از آغاز اشکالزدایی در کنسول چاپ میشود. (مشارکتشده توسط Barry Warsaw در bpo-31389.)
خط فرمان pdb اکنون -m module_name را بهعنوان جایگزینی برای پرونده اسکریپت میپذیرد. (مشارکتشده توسط Mario Corchero در bpo-32206.)
py_compile¶
py_compile.compile() — و بهتبع آن، compileall — اکنون با ایجاد بیقیدوشرط پروندههای .pyc برای اعتبارسنجی مبتنی بر هش، متغیر محیطی SOURCE_DATE_EPOCH را رعایت میکند. این امر امکان تضمین ساختهای تکرارپذیر (reproducible builds) پروندههای .pyc را زمانی که بهطور فوری ایجاد میشوند فراهم میکند. (مشارکتشده توسط Bernhard M. Wiedemann در bpo-29708.)
pydoc¶
سرور pydoc اکنون میتواند به نام میزبان دلخواهی که با آرگومان جدید خط فرمان -n مشخص میشود، مقید شود. (مشارکتشده توسط Feanil Patel در bpo-31128.)
queue¶
کلاس جدید SimpleQueue یک صف FIFO نامحدود است. (مشارکتشده توسط Antoine Pitrou در bpo-14976.)
re¶
پرچمهای re.ASCII، re.LOCALE و re.UNICODE را میتوان در محدودهی یک گروه تنظیم کرد. (ارائهشده توسط Serhiy Storchaka در bpo-31690.)
re.split() اکنون از تقسیم بر اساس الگویی مانند r'\b'، '^$' یا (?=-) که با رشتهی تهی تطبیق مییابد، پشتیبانی میکند. (با مشارکت Serhiy Storchaka در bpo-25054.)
عبارتهای باقاعدهای که با پرچم re.LOCALE کامپایل شدهاند، دیگر در زمان کامپایل به locale وابسته نیستند. تنظیمات locale تنها زمانی اعمال میشوند که عبارت باقاعدهی کامپایلشده استفاده شود. (با مشارکت Serhiy Storchaka در bpo-30215.)
FutureWarning اکنون منتشر میشود اگر عبارت باقاعدهای شامل ساختارهای مجموعه نویسه باشد که در آینده از نظر معنایی تغییر خواهند کرد، مانند مجموعههای تودرتو و عملیات مجموعه. (مشارکتشده توسط Serhiy Storchaka در bpo-30349.)
اکنون میتوان اشیاء عبارت باقاعدهی کامپایلشده و اشیاء تطبیق را با استفاده از copy.copy() و copy.deepcopy() کپی کرد. (مشارکتشده توسط Serhiy Storchaka در bpo-10076.)
signal¶
آرگومان جدید warn_on_full_buffer برای تابع signal.set_wakeup_fd() این امکان را فراهم میکند که مشخص کنید آیا پایتون هنگامی که بافر بیدارسازی (wakeup buffer) سرریز میشود، هشداری روی stderr چاپ میکند یا خیر. (مشارکتشده توسط Nathaniel J. Smith در bpo-30050.)
socket¶
متد جدید socket.getblocking() اگر سوکت در حالت مسدودکننده باشد، True و در غیر این صورت False را برمیگرداند. (مشارکتشده توسط Yury Selivanov در bpo-32373.)
تابع جدید socket.close() توصیفگر پروندهی سوکتِ ارسالشده را میبندد. برای سازگاری بهتر میان پلتفرمها، باید بهجای os.close() از این تابع استفاده کرد. (ارائهشده توسط Christian Heimes در bpo-32454.)
ماژول socket اکنون ثابتهای socket.TCP_CONGESTION (Linux 2.6.13)، socket.TCP_USER_TIMEOUT (Linux 2.6.37) و socket.TCP_NOTSENT_LOWAT (Linux 3.12) را در دسترس قرار میدهد. (مشارکت Omar Sandoval در bpo-26273 و Nathaniel J. Smith در bpo-29728.)
پشتیبانی از سوکتهای socket.AF_VSOCK اضافه شده است تا امکان برقراری ارتباط بین ماشینهای مجازی و میزبانهای آنها فراهم شود. (با مشارکت Cathy Avery در bpo-27584.)
سوکتها اکنون بهصورت پیشفرض خانواده، نوع و پروتکل را از توصیفگر پرونده بهطور خودکار تشخیص میدهند. (مشارکتشده توسط Christian Heimes در bpo-28134.)
socketserver¶
socketserver.ThreadingMixIn.server_close اکنون منتظر میماند تا همهی نخهای غیردِیمِن به پایان برسند. socketserver.ForkingMixIn.server_close اکنون منتظر میماند تا همهی فرایندهای فرزند به پایان برسند.
یک ویژگی کلاس جدید socketserver.ForkingMixIn.block_on_close به کلاسهای socketserver.ForkingMixIn و socketserver.ThreadingMixIn اضافه کنید. برای به دست آوردن رفتار پیش از 3.7، این ویژگی کلاس را روی False تنظیم کنید.
sqlite3¶
sqlite3.Connection اکنون متد backup() را زمانی که کتابخانه SQLite زیرین در نسخه 3.6.11 یا بالاتر باشد، در دسترس قرار میدهد. (مشارکت Lele Gaifax در bpo-27645.)
آرگومان database تابع sqlite3.connect() اکنون بهجای فقط یک رشته، هر path-like object را میپذیرد. (مشارکتشده توسط Anders Lorentsen در bpo-31843.)
ssl¶
ماژول ssl اکنون بهجای match_hostname() از API توکار OpenSSL برای بررسی نام میزبان یا نشانی IP استفاده میکند. مقادیر در طول دستدهی TLS اعتبارسنجی میشوند. هر خطای اعتبارسنجی گواهی، از جمله شکست در بررسی نام میزبان، اکنون استثنای SSLCertVerificationError را ایجاد میکند و دستدهی را با یک پیام هشدار TLS مناسب لغو میکند. استثنای جدید حاوی اطلاعات اضافی است. اعتبارسنجی نام میزبان را میتوان با SSLContext.hostname_checks_common_name سفارشیسازی کرد. (ارائهشده توسط Christian Heimes در bpo-31399.)
توجه
بررسی بهبودیافتهی نام میزبان به پیادهسازی libssl سازگار با OpenSSL 1.0.2 یا 1.1 نیاز دارد. در نتیجه، OpenSSL 0.9.8 و 1.0.1 دیگر پشتیبانی نمیشوند (برای جزئیات بیشتر به حذف پشتیبانی از پلتفرمها مراجعه کنید). ماژول ssl عمدتاً با LibreSSL 2.7.2 و نسخههای جدیدتر سازگار است.
ماژول ssl دیگر نشانیهای IP را در افزونهی SNI از TLS ارسال نمیکند. (با مشارکت Christian Heimes در bpo-32185.)
match_hostname() دیگر از وایلدکاردهای جزئی مانند www*.example.org پشتیبانی نمیکند. (مشارکتشده توسط ماندیپ سینگ در bpo-23033 و کریستین هایمز در bpo-31399.)
انتخاب پیشفرض بدنه رمز در ماژول ssl اکنون بهجای فهرست سفید هاردکدشده، از رویکرد فهرست سیاه استفاده میکند. پایتون دیگر رمزهایی را که توسط بهروزرسانیهای امنیتی OpenSSL مسدود شدهاند، دوباره فعال نمیکند. انتخاب پیشفرض بدنه رمزها را میتوان در زمان کامپایل پیکربندی کرد. (با مشارکت کریستین هایمز در bpo-31429.)
اکنون از اعتبارسنجی گواهیهای سرور حاوی دامنههای اینترنتی بینالمللی (IDN) پشتیبانی میشود. به عنوان بخشی از این تغییر، ویژگی SSLSocket.server_hostname اکنون نام میزبان مورد انتظار را به شکل برچسب A (A-label) ("xn--pythn-mua.org") ذخیره میکند، نه به شکل برچسب U (U-label) ("pythön.org"). (با مشارکت Nathaniel J. Smith و Christian Heimes در bpo-28414.)
ماژول ssl پشتیبانی مقدماتی و آزمایشی برای TLS 1.3 و OpenSSL 1.1.1 دارد. در زمان انتشار پایتون 3.7.0، OpenSSL 1.1.1 هنوز در حال توسعه است و TLS 1.3 هنوز نهایی نشده است. دستدهی و پروتکل TLS 1.3 رفتاری کمی متفاوت از TLS 1.2 و نسخههای پیشین دارند، به TLS 1.3 مراجعه کنید. (مشارکت Christian Heimes در bpo-32947، bpo-20995، bpo-29136، bpo-30622 و bpo-33618)
SSLSocket و SSLObject دیگر سازندهی عمومی ندارند. نمونهسازی مستقیم هرگز قابلیتی مستند و پشتیبانیشده نبوده است. نمونهها باید با متدهای SSLContext یعنی wrap_socket() و wrap_bio() ایجاد شوند. (با مشارکت کریستین هایمز در bpo-32951)
APIهای OpenSSL 1.1 برای تنظیم کمینه و بیشینه نسخهی پروتکل TLS، بهصورت SSLContext.minimum_version و SSLContext.maximum_version در دسترس هستند. پروتکلهای پشتیبانیشده با چندین پرچم جدید مانند HAS_TLSv1_1 نشان داده میشوند. (مشارکتشده توسط Christian Heimes در bpo-32609.)
ssl.SSLContext.post_handshake_auth برای فعالسازی و ssl.SSLSocket.verify_client_post_handshake() برای آغاز احراز هویت پس از دستدهی در TLS 1.3 افزوده شد. (مشارکتشده توسط Christian Heimes در gh-78851.)
string¶
string.Template اکنون به شما اجازه میدهد الگوی عبارت باقاعده برای جاینگهدارهای داخل آکولاد و جاینگهدارهای بدون آکولاد را بهصورت اختیاری و بهطور جداگانه تغییر دهید. (مشارکتشده توسط Barry Warsaw در bpo-1198569.)
subprocess¶
تابع subprocess.run() آرگومان کلیدواژهای جدید capture_output را میپذیرد. در صورت درست بودن، stdout و stderr ضبط خواهند شد. این معادل ارسال subprocess.PIPE بهعنوان آرگومانهای stdout و stderr است. (مشارکتشده توسط Bo Bayles در bpo-32102.)
تابع subprocess.run و سازندهی subprocess.Popen اکنون آرگومان کلیدواژهای text را بهعنوان نام مستعاری برای universal_newlines میپذیرند. (مشارکتشده توسط Andrew Clegg در bpo-31756.)
در ویندوز، مقدار پیشفرض close_fds هنگام تغییر مسیر دستههای استاندارد از False به True تغییر یافت. اکنون میتوانید هنگام تغییر مسیر دستههای استاندارد، close_fds را روی true تنظیم کنید. subprocess.Popen را ببینید. این بدان معناست که close_fds اکنون در همهی پلتفرمهای پشتیبانیشده بهطور پیشفرض True است. (مشارکت Segev Finer در bpo-19764.)
ماژول subprocess اکنون هنگام مدیریت KeyboardInterrupt در حین subprocess.call()، subprocess.run() یا در یک مدیر زمینهی Popen رفتار مناسبتری دارد. اکنون پیش از ادامهی مدیریت استثنای KeyboardInterrupt، مدت کوتاهی برای خروج فرزند صبر میکند. (مشارکتشده توسط گرگوری پی. اسمیت در bpo-25942.)
sys¶
تابع قلاب جدید sys.breakpointhook() توسط breakpoint() توکار فراخوانی میشود. (با مشارکت Barry Warsaw در bpo-31353.)
در اندروید، تابع جدید sys.getandroidapilevel() نسخهی API اندروید در زمان ساخت را برمیگرداند. (مشارکتشده توسط ویکتور استینر در bpo-28740.)
تابع جدید sys.get_coroutine_origin_tracking_depth() عمق فعلی پیگیری مبدأ همروال را برمیگرداند، همانطور که توسط تابع جدید sys.set_coroutine_origin_tracking_depth() تنظیم شده است. asyncio برای استفاده از این API جدید بهجای تابع منسوخ sys.set_coroutine_wrapper() تبدیل شده است. (نوشتهشده توسط Nathaniel J. Smith در bpo-32591.)
time¶
PEP 564 شش تابع جدید با وضوح نانوثانیهای را به ماژول time اضافه میکند:
شناسههای جدید ساعت اضافه شدهاند:
time.CLOCK_BOOTTIME(Linux): یکسان باtime.CLOCK_MONOTONICاست، بهجز اینکه مدتزمانی را که سیستم در حالت تعلیق است نیز شامل میشود.time.CLOCK_PROF(FreeBSD، NetBSD و OpenBSD): زمانسنج CPU با وضوح بالا به ازای هر فرایند.time.CLOCK_UPTIME(FreeBSD, OpenBSD): زمانی که مقدار مطلق آن برابر است با مدتزمانی که سیستم در حال اجرا بوده و به حالت تعلیق درنیامده است، و اندازهگیری دقیق زمان کارکرد (uptime) را فراهم میکند.
از توابع جدید time.thread_time() و time.thread_time_ns() میتوان برای بهدستآوردن اندازهگیریهای زمان CPU به ازای هر نخ استفاده کرد. (مشارکتشده توسط آنتوان پیترو در bpo-32025.)
تابع جدید time.pthread_getcpuclockid() شناسه ساعتِ زمان CPU مخصوصِ نخ را برمیگرداند.
tkinter¶
کلاس جدید tkinter.ttk.Spinbox اکنون در دسترس است. (مشارکت Alan Moore در bpo-32585.)
tracemalloc¶
tracemalloc.Traceback رفتاری شبیهتر به ردگیریهای معمولی دارد و فریمها را از قدیمیترین به جدیدترین مرتب میکند. Traceback.format() اکنون limit منفی را میپذیرد و نتیجه را به قدیمیترین abs(limit) فریم اسلایس میدهد. برای به دست آوردن رفتار پیشین، از آرگومان جدید most_recent_first در Traceback.format() استفاده کنید. (مشارکتشده توسط جسی باکر در bpo-32121.)
types¶
کلاسهای جدید WrapperDescriptorType، MethodWrapperType، MethodDescriptorType و ClassMethodDescriptorType اکنون در دسترس هستند. (مشارکتشده توسط Manuel Krebber و Guido van Rossum در bpo-29377، و Serhiy Storchaka در bpo-32265.)
تابع جدید types.resolve_bases() ورودیهای ترتیب حل متد (MRO) را بهطور پویا و مطابق با PEP 560 حل میکند. (مشارکتشده توسط Ivan Levkivskyi در bpo-32717.)
unicodedata¶
پایگاه دادهی داخلی unicodedata برای استفاده از Unicode 11 ارتقا یافته است. (با مشارکت Benjamin Peterson.)
unittest¶
گزینه جدید خط فرمان -k اجازه میدهد آزمونها بر اساس زیررشتهای از نام یا الگویی شبیه پوسته یونیکس پالایش شوند. برای مثال، python -m unittest -k foo آزمونهای foo_tests.SomeTest.test_something و bar_tests.SomeTest.test_foo را اجرا میکند، اما bar_tests.FooTest.test_something را اجرا نمیکند. (مشارکتشده توسط Jonas Haag در bpo-32071.)
unittest.mock¶
ویژگیهای sentinel اکنون هنگامی که کپی یا پیکل میشوند، همانی خود را حفظ میکنند. (مشارکتشده توسط Serhiy Storchaka در bpo-20804.)
تابع جدید seal() امکان مهر و موم کردن نمونههای Mock را فراهم میکند؛ این کار ایجاد ماکهای ویژگی بیشتر را ممنوع میکند. مهر و موم بهصورت بازگشتی به تمام ویژگیهایی که خود ماک هستند اعمال میشود. (مشارکت Mario Corchero در bpo-30541.)
urllib.parse¶
urllib.parse.quote() از RFC 2396 به RFC 3986 بهروزرسانی شده است و ~ به مجموعه نویسههایی که بهطور پیشفرض هرگز نقلقول نمیشوند افزوده شده است. (مشارکتکنندگان: Christian Theune و Ratnadeep Debnath در bpo-16285.)
uu¶
تابع uu.encode() اکنون یک آرگومان کلیدواژهای اختیاری backtick را میپذیرد. وقتی درست باشد، صفرها بهجای فاصلهها با '`' نمایش داده میشوند. (مشارکتشده توسط Xiang Zhang در bpo-30103.)
uuid¶
ویژگی جدید UUID.is_safe اطلاعاتی را از پلتفرم دربارهی اینکه آیا UUIDها با روشی چندپردازشایمن تولید میشوند یا خیر، منتقل میکند. (مشارکتشده توسط بری ورشو در bpo-22807.)
uuid.getnode() اکنون آدرسهای MAC با مدیریت همگانی (universally administered) را به آدرسهای MAC با مدیریت محلی (locally administered) ترجیح میدهد. این کار تضمین بهتری برای یکتایی سراسری UUIDهایی که از uuid.uuid1() بازگردانده میشوند فراهم میکند. اگر فقط آدرسهای MAC با مدیریت محلی در دسترس باشند، نخستین مورد یافتشده از آنها بازگردانده میشود. (مشارکت Barry Warsaw در bpo-32107.)
warnings¶
مقداردهی اولیهی فیلترهای پیشفرض هشدارها به شرح زیر تغییر کرده است:
هشدارهایی که از طریق گزینههای خط فرمان فعال میشوند (از جمله هشدارهای مربوط به
-bو گزینهی جدید-Xdevکه مخصوص سیپایتون است) همیشه از طریق ویژگیsys.warnoptionsبه سازوکار هشدارها منتقل میشوند.فیلترهای هشدار که از طریق خط فرمان یا محیط فعال شدهاند، اکنون ترتیب تقدم زیر را دارند:
فیلتر
BytesWarningبرای-b(یا-bb)هر فیلتری که با گزینهی
-Wمشخص شده استهر فیلتری که با متغیر محیطی
PYTHONWARNINGSمشخص شده باشدسایر فیلترهای مخصوص سیپایتون (مثلاً فیلتر
defaultافزودهشده برای حالت جدید-X dev)هر فیلتر ضمنی که مستقیماً توسط سازوکار هشدارها تعریف شده است
در ساختهای اشکالزدایی سیپایتون، اکنون همهی هشدارها بهطور پیشفرض نمایش داده میشوند (فهرست پالایههای ضمنی خالی است)
(با مشارکت Nick Coghlan و Victor Stinner در bpo-20361، bpo-32043 و bpo-32230.)
هشدارهای منسوخشدن بار دیگر بهصورت پیشفرض در اسکریپتهای تکپروندهای و در اعلان تعاملی نمایش داده میشوند. برای جزئیات به PEP 565: نمایش DeprecationWarning در __main__ مراجعه کنید. (مشارکتشده توسط Nick Coghlan در bpo-31975.)
xml¶
برای کاهش خطر بازیابی DTD و موجودیتهای خارجی، ماژولهای xml.dom.minidom و xml.sax دیگر بهطور پیشفرض موجودیتهای خارجی را پردازش نمیکنند. (مشارکت Christian Heimes در gh-61441.)
xml.etree¶
محمولهای ElementPath در متدهای find() اکنون میتوانند متن گره فعلی را با [. = "text"] مقایسه کنند، نه فقط متن فرزندان. محمولها همچنین اجازه میدهند برای خوانایی بهتر فاصله افزوده شود. (مشارکتشده توسط Stefan Behnel در bpo-31648.)
xmlrpc.server¶
SimpleXMLRPCDispatcher.register_function() اکنون میتواند بهعنوان دکوراتور استفاده شود. (مشارکتشده توسط Xiang Zhang در bpo-7769.)
zipapp¶
تابع create_archive() اکنون یک آرگومان filter اختیاری را میپذیرد تا به کاربر اجازه دهد انتخاب کند کدام پروندهها باید در آرشیو گنجانده شوند. (مشارکتشده توسط Irmen de Jong در bpo-31072.)
تابع create_archive() اکنون یک آرگومان اختیاری compressed را برای تولید بایگانی فشرده میپذیرد. یک گزینهی خط فرمان --compress نیز برای پشتیبانی از فشردهسازی افزوده شده است. (مشارکتشده توسط Zhiming Wang در bpo-31638.)
zipfile¶
ZipFile اکنون پارامتر جدید compresslevel را برای کنترل سطح فشردهسازی میپذیرد. (با مشارکت Bo Bayles در bpo-21417.)
زیرپوشهها در آرشیوهای ایجادشده توسط ZipFile اکنون به ترتیب الفبایی ذخیره میشوند. (مشارکتشده توسط Bernhard M. Wiedemann در bpo-30693.)
تغییرات API زبان C¶
یک API جدید برای ذخیرهسازی نخمحلی پیادهسازی شده است. برای مرور کلی به PEP 539: C API جدید برای ذخیرهسازی نخمحلی و برای مرجع کامل به API ذخیرهسازی ویژهی نخ (Thread-Specific Storage) مراجعه کنید. (مشارکتشده توسط ماسایوکی یاماموتو در bpo-25658.)
قابلیت جدید متغیرهای زمینه تعدادی از APIهای جدید C را در اختیار میگذارد.
تابع جدید PyImport_GetModule() ماژولی را که قبلاً با نام دادهشده ایمپورت شده است برمیگرداند. (مشارکت اریک اسنو در bpo-28411.)
ماکروی جدید Py_RETURN_RICHCOMPARE نوشتن توابع مقایسهی غنی (rich comparison) را آسان میکند. (مشارکتشده توسط Petr Victorin در bpo-23699.)
ماکروی جدید Py_UNREACHABLE میتواند برای نشانهگذاری مسیرهای دسترسناپذیر کد استفاده شود. (با مشارکت Barry Warsaw در bpo-31338.)
ماژول tracemalloc اکنون از طریق توابع جدید PyTraceMalloc_Track() و PyTraceMalloc_Untrack() یک API در سطح C را در دسترس قرار میدهد. (ارائهشده توسط ویکتور استینر در bpo-30054.)
از نشانگرهای ایستای جدید import__find__load__start و import__find__load__done میتوان برای ردگیری ایمپورت ماژولها استفاده کرد. (مشارکت Christian Heimes در bpo-31574.)
فیلدهای name و doc در ساختارهای PyMemberDef، PyGetSetDef، PyStructSequence_Field، PyStructSequence_Desc و wrapperbase اکنون از نوع const char * هستند و نه char *. (مشارکتشده توسط Serhiy Storchaka در bpo-28761.)
نتیجهی PyUnicode_AsUTF8AndSize() و PyUnicode_AsUTF8() اکنون از نوع const char * است، نه char *. (مشارکتشده توسط Serhiy Storchaka در bpo-28769.)
نتیجهی PyMapping_Keys()، PyMapping_Values() و PyMapping_Items() اکنون همیشه یک فهرست است، نه یک فهرست یا تاپل. (مشارکت Oren Milman در bpo-28280.)
توابع PySlice_Unpack() و PySlice_AdjustIndices() افزوده شدند. (مشارکتشده توسط Serhiy Storchaka در bpo-27867.)
PyOS_AfterFork() به نفع توابع جدید PyOS_BeforeFork()، PyOS_AfterFork_Parent() و PyOS_AfterFork_Child() منسوخ شده است. (مشارکتشده توسط Antoine Pitrou در bpo-16500.)
تکنمونه PyExc_RecursionErrorInst که بخشی از API عمومی بود حذف شده است، زیرا اینکه اعضای آن هرگز پاکسازی نمیشوند ممکن است در حین نهاییسازی مفسر باعث خطای قطعهبندی (segmentation fault) شود. مشارکتشده توسط Xavier de Gaye در bpo-22898 و bpo-30697.
پشتیبانی از منطقههای زمانی در C API با سازندههای منطقه زمانی PyTimeZone_FromOffset() و PyTimeZone_FromOffsetAndName()، و دسترسی به تکنمونهی UTC با PyDateTime_TimeZone_UTC افزوده شد. ارائهشده توسط Paul Ganssle در bpo-10381.
نوع نتایج PyThread_start_new_thread() و PyThread_get_thread_ident()، و پارامتر id در PyThreadState_SetAsyncExc() از long به unsigned long تغییر کرد. (مشارکتشده توسط Serhiy Storchaka در bpo-6532.)
PyUnicode_AsWideCharString() اکنون در صورتی که آرگومان دوم NULL باشد و رشتهی wchar_t* حاوی نویسههای تهی باشد، استثنای ValueError ایجاد میکند. (مشارکتشده توسط Serhiy Storchaka در bpo-30708.)
تغییرات در دنباله راهاندازی و مدیریت تخصیصدهندههای حافظه پویا به این معناست که اکنون بیش از پیش به الزام مدتها مستندشده برای فراخوانی Py_Initialize() پیش از فراخوانی بیشتر توابع API زبان C تکیه میشود، و عدم پایبندی به آن ممکن است به خطاهای قطعهبندی (segmentation fault) در برنامههای تعبیهکننده منجر شود. برای جزئیات بیشتر، به بخش انتقال به پایتون 3.7 در این سند و بخش پیش از مقداردهی اولیه پایتون در مستندات API زبان C مراجعه کنید.
تابع جدید PyInterpreterState_GetID() شناسهی یکتای مفسر دادهشده را برمیگرداند. (ارائهشده توسط Eric Snow در bpo-29102.)
Py_DecodeLocale() و Py_EncodeLocale() هنگامی که حالت UTF-8 فعال است، اکنون از کدگذاری UTF-8 استفاده میکنند. (مشارکتشده توسط Victor Stinner در bpo-29240.)
PyUnicode_DecodeLocaleAndSize() and PyUnicode_EncodeLocale()
now use the current locale encoding for surrogateescape error handler.
(Contributed by Victor Stinner in bpo-29240.)
پارامترهای start و end در PyUnicode_FindChar() اکنون بهگونهای تنظیم شدهاند که مانند اسلایسهای رشته رفتار کنند. (مشارکتشده توسط Xiang Zhang در bpo-28822.)
تغییرات ساخت¶
پشتیبانی از ساخت با --without-threads حذف شده است. ماژول threading اکنون همیشه در دسترس است. (مشارکتشده توسط Antoine Pitrou در bpo-31370.).
یک نسخهی کامل از libffi دیگر برای استفاده هنگام ساخت ماژول _ctypes در پلتفرمهای UNIX غیر از OSX همراه نمیشود. اکنون هنگام ساخت _ctypes در چنین پلتفرمهایی، یک نسخهی نصبشده از libffi لازم است. (مشارکتشده توسط Zachary Ware در bpo-27979.)
فرایند ساخت ویندوز دیگر برای دریافت منابع خارجی به Subversion وابسته نیست؛ در عوض، از یک اسکریپت پایتون برای دانلود پروندههای زیپ از GitHub استفاده میشود. اگر پایتون 3.6 روی سیستم یافت نشود (از طریق py -3.6)، به همین منظور از NuGet برای دانلود یک نسخه از پایتون ۳۲ بیتی استفاده میشود. (مشارکتشده توسط زاکری ور در bpo-30450.)
ماژول ssl به libssl سازگار با OpenSSL 1.0.2 یا 1.1 نیاز دارد. OpenSSL 1.0.1 در تاریخ 2016-12-31 به پایان دوره عمر خود رسیده و دیگر پشتیبانی نمیشود. LibreSSL نیز بهطور موقت پشتیبانی نمیشود. نسخههای LibreSSL تا نسخه 2.6.4 فاقد APIهای مورد نیاز OpenSSL 1.0.2 هستند.
بهینهسازیها¶
سربار فراخوانی بسیاری از متدهای کلاسهای مختلف کتابخانه استاندارد که به زبان C پیادهسازی شدهاند، با انتقال کد بیشتر برای استفاده از قرارداد METH_FASTCALL بهطور چشمگیری کاهش یافته است. (مشارکتشده توسط Victor Stinner در bpo-29300، bpo-29507، bpo-29452 و bpo-29286.)
بهینهسازیهای گوناگون زمان راهاندازی پایتون را در لینوکس به میزان ۱۰٪ و در macOS تا ۳۰٪ کاهش دادهاند. (مشارکتشده توسط Victor Stinner و INADA Naoki در bpo-29585، و Ivan Levkivskyi در bpo-31333.)
فراخوانی متدها اکنون به دلیل تغییرات بایتکدی که از ایجاد نمونههای متد مقید جلوگیری میکنند، تا ۲۰٪ سریعتر شده است. (با مشارکت Yury Selivanov و INADA Naoki در bpo-26110.)
ماژول asyncio تعدادی بهینهسازی قابل توجه برای توابع پرکاربرد دریافت کرد:
تابع
asyncio.get_event_loop()به زبان C بازپیادهسازی شده است تا سرعت آن تا ۱۵ برابر افزایش یابد. (مشارکت Yury Selivanov در bpo-32296.)مدیریت کالبکهای
asyncio.Futureبهینهسازی شده است. (مشارکتشده توسط Yury Selivanov در bpo-32348.)asyncio.gather()اکنون تا ۱۵٪ سریعتر است. (مشارکتشده توسط Yury Selivanov در bpo-32355.)asyncio.sleep()اکنون تا ۲ برابر سریعتر است وقتی که آرگومان delay صفر یا منفی باشد. (مشارکتشده توسط Andrew Svetlov در bpo-32351.)سربار عملکردی حالت اشکالزدایی asyncio کاهش یافته است. (مشارکت Antoine Pitrou در bpo-31970.)
در نتیجهی کار روی PEP 560، زمان ایمپورت typing به میزان ۷ برابر کاهش یافته است و بسیاری از عملیاتهای typing اکنون سریعتر شدهاند. (مشارکتشده توسط Ivan Levkivskyi در bpo-32226.)
sorted() و list.sort() برای موارد رایج بهینهسازی شدهاند و تا ۴۰ تا ۷۵ درصد سریعتر هستند. (با مشارکت Elliot Gorokhovsky در bpo-28685.)
dict.copy() اکنون تا ۵.۵ برابر سریعتر شده است. (مشارکتشده توسط یوری سلیوانوف در bpo-31179.)
hasattr() و getattr() اکنون وقتی name یافت نشود و obj object.__getattr__() یا object.__getattribute__() را بازنویسی نکند، حدود ۴ برابر سریعتر هستند. (مشارکت INADA Naoki در bpo-32544.)
جستجوی برخی نویسههای یونیکد (مانند حرف بزرگ اوکراینی «Є») در یک رشته، تا ۲۵ بار کندتر از جستجوی نویسههای دیگر بود. اکنون در بدترین حالت تنها ۳ بار کندتر است. (مشارکت Serhiy Storchaka در bpo-24821.)
تابع کارخانهای collections.namedtuple() بازپیادهسازی شده است تا ساخت تاپلهای نامدار ۴ تا ۶ برابر سریعتر شود. (مشارکتشده توسط Jelle Zijlstra و با بهبودهای بیشتر از سوی INADA Naoki، Serhiy Storchaka و Raymond Hettinger در bpo-28638.)
datetime.date.fromordinal() و datetime.date.fromtimestamp() اکنون در حالت رایج تا ۳۰٪ سریعتر هستند. (مشارکتشده توسط Paul Ganssle در bpo-32403.)
تابع os.fwalk() اکنون به لطف استفاده از os.scandir() تا ۲ برابر سریعتر شده است. (مشارکتشده توسط Serhiy Storchaka در bpo-25996.)
سرعت تابع shutil.rmtree() با استفاده از تابع os.scandir() به میزان ۲۰--۴۰٪ بهبود یافته است. (مشارکتشده توسط Serhiy Storchaka در bpo-28564.)
بهینهسازی تطبیق و جستجوی بدون حساسیت به بزرگی و کوچکی حروف در عبارتهای باقاعده. جستجوی برخی از الگوها اکنون میتواند تا ۲۰ برابر سریعتر باشد. (مشارکتشده توسط Serhiy Storchaka در bpo-30285.)
re.compile() اکنون پارامتر flags را در صورتی که RegexFlag باشد به شیء int تبدیل میکند. سرعت آن اکنون برابر با پایتون 3.5 است و بسته به الگو، حدود ۱۰٪ سریعتر از پایتون 3.6 است. (مشارکتشده توسط INADA Naoki در bpo-31671.)
متدهای modify() از کلاسهای selectors.EpollSelector، selectors.PollSelector و selectors.DevpollSelector ممکن است تحت بارهای سنگین حدود ۱۰٪ سریعتر باشند. (مشارکتشده توسط Giampaolo Rodola' در bpo-30014)
تاشدگی ثابت (constant folding) از بهینهساز پنجرهای (peephole optimizer) به بهینهساز جدید درخت سینتکس انتزاعی (AST) منتقل شده است که میتواند بهینهسازیها را با سازگاری بیشتری انجام دهد. (ارائه شده توسط Eugene Toder و INADA Naoki در bpo-29469 و bpo-11549.)
بیشتر توابع و متدهای abc به زبان C بازنویسی شدهاند. این کار ایجاد کلاسهای پایه انتزاعی و فراخوانی isinstance() و issubclass() روی آنها را ۱٫۵ برابر سریعتر میکند. همچنین زمان راهاندازی پایتون را تا ۱۰ درصد کاهش میدهد. (مشارکت Ivan Levkivskyi و INADA Naoki در bpo-31333)
بهبودهای چشمگیر سرعت در سازندههای جایگزین datetime.date و datetime.datetime از طریق استفاده از سازندههای مسیر سریع (fast-path) در حالتی که زیرکلاسی ساخته نمیشود. (مشارکت Paul Ganssle در bpo-32403)
سرعت مقایسهی نمونههای array.array در موارد خاصی بهطور قابلتوجهی بهبود یافته است. اکنون هنگام مقایسهی آرایههایی که مقادیری از یک نوع عدد صحیح در خود دارند، از ۱۰ تا ۷۰ برابر سریعتر است. (مشارکتشده توسط Adrian Wielgosik در bpo-24700.)
توابع math.erf() و math.erfc() اکنون در بیشتر پلتفرمها از پیادهسازی (سریعتر) کتابخانهی C استفاده میکنند. (مشارکتشده توسط Serhiy Storchaka در bpo-26121.)
سایر تغییرات در پیادهسازی سیپایتون¶
قلابهای ردگیری اکنون میتوانند با تنظیم ویژگیهای جدید متناظر
f_trace_linesوf_trace_opcodesبر روی فریم در حال ردگیری، از دریافت رویدادهایlineصرفنظر کنند و دریافت رویدادهایopcodeاز مفسر را انتخاب کنند. (مشارکتشده توسط Nick Coghlan در bpo-31344.)برخی مشکلات سازگاری در ویژگیهای ماژولهای بسته فضای نام برطرف شد. شیءهای ماژول فضای نام اکنون
__file__دارند که بهNoneتنظیم میشود (پیشتر تنظیم نمیشد)، و__spec__.originآنها نیز بهNoneتنظیم میشود (پیشتر رشتهی"namespace"بود). به bpo-32305 مراجعه کنید. همچنین،__spec__.loaderشیء ماژول فضای نام به همان مقدار__loader__تنظیم میشود (پیشتر، اولی بهNoneتنظیم میشد). به bpo-32303 مراجعه کنید.دیکشنری
locals()اکنون به ترتیب واژگانیای که متغیرها در آن تعریف شدهاند نمایش داده میشود. پیش از این، این ترتیب تعریفنشده بود. (مشارکتشده توسط Raymond Hettinger در bpo-32690.)دستور
uploadدرdistutilsدیگر تلاش نمیکند نویسههای پایان سطر CR را به CRLF تغییر دهد. این، مشکل خرابی در توزیعهای منبع (sdist) که به بایتی معادل CR خاتمه مییافتند را برطرف میکند. (مشارکتشده توسط Bo Bayles در bpo-32304.)
رفتار منسوخ پایتون¶
عبارتهای yield (هم بندهای yield و هم بندهای yield from) اکنون در درکها و عبارتهای تولیدگر منسوخ شدهاند (بهجز عبارت پیمایشپذیر در چپترین بند for). این کار تضمین میکند که درکها همیشه بلافاصله یک ظرف از نوع مناسب را برگردانند (بهجای اینکه بهطور بالقوه یک شیء پیمایشگر تولیدگر برگردانند)، در حالی که عبارتهای تولیدگر تلاش نمیکنند خروجی ضمنی خود را با خروجی عبارتهای yield صریح در هم ببافند. در پایتون 3.7، چنین عبارتهایی هنگام کامپایل DeprecationWarning منتشر میکنند، و در پایتون 3.8 این یک SyntaxError خواهد بود. (مشارکتشده توسط Serhiy Storchaka در bpo-10544.)
برگرداندن زیرکلاسی از complex از object.__complex__() منسوخ شده است و در نسخههای آینده پایتون خطا خواهد بود. این کار __complex__() را با object.__int__() و object.__float__() سازگار میکند. (مشارکتشده توسط Serhiy Storchaka در bpo-28894.)
ماژولها، توابع و متدهای منسوخ پایتون¶
aifc¶
aifc.openfp() منسوخ شده است و در پایتون 3.9 حذف خواهد شد. به جای آن از aifc.open() استفاده کنید. (مشارکتشده توسط برایان کرتین در bpo-31985.)
asyncio¶
پشتیبانی از await کردن مستقیم نمونههای asyncio.Lock و سایر پریمیتیوهای همگامسازی asyncio منسوخ شده است. برای بهدستآوردن و آزاد کردن منبع همگامسازی، باید از یک مدیر زمینه ناهمگام استفاده شود. (مشارکتشده توسط Andrew Svetlov در bpo-32253.)
متدهای asyncio.Task.current_task() و asyncio.Task.all_tasks() منسوخ شدهاند. (مشارکتشده توسط Andrew Svetlov در bpo-32250.)
collections¶
در پایتون 3.8، کلاسهای پایه انتزاعی موجود در collections.abc دیگر در ماژول معمولی collections در دسترس نخواهند بود. این به ایجاد تمایز روشنتری بین کلاسهای عینی و کلاسهای پایه انتزاعی کمک میکند. (مشارکت Serhiy Storchaka در bpo-25988.)
dbm¶
dbm.dumb اکنون از خواندن پروندههای فقطخواندنی پشتیبانی میکند و زمانی که پروندهی اندیس تغییر نکرده باشد، دیگر آن را نمینویسد. اکنون اگر پروندهی اندیس در حالتهای 'r' و 'w' وجود نداشته باشد و بازایجاد شود، یک هشدار منسوخشدن نشان داده میشود (این مورد در نسخههای آینده پایتون یک خطا خواهد بود). (مشارکتشده توسط Serhiy Storchaka در bpo-28847.)
enum¶
در پایتون 3.8، تلاش برای بررسی وجود اشیاء غیر Enum در کلاسهای Enum باعث ایجاد TypeError خواهد شد (مثلاً 1 in Color)؛ بهطور مشابه، تلاش برای بررسی وجود اشیاء غیر Flag در یک عضو Flag باعث ایجاد TypeError خواهد شد (مثلاً 1 in Perm.RW)؛ در حال حاضر، هر دو عملیات بهجای آن False برمیگردانند. (مشارکتشده توسط Ethan Furman در bpo-33217.)
gettext¶
استفاده از مقدار غیر عدد صحیح برای انتخاب شکل جمع در gettext اکنون منسوخ شده است. این قابلیت هرگز بهدرستی کار نمیکرد. (با مشارکت Serhiy Storchaka در bpo-28692.)
importlib¶
متدهای MetaPathFinder.find_module() (جایگزینشده با MetaPathFinder.find_spec()) و PathEntryFinder.find_loader() (جایگزینشده با PathEntryFinder.find_spec()) که هر دو در پایتون 3.4 منسوخ شده بودند، اکنون DeprecationWarning منتشر میکنند. (مشارکتشده توسط Matthias Bussonnier در bpo-29576.)
کلاس پایه انتزاعی importlib.abc.ResourceLoader به نفع importlib.abc.ResourceReader منسوخ شده است.
locale¶
locale.format() منسوخ شده است؛ بهجای آن از locale.format_string() استفاده کنید. (مشارکتشده توسط Garvit در bpo-10379.)
macpath¶
ماژول macpath اکنون منسوخ شده است و در پایتون 3.8 حذف خواهد شد. (مشارکتشده توسط Chi Hsuan Yen در bpo-9850.)
threading¶
dummy_threading و _dummy_thread منسوخ شدهاند. دیگر نمیتوان پایتون را با نخبندی غیرفعال ساخت. به جای آنها از threading استفاده کنید. (مشارکتشده توسط Antoine Pitrou در bpo-31370.)
socket¶
اسلایس بیصدای مقدار آرگومان در socket.htons() و socket.ntohs() منسوخ شده است. در نسخههای آینده پایتون، اگر آرگومان ارسالشده بزرگتر از ۱۶ بیت باشد، استثنایی پرتاب خواهد شد. (مشارکتشده توسط اورن میلمن در bpo-28332.)
ssl¶
ssl.wrap_socket() منسوخ شده است. به جای آن از ssl.SSLContext.wrap_socket() استفاده کنید. (مشارکتشده توسط Christian Heimes در bpo-28124.)
sunau¶
sunau.openfp() منسوخ شده است و در پایتون 3.9 حذف خواهد شد. بهجای آن از sunau.open() استفاده کنید. (مشارکت از سوی Brian Curtin در bpo-31985.)
sys¶
sys.set_coroutine_wrapper() و sys.get_coroutine_wrapper() منسوخ شدند.
تابع مستندسازینشدهی sys.callstats() منسوخ شده است و در یک نسخهی آیندهی پایتون حذف خواهد شد. (ارائهشده توسط Victor Stinner در bpo-28799.)
wave¶
wave.openfp() منسوخ شده است و در پایتون 3.9 حذف خواهد شد. بهجای آن از wave.open() استفاده کنید. (مشارکتشده توسط Brian Curtin در bpo-31985.)
توابع و نوعهای منسوخ API زبان C¶
تابع PySlice_GetIndicesEx() در صورتی که Py_LIMITED_API تنظیم نشده باشد، یا روی مقداری در بازهی بین 0x03050400 و 0x03060000 (بدون احتساب) تنظیم شده باشد، یا 0x03060100 یا بالاتر باشد، منسوخ شده و با یک ماکرو جایگزین شده است. (مشارکتشده توسط Serhiy Storchaka در bpo-27867.)
PyOS_AfterFork() منسوخ شده است. بهجای آن از PyOS_BeforeFork()، PyOS_AfterFork_Parent() یا PyOS_AfterFork_Child() استفاده کنید. (مشارکتشده توسط آنتوان پیترو در bpo-16500.)
حذف پشتیبانی از پلتفرمها¶
FreeBSD 9 و نسخههای قدیمیتر دیگر بهطور رسمی پشتیبانی نمیشوند.
برای پشتیبانی کامل از یونیکد، از جمله درون ماژولهای توسعهای، اکنون انتظار میرود که پلتفرمهای *nix دستکم یکی از
C.UTF-8(locale کامل)،C.utf8(locale کامل) یاUTF-8(locale محدود بهLC_CTYPE) را به عنوان جایگزینی برای locale قدیمیCمبتنی برASCIIفراهم کنند.نسخههای OpenSSL 0.9.8 و 1.0.1 دیگر پشتیبانی نمیشوند، که این بدان معناست که ساخت سیپایتون 3.7 با پشتیبانی SSL/TLS روی پلتفرمهای قدیمیتر که هنوز از این نسخهها استفاده میکنند، نیازمند گزینههای ساخت سفارشی برای پیوند دادن به نسخهای جدیدتر از OpenSSL است.
شایان ذکر است که این مشکل توزیعهای لینوکس LTS یعنی Debian 8 (معروف به «jessie») و Ubuntu 14.04 (معروف به «Trusty») را تحت تأثیر قرار میدهد، زیرا این توزیعها همچنان بهطور پیشفرض از OpenSSL 1.0.1 استفاده میکنند.
Debian 9 ("stretch") و Ubuntu 16.04 ("xenial")، و همچنین نسخههای اخیر سایر توزیعهای لینوکس LTS (مانند RHEL/CentOS 7.5 و SLES 12-SP3)، از OpenSSL 1.0.2 یا نسخههای بعدی استفاده میکنند و در پیکربندی پیشفرض ساخت همچنان پشتیبانی میشوند.
پرونده پیکربندی CI خود سیپایتون نمونهای از استفاده از زیرساخت آزمون سازگاری SSL در بدنهی آزمون سیپایتون برای ساخت و پیوند با OpenSSL 1.1.0 بهجای OpenSSL قدیمی فراهمشده توسط سیستم ارائه میدهد.
حذف APIها و قابلیتها¶
قابلیتها و APIهای زیر از پایتون 3.7 حذف شدهاند:
تابع
os.stat_float_times()حذف شده است. این تابع در پایتون 2.3 برای سازگاری پسرونده با پایتون 2.2 معرفی شد و از پایتون 3.1 منسوخ شده بود.گریزهای ناشناخته متشکل از
'\'و یک حرف اسکی در قالبهای جایگزینی برایre.sub()در پایتون 3.5 منسوخ شدند و اکنون باعث ایجاد خطا خواهند شد.پشتیبانی از آرگومان exclude در
tarfile.TarFile.add()حذف شد. این آرگومان در Python 2.7 و 3.2 منسوخ شده بود. بهجای آن از آرگومان filter استفاده کنید.تابع
ntpath.splitunc()در پایتون 3.1 منسوخ شده بود و اکنون حذف شده است. به جای آن ازsplitdrive()استفاده کنید.collections.namedtuple()دیگر از پارامتر verbose یا ویژگی_sourceکه کد منبع تولیدشده برای کلاس تاپل نامدار را نشان میداد، پشتیبانی نمیکند. این بخشی از یک بهینهسازی طراحیشده برای سرعت بخشیدن به ایجاد کلاس بود. (مشارکتشده توسط Jelle Zijlstra و با بهبودهای بیشتر توسط INADA Naoki، Serhiy Storchaka و Raymond Hettinger در bpo-28638.)توابع
bool()،float()،list()وtuple()دیگر آرگومان کلیدواژهای نمیپذیرند. آرگومان اولint()اکنون فقط میتواند بهصورت آرگومان جایگاهی ارسال شود.کلاسهای
Plist،Dictو_InternalDictکه پیشتر در Python 2.4 منسوخ شده بودند، از ماژولplistlibحذف شدند. مقادیر Dict در نتیجهی توابعreadPlist()وreadPlistFromBytes()اکنون دیکشنریهای معمولی هستند. دیگر نمیتوانید به آیتمهای این دیکشنریها از طریق ویژگیها دسترسی داشته باشید.تابع
asyncio.windows_utils.socketpair()حذف شده است. به جای آن از تابعsocket.socketpair()استفاده کنید؛ این تابع از پایتون 3.5 به بعد در همهی پلتفرمها در دسترس است.asyncio.windows_utils.socketpairدر پایتون 3.5 و نسخههای جدیدتر تنها یک مستعار برایsocket.socketpairبود.asyncioدیگر ماژولهایselectorsو_overlappedرا بهعنوانasyncio.selectorsوasyncio._overlappedاکسپورت نمیکند.from asyncio import selectorsرا باimport selectorsجایگزین کنید.نمونهسازی مستقیم اشیای
ssl.SSLSocketوssl.SSLObjectاکنون ممنوع است. این سازندهها هرگز بهعنوان سازندههای عمومی مستندسازی، آزمون یا طراحی نشده بودند. کاربران قرار بود ازssl.wrap_socket()یاssl.SSLContextاستفاده کنند. (مشارکتشده توسط کریستین هایمز در bpo-32951.)دستور استفادهنشدهی
install_miscدرdistutilsحذف شده است. (مشارکت Eric N. Vander Weele در bpo-29218.)
حذف ماژولها¶
ماژول fpectl حذف شده است. این ماژول هرگز بهصورت پیشفرض فعال نبود، هرگز بهدرستی روی x86-64 کار نمیکرد و رابط دودویی برنامه (ABI) پایتون را بهگونهای تغییر میداد که باعث خرابی غیرمنتظرهی توسعههای C میشد. (مشارکتشده توسط Nathaniel J. Smith در bpo-29137.)
تغییرات مخصوص ویندوز¶
راهانداز پایتون، (py.exe)، میتواند مشخصکنندههای ۳۲ و ۶۴ بیتی را بدون اینکه لازم باشد نسخه فرعی نیز مشخص شود، بپذیرد. بنابراین py -3-32 و py -3-64 در کنار py -3.7-32 معتبر میشوند، همچنین الگوهای -m-64 و -m.n-64 اکنون برای اجبار به استفاده از پایتون ۶۴ بیتی، حتی زمانی که در غیر این صورت نسخه ۳۲ بیتی استفاده میشد، پذیرفته میشوند. اگر نسخه مشخصشده در دسترس نباشد، py.exe با خطا خارج میشود. (مشارکتشده توسط استیو بارنز در bpo-30291.)
راهانداز را میتوان بهصورت py -0 اجرا کرد تا فهرستی از پایتونهای نصبشده تولید کند، که در آن پیشفرض با علامت ستاره مشخص شده است. اجرای py -0p مسیرها را در بر میگیرد. اگر py با مشخصکنندهی نسخهای اجرا شود که قابل تطبیق نیست، فهرست مشخصکنندههای موجود را نیز به شکل کوتاه چاپ میکند. (با مشارکت Steve Barnes در bpo-30362.)
انتقال به پایتون 3.7¶
این بخش، تغییرات پیشتر شرح دادهشده و دیگر رفع اشکالهایی را که ممکن است نیازمند تغییراتی در کد شما باشند، فهرست میکند.
تغییرات در رفتار پایتون¶
نامهای
asyncوawaitاکنون کلیدواژههای رزروشده هستند. کدی که از این نامها بهعنوان شناسه استفاده میکند، اکنون خطایSyntaxErrorایجاد میکند. (مشارکتشده توسط Jelle Zijlstra در bpo-30406.)PEP 479 برای تمام کدها در پایتون 3.7 فعال است، به این معنا که استثناهای
StopIterationکه بهطور مستقیم یا غیرمستقیم در همروالها و تولیدگرها برخاسته میشوند، به استثناهایRuntimeErrorتبدیل میشوند. (مشارکتشده توسط Yury Selivanov در bpo-32670.)متدهای
object.__aiter__()دیگر نمیتوانند بهصورت ناهمگام تعریف شوند. (با مشارکت Yury Selivanov در bpo-31709.)به دلیل یک بیدقتی، نسخههای قدیمیتر پایتون بهاشتباه سینتکس زیر را میپذیرفتند:
f(1 for x in [1],) class C(1 for x in [1]): pass
پایتون 3.7 اکنون بهدرستی یک
SyntaxErrorایجاد میکند، زیرا عبارت تولیدگر همیشه باید مستقیماً درون یک جفت پرانتز قرار گیرد و نمیتواند در هیچیک از دو سمت خود ویرگولی داشته باشد، و تکرار پرانتزها تنها در فراخوانیها قابل حذف است. (مشارکتشده توسط Serhiy Storchaka در bpo-32012 و bpo-32023.)هنگام استفاده از سوییچ
-m، اکنون پوشهی کاری اولیه بهsys.pathاضافه میشود، بهجای یک رشتهی خالی (که بهصورت پویا پوشهی کاری جاری را در زمان هر ایمپورت نشان میداد). هر برنامهای که رشتهی خالی را بررسی میکند یا به هر سینتکس دیگری به رفتار قبلی تکیه دارد، باید متناسب با این تغییر بهروزرسانی شود (مثلاً با اینکهos.getcwd()یاos.path.dirname(__main__.__file__)را نیز بررسی کند، بسته به اینکه کد در وهلهی نخست به چه دلیلی رشتهی خالی را بررسی میکرد).
تغییرات در API پایتون¶
socketserver.ThreadingMixIn.server_closeاکنون منتظر میماند تا همهی نخهای غیردِیمِن به پایان برسند. برای دریافت رفتار پیش از 3.7، ویژگی کلاس جدیدsocketserver.ThreadingMixIn.block_on_closeرا رویFalseتنظیم کنید. (ارائهشده توسط Victor Stinner در bpo-31233 و bpo-33540.)socketserver.ForkingMixIn.server_closeاکنون منتظر میماند تا همهی فرایندهای فرزند کامل شوند. برای به دست آوردن رفتار پیش از 3.7، ویژگی کلاس جدیدsocketserver.ForkingMixIn.block_on_closeرا رویFalseتنظیم کنید. (مشارکتشده توسط Victor Stinner در bpo-31151 و bpo-33540.)تابع
locale.localeconv()اکنون در برخی موارد locale مربوط بهLC_CTYPEرا بهطور موقت روی مقدارLC_NUMERICتنظیم میکند. (مشارکتشده توسط Victor Stinner در bpo-31900.)pkgutil.walk_packages()اکنون اگر path یک رشته باشد،ValueErrorایجاد میکند. پیشتر یک فهرست خالی برگردانده میشد. (مشارکت Sanyam Khurana در bpo-24744.)آرگومان رشته قالببندی برای
string.Formatter.format()اکنون فقطجایگاهی است. ارسال آن بهعنوان آرگومان کلیدواژهای در پایتون 3.5 منسوخ شده بود. (با مشارکت Serhiy Storchaka در bpo-29193.)ویژگیهای
key،valueوcoded_valueاز کلاسhttp.cookies.Morselاکنون فقطخواندنی هستند. انتساب به آنها در Python 3.5 منسوخ شده بود. برای تنظیم آنها از متدset()استفاده کنید. (مشارکت اثر Serhiy Storchaka در bpo-29192.)آرگومان mode در
os.makedirs()دیگر بر بیتهای مجوز پروندهی پوشههای سطح میانی که تازه ایجاد میشوند اثر نمیگذارد. برای تعیین بیتهای مجوز پروندهی آنها میتوانید پیش از فراخوانیmakedirs()، umask را تنظیم کنید. (مشارکتشده توسط Serhiy Storchaka در bpo-19930.)نوع
struct.Struct.formatاکنون به جایbytes،strاست. (با مشارکت ویکتور استینر در bpo-21071.)cgi.parse_multipart()اکنون آرگومانهای encoding و errors را میپذیرد و همان نتایجFieldStorageرا برمیگرداند: برای فیلدهای غیرپروندهای، مقدار مرتبط با یک کلید فهرستی از رشتهها است، نه بایتها. (مشارکت Pierre Quentel در bpo-29979.)به دلیل تغییرات داخلی در
socket، فراخوانیsocket.fromshare()روی سوکتی که در نسخههای قدیمیتر پایتون توسطsocket.shareایجاد شده است، پشتیبانی نمیشود.reprبرایBaseExceptionبهگونهای تغییر کرده است که کامای انتهایی را در بر نگیرد. بیشتر استثناها تحت تأثیر این تغییر قرار میگیرند. (مشارکتشده توسط Serhiy Storchaka در bpo-30399.)reprبرایdatetime.timedeltaتغییر کرده است تا آرگومانهای کلیدواژهای را در خروجی بگنجاند. (مشارکت Utkarsh Upadhyay در bpo-30302.)از آنجا که
shutil.rmtree()اکنون با استفاده از تابعos.scandir()پیادهسازی شده است، هندلر onerror تعیینشده توسط کاربر، هنگامی که فهرستکردن پوشه شکست بخورد، اکنون با آرگومان اولos.scandirبه جایos.listdirفراخوانی میشود.پشتیبانی از مجموعههای تودرتو و عملیات مجموعه در عبارات باقاعده، مطابق با Unicode Technical Standard #18، ممکن است در آینده اضافه شود. این امر سینتکس را تغییر خواهد داد. برای تسهیل این تغییر آینده، فعلاً در موارد مبهم یک
FutureWarningپرتاب میشود. این موارد شامل مجموعههایی است که با یک'['لفظی شروع میشوند یا شامل دنبالههای نویسهای لفظی'--'،'&&'،'~~'و'||'هستند. برای جلوگیری از هشدار، آنها را با بکاسلش خنثی کنید. (مشارکتشده توسط Serhiy Storchaka در bpo-30349.)نتیجهی تقسیم یک رشته بر اساس
عبارت باقاعدهکه میتواند با یک رشته خالی تطبیق یابد، تغییر کرده است. برای مثال، تقسیم بر اساسr'\s*'اکنون نهتنها مانند گذشته در فضاهای سفید، بلکه در رشتههای خالی پیش از همهی نویسههای غیر از فضای سفید و درست پیش از پایان رشته نیز انجام میشود. میتوان رفتار قبلی را با تغییر الگو بهr'\s+'بازگرداند. برای چنین الگوهایی از پایتون 3.5 به بعدFutureWarningنشان داده میشد.برای الگوهایی که هم رشتههای خالی و هم رشتههای غیرخالی را تطبیق میدهند، نتیجهی جستوجو برای همهی تطبیقها ممکن است در موارد دیگر نیز تغییر کند. برای مثال، در رشتهی
'a\n\n'، الگویr'(?m)^\s*?$'نهتنها رشتههای خالی در جایگاههای ۲ و ۳، بلکه رشتهی'\n'در جایگاههای ۲ تا ۳ را نیز تطبیق میدهد. برای تطبیق فقط با سطرهای خالی، باید الگو را بهصورتr'(?m)^[^\S\n]*$'بازنویسی کرد.re.sub()اکنون تطبیقهای خالی مجاور با یک تطبیق غیرخالی قبلی را جایگزین میکند. برای مثال،re.sub('x*', '-', 'abxd')اکنون'-a-b--d-'را بهجای'-a-b-d-'برمیگرداند (علامت منفی اول بین 'b' و 'd' جایگزین 'x' میشود و علامت منفی دوم جایگزین یک رشتهی خالی بین 'x' و 'd' میشود).تغییر
re.escape()بهطوریکه فقط نویسههای خاص عبارت باقاعده را خنثی کند، بهجای خنثی کردن همهی نویسهها بهجز حروف اسکی، اعداد و'_'. (مشارکتشده توسط Serhiy Storchaka در bpo-29995.)فریمهای
tracemalloc.Tracebackاکنون از قدیمیترین تا جدیدترین مرتب میشوند تا باtracebackسازگارتر باشند. (مشارکتشده توسط Jesse Bakker در bpo-32121.)در سیستمعاملهایی که از پرچمهای بیتی
socket.SOCK_NONBLOCKیاsocket.SOCK_CLOEXECپشتیبانی میکنند، ویژگیsocket.typeدیگر شامل این پرچمها نیست. بنابراین، بررسیهایی مانندif sock.type == socket.SOCK_STREAMدر همهی پلتفرمها همانطور که انتظار میرود کار میکنند. (مشارکتشده توسط Yury Selivanov در bpo-32331.)در ویندوز، هنگام بازهدایت دستههای استاندارد، مقدار پیشفرض آرگومان close_fds در
subprocess.PopenازFalseبهTrueتغییر کرد. اگر پیشتر هنگام استفاده ازsubprocess.Popenهمراه با بازهدایت ورودی/خروجی استاندارد، به ارثبری دستهها وابسته بودید، برای حفظ رفتار پیشین بایدclose_fds=Falseرا ارسال کنید یا ازSTARTUPINFO.lpAttributeListاستفاده کنید.importlib.machinery.PathFinder.invalidate_caches()-- که بهطور ضمنی برimportlib.invalidate_caches()تأثیر میگذارد -- اکنون ورودیهایsys.path_importer_cacheرا که رویNoneتنظیمشدهاند حذف میکند. (مشارکتشده توسط Brett Cannon در bpo-33169.)در
asyncio، متدهایloop.sock_recv()،loop.sock_sendall()،loop.sock_accept()،loop.getaddrinfo()وloop.getnameinfo()برای همخوانی با مستنداتشان، به متدهای همروال واقعی تغییر دادهشدهاند. پیشتر، این متدها نمونههایasyncio.Futureرا برمیگرداندند. (مشارکت Yury Selivanov در bpo-32327.)asyncio.Server.socketsاکنون بهجای بازگرداندن مستقیم فهرست داخلی سوکتهای سرور، یک کپی از آن را برمیگرداند. (مشارکتی از Yury Selivanov در bpo-32662.)Struct.formatاکنون یک نمونهیstrبه جای یک نمونهیbytesاست. (با مشارکت Victor Stinner در bpo-21071.)اکنون میتوان زیرپارسرهای
argparseرا با گذراندنrequired=TrueبهArgumentParser.add_subparsers()الزامی کرد. (مشارکتشده توسط Anthony Sottile در bpo-26510.)ast.literal_eval()اکنون سختگیرانهتر است. جمع و تفریق اعداد دلخواه دیگر مجاز نیستند. (مشارکتشده توسط سرهی استورچاکا در bpo-31778.)Calendar.itermonthdatesاکنون همواره هنگامی که تاریخی خارج از محدودهی0001-01-01تا9999-12-31قرار گیرد، استثنا ایجاد میکند. برای پشتیبانی از برنامههایی که نمیتوانند چنین استثناهایی را تحمل کنند، میتوان ازCalendar.itermonthdays3وCalendar.itermonthdays4جدید استفاده کرد. متدهای جدید تاپل برمیگردانند و محدود به محدودهی پشتیبانیشده توسطdatetime.dateنیستند. (مشارکت Alexander Belopolsky در bpo-28292.)collections.ChainMapاکنون ترتیب نگاشتهای زیرین را حفظ میکند. (مشارکت Raymond Hettinger در bpo-32792.)متد
submit()ازconcurrent.futures.ThreadPoolExecutorوconcurrent.futures.ProcessPoolExecutorاکنون در صورت فراخوانی در حین خاموشی مفسر،RuntimeErrorایجاد میکند. (مشارکتشده توسط Mark Nemec در bpo-33097.)سازندهی
configparser.ConfigParserاکنون ازread_dict()برای پردازش مقادیر پیشفرض استفاده میکند که رفتار آن را با سایر بخشهای پارسر سازگار میسازد. کلیدها و مقادیر غیررشتهای در دیکشنری پیشفرضها اکنون بهصورت ضمنی به رشته تبدیل میشوند. (مشارکتشده توسط James Tocknell در bpo-23835.)چندین ایمپورت داخلی مستندنشده حذف شدند. یک نمونه این است که
os.errnoدیگر در دسترس نیست؛ بهجای آن مستقیماًimport errnoرا به کار ببرید. توجه داشته باشید که چنین ایمپورتهای داخلی مستندنشدهای ممکن است در هر زمان و بدون اطلاع قبلی حذف شوند، حتی در انتشارهای نسخهی میکرو.
تغییرات در API زبان C¶
تابع PySlice_GetIndicesEx() برای دنبالههای قابل تغییر اندازه ناامن در نظر گرفته میشود. اگر اندیسهای اسلایس نمونههایی از int نباشند، بلکه اشیایی باشند که متد __index__() را پیادهسازی کرده باشند، اندازهی دنباله میتواند پس از ارسال طول آن به PySlice_GetIndicesEx() تغییر کند. این میتواند منجر به برگرداندن اندیسهایی خارج از طول دنباله شود. برای پرهیز از مشکلات احتمالی، از توابع جدید PySlice_Unpack() و PySlice_AdjustIndices() استفاده کنید. (ارائهشده توسط Serhiy Storchaka در bpo-27867.)
تغییرات بایتکد سیپایتون¶
دو آپکد جدید وجود دارد: LOAD_METHOD و CALL_METHOD. (مشارکتشده توسط Yury Selivanov و INADA Naoki در bpo-26110.)
آپکد STORE_ANNOTATION حذف شده است. (مشارکتشده توسط Mark Shannon در bpo-32550.)
تغییرات مخصوص ویندوز¶
پروندهای که برای بازنویسی sys.path استفاده میشود، اکنون به جای 'sys.path'، <python-executable>._pth نام دارد. برای اطلاعات بیشتر به یافتن ماژولها مراجعه کنید. (مشارکتشده توسط استیو داور در bpo-28137.)
سایر تغییرات پیادهسازی سیپایتون¶
در آمادهسازی برای تغییرات بالقوهی آتی در API عمومی مقداردهی اولیهی رانتایم سیپایتون (برای مشاهدهی پیشنویس اولیه اما تا حدی قدیمیشده، به PEP 432 مراجعه کنید)، منطق راهاندازی داخلی و مدیریت پیکربندی سیپایتون بهطور قابل توجهی بازآرایی شده است. اگرچه این بهروزرسانیها قرار است برای برنامههای تعبیهشده و کاربران رابط خط فرمان معمولی سیپایتون کاملاً شفاف باشند، در اینجا به آنها اشاره میشود زیرا بازآرایی، ترتیب داخلی عملیات گوناگون را در طول راهاندازی مفسر تغییر میدهد و از این رو ممکن است نقصهای نهفتهی پیشین را، چه در برنامههای تعبیهشده و چه در خود سیپایتون، آشکار کند. (در ابتدا توسط Nick Coghlan و Eric Snow بهعنوان بخشی از bpo-22257 ارائه شد و سپس توسط Nick، Eric و Victor Stinner در شماری از موارد دیگر بهروزرسانی شد). برخی از جزئیات شناختهشده که تحت تأثیر قرار میگیرند:
PySys_AddWarnOptionUnicode()در حال حاضر برای برنامههای تعبیهکننده قابل استفاده نیست، زیرا ایجاد یک شیء یونیکد پیش از فراخوانیPy_Initializeالزامی است. به جای آن ازPySys_AddWarnOption()استفاده کنید.فیلترهای هشداری که یک برنامه تعبیهکننده با استفاده از
PySys_AddWarnOption()اضافه کرده است، اکنون باید بهطور سازگارتری بر فیلترهای پیشفرض تنظیمشده توسط مفسر تقدم داشته باشند
به دلیل تغییراتی در نحوهی پیکربندی فیلترهای پیشفرض هشدار، تنظیم Py_BytesWarningFlag به مقداری بزرگتر از یک، دیگر برای هم صدور پیامهای BytesWarning و هم تبدیل آنها به استثنا کافی نیست. در عوض، باید این پرچم تنظیم شود (تا هشدارها در وهلهی اول نشان داده شوند) و یک فیلتر هشدار صریح error::BytesWarning برای تبدیل آنها به استثنا اضافه شود.
به دلیل تغییری در نحوهی برخورد کامپایلر با رشتههای مستند، return None ضمنی در بدنهی تابعی که تنها از یک رشتهی مستند تشکیل شده است، اکنون بهعنوان رخداده در همان سطرِ رشتهی مستند علامتگذاری میشود، نه در سطرِ سرآیند تابع.
وضعیت فعلی استثنا از شیء فریم به همروال منتقل شده است. این تغییر مفسر را سادهتر کرد و چند اشکال مبهمی را که به دلیل تعویض وضعیت استثنا هنگام ورود به یک تولیدگر یا خروج از آن ایجاد میشدند، برطرف کرد. (با مشارکت Mark Shannon در bpo-25612.)
تغییرات قابل توجه در پایتون 3.7.1¶
از نسخهی 3.7.1 به بعد، Py_Initialize() اکنون بهطور سازگار همهی همان تنظیمات محیطی مشابه Py_Main() را میخواند و رعایت میکند (در نسخههای پیشین پایتون، زیرمجموعهای که بهخوبی تعریف نشده بود از آن متغیرهای محیطی را رعایت میکرد، در حالی که در پایتون 3.7.0 به دلیل bpo-34247 هیچیک از آنها را نمیخواند). اگر این رفتار ناخواسته است، مقدار Py_IgnoreEnvironmentFlag را پیش از فراخوانی Py_Initialize() برابر 1 قرار دهید.
در 3.7.1، C API برای متغیرهای زمینه بهروزرسانی شد تا از اشارهگرهای PyObject استفاده کند. همچنین bpo-34762 را ببینید.
در نسخهی 3.7.1 ماژول tokenize اکنون زمانی که ورودیای که سطر جدید پایانی ندارد به آن ارائه شود، بهطور ضمنی یک توکن NEWLINE منتشر میکند. این رفتار اکنون با آنچه توکنساز C بهطور داخلی انجام میدهد مطابقت دارد. (مشارکتشده توسط Ammar Askar در bpo-33899.)
تغییرات قابل توجه در پایتون 3.7.2¶
در نسخهی 3.7.2، venv در ویندوز دیگر پروندههای دودویی اصلی را کپی نمیکند، بلکه در عوض اسکریپتهای تغییر مسیر (redirector) با نامهای python.exe و pythonw.exe ایجاد میکند. این امر مشکل دیرینهای را حل میکند که طی آن تمام محیطهای مجازی میبایست با هر بهروزرسانی پایتون ارتقا داده شوند یا بازسازی شوند. با این حال، توجه داشته باشید که این نسخه همچنان برای دریافت اسکریپتهای جدید به بازسازی محیطهای مجازی نیاز خواهد داشت.
تغییرات قابل توجه در پایتون 3.7.6¶
به دلیل نگرانیهای امنیتی قابلتوجه، پارامتر reuse_address از asyncio.loop.create_datagram_endpoint() دیگر پشتیبانی نمیشود. دلیل آن، رفتار گزینهی سوکت SO_REUSEADDR در UDP است. برای جزئیات بیشتر، به مستندات loop.create_datagram_endpoint() مراجعه کنید. (مشارکت توسط Kyle Stanley، Antoine Pitrou و Yury Selivanov در bpo-37228.)
تغییرات قابل توجه در پایتون 3.7.10¶
در نسخههای پیشین پایتون، استفاده از هر دو ; و & بهعنوان جداکنندههای پارامتر پرسوجو در urllib.parse.parse_qs() و urllib.parse.parse_qsl() مجاز بود. بهدلیل نگرانیهای امنیتی، و برای انطباق با توصیههای جدیدتر W3C، این رفتار تغییر کرده است تا تنها یک کلید جداکننده مجاز باشد، که & مقدار پیشفرض آن است. این تغییر بر cgi.parse() و cgi.parse_multipart() نیز اثر میگذارد، زیرا آنها بهصورت داخلی از توابع مذکور استفاده میکنند. برای جزئیات بیشتر، لطفاً به مستندات مربوط به هر یک از آنها مراجعه کنید. (مشارکتشده توسط Adam Goldschmidt، Senthil Kumaran و Ken Jin در bpo-42967.)
تغییرات قابل توجه در پایتون 3.7.11¶
یک اصلاحیه امنیتی رفتار 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)
ویژگی امنیتی قابل توجه در 3.7.14¶
تبدیل بین int و str در مبناهایی غیر از ۲ (دودویی)، ۴، ۸ (مبنای هشت)، ۱۶ (مبنای شانزده) یا ۳۲ — مانند مبنای ۱۰ (دهدهی) — اکنون در صورتی که تعداد ارقام در شکل رشتهای از حدی بیشتر باشد، یک ValueError ایجاد میکند تا از حملات احتمالی انکار سرویس به دلیل پیچیدگی الگوریتمی جلوگیری شود. این یک اقدام کاهشدهنده برای CVE 2020-10735 است. این محدودیت را میتوان از طریق متغیر محیطی، پرچم خط فرمان یا APIهای sys پیکربندی یا غیرفعال کرد. مستندات محدودیت طول تبدیل رشتهای اعداد صحیح را ببینید. محدودیت پیشفرض ۴۳۰۰ رقم در شکل رشتهای است.