این مقاله قابلیتهای جدید پایتون 3.8 را در مقایسه با 3.7 توضیح میدهد. پایتون 3.8 در ۱۴ اکتبر ۲۰۱۹ منتشر شد. برای جزئیات کامل، به فهرست تغییرات مراجعه کنید.
ویژگیهای جدید¶
عبارتهای انتساب¶
سینتکس جدید := وجود دارد که بهعنوان بخشی از یک عبارت بزرگتر، مقادیر را به متغیرها انتساب میدهد. این عملگر بهخاطر شباهتش به چشمها و عاجهای یک گراز دریایی، با محبت «عملگر گراز دریایی» نامیده میشود.
در این مثال، عبارت انتساب به جلوگیری از فراخوانی دوبارهی len() کمک میکند:
if (n := len(a)) > 10:
print(f"List is too long ({n} elements, expected <= 10)")
منفعتی مشابه در حین تطبیق عبارت باقاعده پدید میآید که در آن اشیاء تطبیق دو بار مورد نیاز هستند، یک بار برای آزمودن اینکه آیا تطبیقی رخ داده است و بار دیگر برای استخراج یک زیرگروه:
discount = 0.0
if (mo := re.search(r'(\d+)% discount', advertisement)):
discount = float(mo.group(1)) / 100.0
این عملگر همچنین با حلقههای while که مقداری را برای آزمودن خاتمه حلقه محاسبه میکنند و سپس در بدنه حلقه دوباره به همان مقدار نیاز دارند، مفید است:
# Loop over fixed length blocks
while (block := f.read(256)) != '':
process(block)
مورد استفادهی انگیزشی دیگری در درکهای فهرستی رخ میدهد که در آنها مقداری که در شرط فیلتر محاسبه میشود، در بدنهی عبارت نیز مورد نیاز است:
[clean_name.title() for name in names
if (clean_name := normalize('NFC', name)) in allowed_names]
سعی کنید استفاده از عملگر گراز دریایی را به موارد تمیزی محدود کنید که پیچیدگی را کاهش میدهند و خوانایی را بهبود میبخشند.
برای توضیح کامل به PEP 572 مراجعه کنید.
(مشارکتشده توسط Emily Morehouse در bpo-35224.)
پارامترهای صرفاً جایگاهی¶
یک سینتکس جدید / برای پارامترهای تابع وجود دارد که نشان میدهد برخی پارامترهای تابع باید بهصورت جایگاهی مشخص شوند و نمیتوان از آنها بهعنوان آرگومان کلیدواژهای استفاده کرد. این همان نمادی است که help() برای توابع C حاشیهنویسیشده با ابزار Argument Clinic لری هستینگز نمایش میدهد.
در مثال زیر، پارامترهای a و b فقط جایگاهی هستند، در حالی که c یا d میتوانند جایگاهی یا کلیدواژهای باشند و e یا f باید کلیدواژهای باشند:
def f(a, b, /, c, d, *, e, f):
print(a, b, c, d, e, f)
فراخوانی زیر معتبر است:
f(10, 20, 30, d=40, e=50, f=60)
با این حال، اینها فراخوانیهای نامعتبر هستند:
f(10, b=20, c=30, d=40, e=50, f=60) # b cannot be a keyword argument
f(10, 20, 30, 40, 50, f=60) # e must be a keyword argument
یکی از موارد کاربرد این نمادگذاری این است که به توابع پایتون خالص اجازه میدهد رفتار توابع موجودی را که به زبان C نوشته شدهاند، بهطور کامل تقلید کنند. برای مثال، تابع توکار divmod() آرگومانهای کلیدواژهای را نمیپذیرد:
def divmod(a, b, /):
"Emulate the built in divmod() function"
return (a // b, a % b)
مورد استفادهی دیگر، جلوگیری از آرگومانهای کلیدواژهای در حالتی است که نام پارامتر سودمند نباشد. برای مثال، تابع توکار len() امضای len(obj, /) را دارد. این امر مانع از فراخوانیهای ناخوشایندی مانند موارد زیر میشود:
len(obj='hello') # آرگومان کلیدواژهای «obj» خوانایی را مختل میکند
مزیت دیگر علامتگذاری یک پارامتر بهعنوان فقطجایگاهی این است که نام پارامتر را میتوان در آینده بدون خطر خراب شدن کد کلاینت تغییر داد. برای مثال، در ماژول statistics، نام پارامتر dist ممکن است در آینده تغییر کند. این امر با مشخصات تابع زیر ممکن شد:
def quantiles(dist, /, *, n=4, method='exclusive')
...
از آنجا که پارامترهای سمت چپِ / بهعنوان کلیدواژههای ممکن عرضه نمیشوند، نامهای پارامترها همچنان برای استفاده در **kwargs در دسترس باقی میمانند:
>>> def f(a, b, /, **kwargs):
... print(a, b, kwargs)
...
>>> f(10, 20, a=1, b=2, c=3) # a and b are used in two ways
10 20 {'a': 1, 'b': 2, 'c': 3}
این امر پیادهسازی توابع و متدهایی را که باید آرگومانهای کلیدواژهای دلخواه بپذیرند، بهطور چشمگیری ساده میکند. برای مثال، در ادامه بخشی از کد ماژول collections آمده است:
class Counter(dict):
def __init__(self, iterable=None, /, **kwds):
# Note "iterable" is a possible keyword argument
برای توضیح کامل به PEP 570 مراجعه کنید.
(مشارکتشده توسط Pablo Galindo در bpo-36540.)
نهانگاه موازی سامانه فایلبندی برای پروندههای بایتکد کامپایلشده¶
تنظیم جدید PYTHONPYCACHEPREFIX (که بهصورت -X pycache_prefix نیز در دسترس است) نهانگاه بایتکد ضمنی را پیکربندی میکند تا بهجای زیرپوشههای پیشفرض __pycache__ در هر پوشهی منبع، از یک درخت سامانه فایلبندی موازی جداگانه استفاده کند.
مکان نهانگاه در sys.pycache_prefix گزارش میشود (None نشاندهندهی مکان پیشفرض در زیرپوشههای __pycache__ است).
(مشارکتشده توسط کارل مایر در bpo-33499.)
ساخت اشکالزدایی از همان ABI ساخت انتشار استفاده میکند¶
ABI نسخههای اشکالزدایی پایتون اکنون با نسخههای انتشار پایتون سازگار است. در یونیکس، هنگامی که پایتون در حالت اشکالزدایی ساخته میشود، اکنون میتوان ماژولهای توسعهای C ساختهشده در حالت انتشار و ماژولهای توسعهای C ساختهشده با استفاده از ABI پایدار را بارگذاری کرد. برعکس این موضوع صادق نیست، زیرا نسخههای اشکالزدایی نمادهای اضافیای را نمایان میکنند که در نسخههای انتشار در دسترس نیستند.
تعریف ماکروی Py_DEBUG دیگر مستلزم تعریف ماکروی Py_TRACE_REFS نیست، که این امر تنها ناسازگاری ABI را ایجاد میکند. ماکروی Py_TRACE_REFS، که تابع sys.getobjects() و متغیر محیطی PYTHONDUMPREFS را اضافه میکند، میتواند با استفاده از گزینهی ساخت جدید ./configure --with-trace-refs تنظیم شود. (نوشتهشده توسط ویکتور استینر در bpo-36465.)
در یونیکس، ماژولهای توسعهای C دیگر به libpython پیوند نمیشوند، بهجز در اندروید و Cygwin. اکنون پایتونِ پیوندشده بهصورت ایستا میتواند یک ماژول توسعهای C را که با استفاده از پایتونِ کتابخانهاشتراکی ساختهشده است، بارگذاری کند. (مشارکتشده توسط Victor Stinner در bpo-21536.)
در یونیکس، هنگامی که پایتون در حالت اشکالزدایی ساخته میشود، ایمپورت اکنون ماژولهای توسعهای C کامپایلشده در حالت انتشار و ماژولهای توسعهای C کامپایلشده با ABI پایدار را نیز جستوجو میکند. (مشارکتشده توسط Victor Stinner در bpo-36722.)
برای تعبیه کردن پایتون در یک برنامه، باید گزینهی جدید --embed به python3-config --libs --embed داده شود تا -lpython3.8 به دست آید (پیوند دادن برنامه به libpython). برای پشتیبانی از هر دو نسخهی 3.8 و نسخههای قدیمیتر، ابتدا python3-config --libs --embed را امتحان کنید و در صورت شکست فرمان قبلی، بهعنوان جایگزین از python3-config --libs (بدون --embed) استفاده کنید.
یک ماژول pkg-config python-3.8-embed برای تعبیه پایتون در یک برنامه اضافه شد: pkg-config python-3.8-embed --libs شامل -lpython3.8 است. برای پشتیبانی از هر دو 3.8 و نسخههای قدیمیتر، ابتدا pkg-config python-X.Y-embed --libs را امتحان کنید و اگر دستور قبلی شکست بخورد، به pkg-config python-X.Y --libs (بدون --embed) بهعنوان جایگزین روی بیاورید (بهجای X.Y نسخه پایتون را قرار دهید).
از سوی دیگر، pkg-config python3.8 --libs دیگر شامل -lpython3.8 نیست. ماژولهای توسعهای C نباید به libpython پیوند داده شوند (بهجز در Android و Cygwin که مواردشان توسط اسکریپت مدیریت میشود)؛ این تغییر عمداً ناسازگار با نسخههای پیشین است. (مشارکتشده توسط Victor Stinner در bpo-36721.)
افاسترینگها = را برای عبارتهای خودمستند و اشکالزدایی پشتیبانی میکنند¶
مشخصکنندهی = به افاسترینگها اضافه شد. افاسترینگی مانند f'{expr=}' به متن عبارت، یک علامت تساوی و سپس بازنمایی عبارت ارزیابیشده بسط مییابد. برای مثال:
>>> import datetime as dt
>>> user = 'eric_idle'
>>> member_since = dt.date(1975, 7, 31)
>>> f'{user=} {member_since=}'
"user='eric_idle' member_since=datetime.date(1975, 7, 31)"
مشخصکنندههای معمول قالب افاسترینگ به شما اجازه میدهند کنترل بیشتری بر نحوهی نمایش نتیجهی عبارت داشته باشید:
>>> delta = dt.date.today() - member_since
>>> f'{user=!s} {delta.days=:,d}'
'user=eric_idle delta.days=16,075'
مشخصکنندهی = کل عبارت را نمایش میدهد تا بتوان محاسبات را نشان داد:
>>> print(f'{theta=} {cos(radians(theta))=:.3f}')
theta=30 cos(radians(theta))=0.866
(با مشارکت اریک وی. اسمیت و لری هیستینگز در bpo-36817.)
PEP 578: قلابهای حسابرسی رانتایم پایتون¶
این PEP یک قلاب حسابرسی (Audit Hook) و یک قلاب باز کردن تأییدشده (Verified Open Hook) اضافه میکند. هر دو از پایتون و کد بومی در دسترساند و به برنامهها و چارچوبهای نوشتهشده با کد پایتون خالص اجازه میدهند از اعلانهای اضافی بهره ببرند، در حالی که به تعبیهکنندگان یا مدیران سیستم نیز اجازه میدهند نسخههایی از پایتون را مستقر کنند که در آنها حسابرسی همیشه فعال است.
برای جزئیات کامل به PEP 578 مراجعه کنید.
PEP 587: پیکربندی راهاندازی پایتون¶
PEP 587 یک C API جدید برای پیکربندی راهاندازی پایتون اضافه میکند که کنترل دقیقتری بر کل پیکربندی و گزارشدهی خطای بهتری فراهم میکند.
ساختارهای جدید:
توابع جدید:
این PEP همچنین فیلدهای _PyRuntimeState.preconfig (از نوع PyPreConfig) و PyInterpreterState.config (از نوع PyConfig) را به این ساختارهای داخلی اضافه میکند. PyInterpreterState.config به پیکربندی مرجع جدید تبدیل میشود و متغیرهای پیکربندی سراسری و سایر متغیرهای خصوصی را جایگزین میکند.
برای مستندات به پیکربندی مقداردهی اولیه پایتون مراجعه کنید.
برای توضیح کامل به PEP 587 مراجعه کنید.
(مشارکتشده توسط Victor Stinner در bpo-36763.)
PEP 590: Vectorcall: پروتکل فراخوانی سریع برای سیپایتون¶
پروتکل Vectorcall به Python/C API افزوده شده است. هدف آن رسمیت بخشیدن به بهینهسازیهای موجودی است که پیشتر برای کلاسهای مختلف انجام شده بودند. هر نوع ایستا که یک فراخوانیپذیر را پیادهسازی میکند میتواند از این پروتکل استفاده کند.
این در حال حاضر آزمایشی است. هدف این است که در Python 3.9 بهطور کامل عمومی شود.
برای توضیح کامل به PEP 590 مراجعه کنید.
(با مشارکت Jeroen Demeyer، Mark Shannon و Petr Viktorin در bpo-36974.)
پروتکل 5 پیکل با بافرهای دادهی خارج از باند (out-of-band)¶
هنگامی که pickle برای انتقال دادههای حجیم بین فرایندهای پایتون به منظور بهرهگیری از پردازش چندهستهای یا چندماشینی استفاده میشود، مهم است که انتقال را با کاهش رونوشتهای حافظه و در صورت امکان با بهکارگیری تکنیکهای سفارشی مانند فشردهسازی وابسته به داده بهینه کنید.
پروتکل ۵ ماژول pickle پشتیبانی از بافرهای خارج از باند (out-of-band) را معرفی میکند که در آن، دادههای سازگار با PEP 3118 میتوانند به تشخیص لایه ارتباطی، بهصورت جداگانه از جریان اصلی پیکل منتقل شوند.
برای توضیح کامل به PEP 574 مراجعه کنید.
(مشارکتشده توسط Antoine Pitrou در bpo-36785.)
ماژولهای بهبودیافته¶
ast¶
گرههای AST اکنون ویژگیهای end_lineno و end_col_offset را دارند که موقعیت دقیق انتهای گره را مشخص میکنند. (این فقط به گرههایی اعمال میشود که ویژگیهای lineno و col_offset را دارند.)
تابع جدید ast.get_source_segment() کد منبع مربوط به یک گره AST مشخص را برمیگرداند.
(مشارکت Ivan Levkivskyi در bpo-33416.)
تابع ast.parse() چند پرچم جدید دارد:
type_comments=True باعث میشود متن کامنتهای نوع PEP 484 و PEP 526 مرتبط با گرههای معینی از درخت سینتکس انتزاعی (AST) بازگردانده شود؛
میتوان از mode='func_type' برای تجزیهی «کامنتهای نوع امضا»ی PEP 484 (که برای گرههای AST تعریف تابع برگردانده میشوند) استفاده کرد؛
feature_version=(3, N) به شما اجازه میدهد نسخهی قدیمیتری از پایتون ۳ را مشخص کنید. برای مثال، feature_version=(3, 4) async و await را بهعنوان واژههای رزرونشده در نظر میگیرد.
(مشارکتشده توسط Guido van Rossum در bpo-35766.)
asyncio¶
asyncio.run() از API آزمایشی به API پایدار ارتقا یافته است. میتوان از این تابع برای اجرای یک coroutine و برگرداندن نتیجه، همراه با مدیریت خودکار حلقه رویداد استفاده کرد. برای مثال:
import asyncio
async def main():
await asyncio.sleep(0)
return 42
asyncio.run(main())
این تقریباً معادل است با:
import asyncio
async def main():
await asyncio.sleep(0)
return 42
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
try:
loop.run_until_complete(main())
finally:
asyncio.set_event_loop(None)
loop.close()
پیادهسازی واقعی بهطور قابلتوجهی پیچیدهتر است. بنابراین، asyncio.run() باید روش ترجیحی برای اجرای برنامههای asyncio باشد.
(مشارکتشده توسط یوری سلیوانوف در bpo-32314.)
اجرای python -m asyncio یک REPL ذاتاً ناهمگام را راهاندازی میکند. این امر امکان آزمایش سریع با کدی را فراهم میکند که دارای await در سطح بالاست. دیگر نیازی به فراخوانی مستقیم asyncio.run() نیست؛ تابعی که در هر فراخوانی یک حلقه رویداد جدید ایجاد میکرد:
$ python -m asyncio
asyncio REPL 3.8.0
Use "await" directly instead of "asyncio.run()".
Type "help", "copyright", "credits" or "license" for more information.
>>> import asyncio
>>> await asyncio.sleep(10, result='hello')
hello
(مشارکتشده توسط Yury Selivanov در bpo-37028.)
استثنای asyncio.CancelledError اکنون از BaseException به جای Exception ارثبری میکند و دیگر از concurrent.futures.CancelledError ارثبری نمیکند. (مشارکتشده توسط یوری سلیوانوف در bpo-32528.)
در ویندوز، حلقه رویداد پیشفرض اکنون ProactorEventLoop است. (مشارکتشده توسط ویکتور استینر در bpo-34687.)
ProactorEventLoop اکنون از UDP نیز پشتیبانی میکند. (با مشارکت Adam Meily و Andrew Svetlov در bpo-29883.)
ProactorEventLoop اکنون میتواند توسط KeyboardInterrupt ("CTRL+C") قطع شود. (مشارکتشده توسط ولادیمیر ماتویف در bpo-23057.)
asyncio.Task.get_coro() برای گرفتن همروالِ پوششدادهشده درون یک asyncio.Task اضافه شد. (با مشارکت Alex Grönholm در bpo-36999.)
اکنون میتوان وظایف asyncio را نامگذاری کرد، یا با ارسال آرگومان کلیدواژهای name به asyncio.create_task() یا متد حلقه رویداد create_task()، یا با فراخوانی متد set_name() روی شیء وظیفه. نام وظیفه در خروجی repr() asyncio.Task قابل مشاهده است و همچنین میتوان آن را با استفاده از متد get_name() بازیابی کرد. (مشارکتشده توسط الکس گرونهولم در bpo-34270.)
پشتیبانی از Happy Eyeballs به asyncio.loop.create_connection() اضافه شد. برای مشخص کردن این رفتار، دو پارامتر جدید اضافه شدهاند: happy_eyeballs_delay و interleave. الگوریتم Happy Eyeballs با تلاش برای برقراری اتصال همزمان با استفاده از هر دو، پاسخگویی برنامههایی را که از IPv4 و IPv6 پشتیبانی میکنند بهبود میبخشد. (مشارکتشده توسط twisteroid ambassador در bpo-33530.)
توکارها¶
تابع توکار compile() بهبود یافته است تا پرچم ast.PyCF_ALLOW_TOP_LEVEL_AWAIT را بپذیرد. با پاس داده شدن این پرچم جدید، compile() اجازه خواهد داد از ساختارهای await، async for و async with در سطح بالا که معمولاً سینتکس نامعتبر در نظر گرفته میشوند، استفاده شود. سپس ممکن است شیء کد ناهمگامی که با پرچم CO_COROUTINE علامتگذاریشده است، بازگردانده شود. (مشارکت Matthias Bussonnier در bpo-34616)
collections¶
متد _asdict() برای collections.namedtuple() اکنون بهجای collections.OrderedDict یک dict بازمیگرداند. این امر ممکن است زیرا دیکشنریهای معمولی از پایتون 3.7 به بعد ترتیب تضمینشده دارند. اگر به ویژگیهای اضافی OrderedDict نیاز باشد، راهحل پیشنهادی، تبدیل نوع نتیجه به نوع دلخواه است: OrderedDict(nt._asdict()). (مشارکتشده توسط Raymond Hettinger در bpo-35864.)
cProfile¶
کلاس cProfile.Profile اکنون میتواند بهعنوان یک مدیر زمینه استفاده شود. برای پروفایلگیری از یک بلوک کد، آن را به این صورت اجرا کنید:
import cProfile
with cProfile.Profile() as profiler:
# code to be profiled
...
(با مشارکت اسکات ساندرسون در bpo-29235.)
curses¶
متغیر جدیدی که اطلاعات نسخهی ساختاریافتهی کتابخانهی زیربنایی ncurses را نگه میدارد، اضافه شد: ncurses_version. (مشارکتشده توسط Serhiy Storchaka در bpo-31680.)
ctypes¶
در ویندوز، CDLL و زیرکلاسهای آن اکنون یک پارامتر winmode را میپذیرند تا پرچمهایی برای فراخوانی زیرین LoadLibraryEx مشخص کنند. پرچمهای پیشفرض بهگونهای تنظیم شدهاند که وابستگیهای DLL فقط از مکانهای مورد اعتماد بارگذاری شوند، از جمله مسیری که DLL در آن ذخیره شده است (اگر مسیر کامل یا جزئی برای بارگذاری DLL اولیه استفاده شود) و مسیرهایی که توسط add_dll_directory() اضافه شدهاند. (مشارکتشده توسط Steve Dower در bpo-36085.)
functools¶
@functools.lru_cache اکنون میتواند مستقیماً بهعنوان یک دکوراتور استفاده شود، نه بهعنوان تابعی که یک دکوراتور برمیگرداند. بنابراین هر دو مورد زیر اکنون پشتیبانی میشوند:
@lru_cache
def f(x):
...
@lru_cache(maxsize=256)
def f(x):
...
(مشارکتشده توسط Raymond Hettinger در bpo-36772.)
دکوراتور جدید @functools.cached_property برای ویژگیهای محاسبهشدهای که در طول عمر نمونه در نهانگاه ذخیره میشوند، اضافه شد.
import functools
import statistics
class Dataset:
def __init__(self, sequence_of_numbers):
self.data = sequence_of_numbers
@functools.cached_property
def variance(self):
return statistics.variance(self.data)
(مشارکتشده توسط کارل مایر در bpo-21145)
یک دکوراتور جدید functools.singledispatchmethod() اضافه شد که متدها را با استفاده از ارسال تکگانه به توابع عام تبدیل میکند:
from functools import singledispatchmethod
from contextlib import suppress
class TaskManager:
def __init__(self, tasks):
self.tasks = list(tasks)
@singledispatchmethod
def discard(self, value):
with suppress(ValueError):
self.tasks.remove(value)
@discard.register(list)
def _(self, tasks):
targets = set(tasks)
self.tasks = [x for x in self.tasks if x not in targets]
(مشارکتشده توسط Ethan Smith در bpo-32380)
تابع get_objects() اکنون میتواند یک پارامتر اختیاری نسل بپذیرد که مشخص میکند اشیاء از کدام نسل دریافت شوند. (مشارکتشده توسط Pablo Galindo در bpo-36016.)
gettext¶
pgettext() و گونههای آن افزوده شدند. (مشارکت Franz Glasner، Éric Araujo و Cheryl Sabella در bpo-2504.)
gzip¶
پارامتر mtime به gzip.compress() برای خروجی قابل بازتولید اضافه شد. (مشارکتشده توسط Guo Ci Teo در bpo-34898.)
اکنون برای برخی انواع پروندههای gzip نامعتبر یا خراب، بهجای OSError استثنای BadGzipFile مطرح میشود. (مشارکتشده توسط Filip Gruszczyński، Michele Orrù و Zackery Spytz در bpo-6584.)
IDLE و idlelib¶
خروجی بیش از N سطر (بهطور پیشفرض ۵۰) به یک دکمه فشرده میشود. مقدار N را میتوان در بخش PyShell از صفحهی عمومی پنجره تنظیمات تغییر داد. سطرهای کمتر، اما احتمالاً بسیار طولانی، را میتوان با راستکلیک روی خروجی فشرده کرد. خروجی فشردهشده را میتوان با دوبار کلیک روی دکمه، در همانجا گسترش داد، یا با راستکلیک روی دکمه، به کلیپبورد یا پنجرهای جداگانه گسترش داد. (ارائهشده توسط Tal Einat در bpo-1529353.)
افزودن «Run Customized» به منوی Run برای اجرای یک ماژول با تنظیمات سفارشی. هر آرگومان خط فرمانی که وارد شود، به sys.argv افزوده میشود. آنها همچنین برای اجرای سفارشی بعدی دوباره در کادر ظاهر میشوند. همچنین میتوان از راهاندازی مجدد عادی ماژول اصلی پوسته جلوگیری کرد. (مشارکتشده توسط Cheryl Sabella، Terry Jan Reedy و دیگران در bpo-5680 و bpo-37627.)
شمارههای سطر اختیاری برای پنجرههای ویرایشگر IDLE اضافه شد. پنجرهها بدون شماره سطر باز میشوند، مگر آنکه در زبانهی General گفتوگوی پیکربندی بهگونهای دیگر تنظیم شده باشد. شماره سطرهای یک پنجرهی موجود از طریق منوی Options نمایش داده و پنهان میشوند. (مشارکتشده توسط Tal Einat و Saimadhav Heblikar در bpo-17535.)
اکنون برای تبدیل بین رشتههای پایتون و اشیای Tcl از کدگذاری بومی سیستمعامل استفاده میشود. این امر به IDLE اجازه میدهد با ایموجی و سایر نویسههای خارج از صفحه چندزبانه پایه (non-BMP) کار کند. این نویسهها میتوانند نمایش داده شوند یا به کلیپبورد کپی و از آن جایگذاری شوند. تبدیل رشتهها از Tcl به پایتون و برعکس دیگر هرگز شکست نمیخورد. (بسیاری از افراد هشت سال روی این مسئله کار کردند، اما مشکل سرانجام توسط Serhiy Storchaka در bpo-13153 حل شد.)
افزودهشده در نسخه 3.8.1:
افزودن گزینهای برای خاموش کردن چشمکزدن مکاننما. (با مشارکت Zackery Spytz در bpo-4603.)
کلید Escape اکنون پنجرههای تکمیل IDLE را میبندد. (مشارکتشده توسط Johnny Najera در bpo-38944.)
تغییرات فوق به نسخههای نگهداری 3.7 بکپورت شدهاند.
کلیدواژهها به فهرست تکمیل نام ماژول افزوده شدند. (مشارکتشده توسط Terry J. Reedy در bpo-37765.)
inspect¶
تابع inspect.getdoc() اکنون میتواند رشتههای مستند را برای __slots__ بیابد، اگر آن ویژگی یک dict باشد که مقادیر آن رشتههای مستند باشند. این کار گزینههای مستندسازی مشابه آنچه از قبل برای @property، @classmethod و @staticmethod داریم فراهم میکند:
class AudioClip:
__slots__ = {'bit_rate': 'expressed in kilohertz to one decimal place',
'duration': 'in seconds, rounded up to an integer'}
def __init__(self, bit_rate, duration):
self.bit_rate = round(bit_rate / 1000.0, 1)
self.duration = ceil(duration)
(مشارکتشده توسط Raymond Hettinger در bpo-36326.)
در حالت توسعه (-X env) و در ساخت اشکالزدایی، نهاییساز io.IOBase اکنون در صورتی که متد close() شکست بخورد، استثنا را گزارشگیری میکند. در ساخت انتشار، این استثنا بهطور پیشفرض بهصورت بیصدا نادیده گرفته میشود. (مشارکتشده توسط Victor Stinner در bpo-18748.)
itertools¶
تابع itertools.accumulate() یک آرگومان کلیدواژهای initial اختیاری برای تعیین مقدار اولیه اضافه کرد:
>>> from itertools import accumulate
>>> list(accumulate([10, 5, 30, 15], initial=1000))
[1000, 1010, 1015, 1045, 1060]
(مشارکتشده توسط لیزا روچ در bpo-34659.)
json.tool¶
افزودن گزینهی --json-lines برای تجزیهی هر سطر ورودی به عنوان یک شیء JSON جداگانه. (با مشارکت Weipeng Hong در bpo-31553.)
logging¶
آرگومان کلیدواژهای force به logging.basicConfig() اضافه شد. هنگامی که روی true تنظیم شود، هر هندلر موجود متصل به گزارشگیر ریشه، پیش از انجام پیکربندی مشخصشده توسط آرگومانهای دیگر، حذف و بسته میشود.
این یک مشکل دیرینه را حل میکند. پس از آنکه یک گزارشگیر یا basicConfig() فراخوانی شده بود، فراخوانیهای بعدی basicConfig() بیسروصدا نادیده گرفته میشدند. این امر بهروزرسانی، آزمایش یا آموزش گزینههای مختلف پیکربندی گزارشگیری را با استفاده از اعلان تعاملی یا دفترچه Jupyter دشوار میکرد.
(پیشنهادشده توسط Raymond Hettinger، پیادهسازیشده توسط Donghee Na و بازبینیشده توسط Vinay Sajip در bpo-33897.)
math¶
تابع جدید math.dist() برای محاسبه فاصله اقلیدسی بین دو نقطه اضافه شد. (مشارکتشده توسط Raymond Hettinger در bpo-33089.)
تابع math.hypot() برای مدیریت ابعاد متعدد گسترش یافت. پیشتر، این تابع فقط حالت دوبعدی را پشتیبانی میکرد. (مشارکت Raymond Hettinger در bpo-33089.)
تابع جدید math.prod() بهعنوان تابعی مشابه sum() اضافه شد که حاصلضرب یک مقدار 'start' (پیشفرض: ۱) در یک پیمایشپذیر از اعداد را برمیگرداند:
>>> prior = 0.8
>>> likelihoods = [0.625, 0.84, 0.30]
>>> math.prod(likelihoods, start=prior)
0.126
(مشارکتشده توسط Pablo Galindo در bpo-35606.)
دو تابع ترکیبیاتی جدید math.perm() و math.comb() افزوده شد:
>>> math.perm(10, 3) # Permutations of 10 things taken 3 at a time
720
>>> math.comb(10, 3) # Combinations of 10 things taken 3 at a time
120
(با مشارکت Yash Aggarwal، Keller Fuchs، Serhiy Storchaka و Raymond Hettinger در bpo-37128، bpo-37178 و bpo-35431.)
تابع جدید math.isqrt() برای محاسبه دقیق جذرهای صحیح بدون تبدیل به ممیز شناور افزوده شد. این تابع جدید از اعداد صحیح با هر اندازه دلخواه پشتیبانی میکند. این تابع از floor(sqrt(n)) سریعتر است، اما از math.sqrt() کندتر است:
>>> r = 650320427
>>> s = r ** 2
>>> isqrt(s - 1) # correct
650320426
>>> floor(sqrt(s - 1)) # incorrect
650320427
(مشارکتشده توسط مارک دیکینسون در bpo-36887.)
تابع math.factorial() دیگر آرگومانهایی را که شبهعدد صحیح (int-like) نیستند نمیپذیرد. (مشارکت Pablo Galindo در bpo-33083.)
تابع جدید add_dll_directory() در ویندوز اضافه شد تا مسیرهای جستجوی اضافی برای وابستگیهای بومی هنگام ایمپورت کردن ماژولهای توسعهای یا بارگذاری DLLها با استفاده از ctypes فراهم کند. (مشارکتشده توسط استیو داور در bpo-36085.)
تابع جدید os.memfd_create() برای پوشش دادن فراخوانی سیستمی memfd_create() اضافه شد. (با مشارکت Zackery Spytz و Christian Heimes در bpo-26836.)
در ویندوز، بخش زیادی از منطق دستی برای مدیریت نقاط تجزیه مجدد (reparse point) (شامل پیوندهای نمادین و اتصالهای پوشه) به سیستمعامل واگذار شده است. بهطور خاص، os.stat() اکنون از هر چیزی که توسط سیستمعامل پشتیبانی میشود عبور خواهد کرد، در حالی که os.lstat() تنها نقاط تجزیه مجددی را باز خواهد کرد که بهعنوان «جانشینهای نام» (name surrogates) شناسایی میشوند و سایر موارد به همان شیوهی os.stat() باز میشوند. در همهی موارد، S_IFLNK در os.stat_result.st_mode تنها برای پیوندهای نمادین تنظیم میشود و نه برای انواع دیگر نقاط تجزیه مجدد. برای شناسایی انواع دیگر نقاط تجزیه مجدد، ویژگی جدید os.stat_result.st_reparse_tag را بررسی کنید.
در ویندوز، os.readlink() اکنون میتواند اتصالهای پوشه را بخواند. توجه داشته باشید که islink() برای اتصالهای پوشه False را برمیگرداند، بنابراین کدی که ابتدا islink را بررسی میکند، همچنان اتصالها را بهعنوان پوشه در نظر میگیرد، در حالی که کدی که خطاهای os.readlink() را مدیریت میکند، ممکن است اکنون اتصالها را بهعنوان پیوند در نظر بگیرد.
(مشارکتشده توسط Steve Dower در bpo-37834.)
os.path¶
توابع os.path که نتیجهای بولی برمیگردانند، مانند exists()، lexists()، isdir()، isfile()، islink() و ismount()، اکنون برای مسیرهایی که حاوی نویسهها یا بایتهایی هستند که در سطح سیستمعامل قابل نمایش نیستند، به جای ایجاد ValueError یا زیرکلاسهای آن UnicodeEncodeError و UnicodeDecodeError، مقدار False برمیگردانند. (مشارکتشده توسط Serhiy Storchaka در bpo-33721.)
expanduser() در ویندوز اکنون متغیر محیطی USERPROFILE را ترجیح میدهد و از HOME استفاده نمیکند که معمولاً برای حسابهای کاربری عادی تنظیم نمیشود. (مشارکتشده توسط Anthony Sottile در bpo-36264.)
isdir() در ویندوز دیگر True را برای پیوندی به پوشهی ناموجود برنمیگرداند.
realpath() در ویندوز اکنون نقاط بازتجزیه (reparse point) از جمله پیوندهای نمادین و اتصالهای پوشه را حل میکند.
(مشارکتشده توسط Steve Dower در bpo-37834.)
pickle¶
افزونههای pickle که از Pickler بهینهشده با C زیرکلاس میگیرند، اکنون میتوانند با تعریف متد ویژهی reducer_override()، منطق پیکلکردن توابع و کلاسها را بازنویسی کنند. (مشارکتشده توسط Pierre Glaser و Olivier Grisel در bpo-35900.)
plistlib¶
کلاس جدید plistlib.UID افزوده شد و پشتیبانی از خواندن و نوشتن پروندههای plist دودویی کدگذاریشده با NSKeyedArchiver فعال شد. (مشارکتشده توسط Jon Janzen در bpo-26707.)
pprint¶
ماژول pprint پارامتر sort_dicts را به چندین تابع افزود. بهطور پیشفرض، این توابع همچنان دیکشنریها را پیش از نمایش یا چاپ مرتب میکنند. با این حال، اگر sort_dicts روی false تنظیم شود، دیکشنریها ترتیب درج کلیدها را حفظ میکنند. این میتواند هنگام اشکالزدایی برای مقایسه با ورودیهای JSON مفید باشد.
علاوه بر این، یک تابع جدید و کاربردی وجود دارد، pprint.pp() که مانند pprint.pprint() است، اما مقدار پیشفرض sort_dicts آن False است:
>>> from pprint import pprint, pp
>>> d = dict(source='input.txt', operation='filter', destination='output.txt')
>>> pp(d, width=40) # Original order
{'source': 'input.txt',
'operation': 'filter',
'destination': 'output.txt'}
>>> pprint(d, width=40) # Keys sorted alphabetically
{'destination': 'output.txt',
'operation': 'filter',
'source': 'input.txt'}
(ارائهشده توسط رمی لاپیر در bpo-30670.)
shutil¶
shutil.copytree() اکنون آرگومان کلیدواژهای جدید dirs_exist_ok را میپذیرد. (مشارکتشده توسط جاش برونسون در bpo-20849.)
shutil.make_archive() اکنون برای آرشیوهای جدید بهطور پیشفرض از قالب مدرن pax (POSIX.1-2001) استفاده میکند تا قابلیت حمل و انطباق با استانداردها بهبود یابد؛ این پیشفرض از تغییر متناظر در ماژول tarfile به ارث رسیده است. (مشارکتشده توسط C.A.M. Gerlach در bpo-30661.)
shutil.rmtree() در ویندوز اکنون اتصالهای پوشه را حذف میکند، بدون آنکه ابتدا محتویات آنها را بهصورت بازگشتی حذف کند. (مشارکت از Steve Dower در bpo-37834.)
statistics¶
statistics.fmean() به عنوان گونهی سریعتر و ممیز شناورِ statistics.mean() افزوده شد. (مشارکتشده توسط Raymond Hettinger و Steven D'Aprano در bpo-35904.)
statistics.geometric_mean() افزوده شد (با مشارکت Raymond Hettinger در bpo-27181.)
statistics.multimode() افزوده شد که فهرستی از پرتکرارترین مقادیر را برمیگرداند. (مشارکتشده توسط Raymond Hettinger در bpo-35892.)
تابع statistics.quantiles() اضافه شد که دادهها یا یک توزیع را به بازههای هماحتمال (برای مثال چارکها، دهکها یا صدکها) تقسیم میکند. (مشارکت Raymond Hettinger در bpo-36546.)
statistics.NormalDist اضافه شد؛ ابزاری برای ایجاد و دستکاری توزیعهای نرمال یک متغیر تصادفی. (نوشتهی Raymond Hettinger در bpo-36018.)
>>> temperature_feb = NormalDist.from_samples([4, 12, -3, 2, 7, 14])
>>> temperature_feb.mean
6.0
>>> temperature_feb.stdev
6.356099432828281
>>> temperature_feb.cdf(3) # Chance of being under 3 degrees
0.3184678262814532
>>> # Relative chance of being 7 degrees versus 10 degrees
>>> temperature_feb.pdf(7) / temperature_feb.pdf(10)
1.2039930378537762
>>> el_niño = NormalDist(4, 2.5)
>>> temperature_feb += el_niño # Add in a climate effect
>>> temperature_feb
NormalDist(mu=10.0, sigma=6.830080526611674)
>>> temperature_feb * (9/5) + 32 # Convert to Fahrenheit
NormalDist(mu=50.0, sigma=12.294144947901014)
>>> temperature_feb.samples(3) # Generate random samples
[7.672102882379219, 12.000027119750287, 4.647488369766392]
sys¶
تابع جدید sys.unraisablehook() افزوده شد که میتوان با بازنویسی آن، نحوهی مدیریت «استثناهای غیرقابل raise» (unraisable exceptions) را کنترل کرد. این تابع زمانی فراخوانی میشود که استثنایی رخ داده باشد، اما پایتون هیچ راهی برای مدیریت آن نداشته باشد. برای مثال، زمانی که یک مخرب استثنایی را raise میکند یا هنگام زبالهروبی (gc.collect()). (مشارکتشده توسط Victor Stinner در bpo-36829.)
tarfile¶
ماژول tarfile اکنون برای آرشیوهای جدید بهطور پیشفرض از قالب مدرن pax (POSIX.1-2001) استفاده میکند، بهجای قالب قبلی مخصوص GNU. این امر قابلیت حمل بینسکویی را با کدگذاری یکنواخت (UTF-8) در قالبی استانداردشده و توسعهپذیر بهبود میبخشد و چندین مزیت دیگر نیز ارائه میدهد. (مشارکتشده توسط C.A.M. Gerlach در bpo-36268.)
threading¶
تابع جدید threading.excepthook() افزوده شد که استثنای گرفتهنشدهی threading.Thread.run() را مدیریت میکند. میتوانید آن را بازنویسی کنید تا نحوهی مدیریت استثناهای گرفتهنشدهی threading.Thread.run() را کنترل کنید. (مشارکتشده توسط ویکتور استینر در bpo-1230540.)
تابع جدید threading.get_native_id() و ویژگی native_id به کلاس threading.Thread اضافه شدند. اینها شناسه صحیح بومی نخ جاری را که توسط هسته به آن اختصاص دادهشده است، برمیگردانند. این قابلیت تنها روی پلتفرمهای خاصی در دسترس است؛ برای اطلاعات بیشتر به get_native_id مراجعه کنید. (مشارکتشده توسط جیک تسلر در bpo-36084.)
tokenize¶
ماژول tokenize اکنون هنگامی که ورودیای فاقد سطر جدید انتهایی به آن ارائه شود، بهطور ضمنی یک توکن NEWLINE تولید میکند. این رفتار اکنون با آنچه توکنساز C بهطور داخلی انجام میدهد مطابقت دارد. (مشارکتشده توسط Ammar Askar در bpo-33899.)
tkinter¶
متدهای selection_from()، selection_present()، selection_range() و selection_to() به کلاس tkinter.Spinbox افزوده شدند. (با مشارکت Juliette Monsel در bpo-34829.)
متد moveto() به کلاس tkinter.Canvas افزوده شد. (مشارکتشده توسط Juliette Monsel در bpo-23831.)
کلاس tkinter.PhotoImage اکنون متدهای transparency_get() و transparency_set() را دارد. (مشارکتشده توسط Zackery Spytz در bpo-25451.)
typing¶
ماژول typing چندین ویژگی جدید را در بر میگیرد:
نوعی دیکشنری با نوع به ازای هر کلید. به PEP 589 و typing.TypedDict مراجعه کنید. TypedDict فقط از کلیدهای رشتهای استفاده میکند. بهطور پیشفرض، حضور هر کلید الزامی است. برای اختیاری بودن کلیدها، "total=False" را مشخص کنید:
class Location(TypedDict, total=False):
lat_long: tuple
grid_square: str
xy_coordinate: tuple
نوعهای لفظی. به PEP 586 و typing.Literal مراجعه کنید. نوعهای لفظی نشان میدهند که یک پارامتر یا مقدار بازگشتی به یک یا چند مقدار لفظی مشخص محدود است:
def get_status(port: int) -> Literal['connected', 'disconnected']:
...
متغیرها، توابع، متدها و کلاسهای «Final». به PEP 591، typing.Final و @typing.final مراجعه کنید. مشخصکنندهی final به بررسیگر نوع ایستا دستور میدهد که زیرکلاسسازی، بازنویسی یا انتساب مجدد را محدود کند:
pi: Final[float] = 3.1415926536
تعریفهای پروتکل. به PEP 544، typing.Protocol و @typing.runtime_checkable مراجعه کنید. کلاسهای پایه انتزاعی سادهای مانند typing.SupportsInt اکنون زیرکلاسهای Protocol هستند.
کلاس پروتکل جدید typing.SupportsIndex.
توابع جدید typing.get_origin() و typing.get_args().
unicodedata¶
ماژول unicodedata برای استفاده از نسخهی Unicode 12.1.0 ارتقا یافته است.
میتوان از تابع جدید is_normalized() برای راستیآزمایی اینکه یک رشته در فرم نرمال (normal form) مشخصی قرار دارد استفاده کرد؛ این روش اغلب بسیار سریعتر از نرمالسازی واقعی رشته است. (مشارکتشده توسط Max Belanger، David Euresti و Greg Price در bpo-32285 و bpo-37966).
unittest¶
AsyncMock برای پشتیبانی از نسخهی ناهمگام Mock افزوده شد. توابع ادعای جدید مناسب برای آزمون نیز اضافه شدهاند. (مشارکتشده توسط لیزا روچ در bpo-26467).
تابع addModuleCleanup() و متد addClassCleanup() به unittest اضافه شدند تا از پاکسازیهای مربوط به setUpModule() و setUpClass() پشتیبانی کنند. (مشارکتشده توسط لیزا روچ در bpo-24412.)
چندین تابع ادعای ماک اکنون در صورت شکست، فهرستی از فراخوانیهای واقعی را نیز چاپ میکنند. (ارائهشده توسط Petter Strandmark در bpo-35047.)
ماژول unittest پشتیبانی از استفادهی همروالها بهعنوان موارد آزمون را با unittest.IsolatedAsyncioTestCase به دست آورد. (مشارکت Andrew Svetlov در bpo-32972.)
مثال:
import unittest
class TestRequest(unittest.IsolatedAsyncioTestCase):
async def asyncSetUp(self):
self.connection = await AsyncConnection()
async def test_get(self):
response = await self.connection.get("https://example.com")
self.assertEqual(response.status_code, 200)
async def asyncTearDown(self):
await self.connection.close()
if __name__ == "__main__":
unittest.main()
venv¶
venv اکنون در تمام پلتفرمها شامل یک اسکریپت Activate.ps1 برای فعالسازی محیطهای مجازی در PowerShell Core 6.1 است. (مشارکتشده توسط Brett Cannon در bpo-32718.)
weakref¶
اشیاء پراکسی بازگرداندهشده توسط weakref.proxy() اکنون علاوه بر سایر عملگرهای عددی، از عملگرهای ضرب ماتریسی @ و @= نیز پشتیبانی میکنند. (مشارکتشده توسط Mark Dickinson در bpo-36669.)
xml¶
برای مقابله با بازیابی DTD و موجودیتهای خارجی، ماژولهای xml.dom.minidom و xml.sax دیگر بهطور پیشفرض موجودیتهای خارجی را پردازش نمیکنند. (مشارکتشده توسط Christian Heimes در bpo-17239.)
متدهای .find*() در ماژول xml.etree.ElementTree از جستجوهای وایلدکارد مانند {*}tag که فضای نام را نادیده میگیرد و {namespace}* که همهی تگها را در فضای نام دادهشده برمیگرداند، پشتیبانی میکنند. (مشارکتشده توسط استفان بِهنل در bpo-28238.)
ماژول xml.etree.ElementTree تابع جدیدی canonicalize() ارائه میدهد که C14N 2.0 را پیادهسازی میکند. (مشارکتشده توسط Stefan Behnel در bpo-13611.)
شیء هدف xml.etree.ElementTree.XMLParser میتواند رویدادهای اعلان فضای نام را از طریق متدهای کالبک جدید start_ns() و end_ns() دریافت کند. علاوه بر این، میتوان هدف xml.etree.ElementTree.TreeBuilder را بهگونهای پیکربندی کرد که رویدادهای مربوط به کامنتها و دستورهای پردازشی را پردازش کند و آنها را در درخت تولیدشده بگنجاند. (ارائهشده توسط Stefan Behnel در bpo-36676 و bpo-36673.)
xmlrpc¶
xmlrpc.client.ServerProxy اکنون از یک آرگومان کلیدواژهای اختیاری headers برای دنبالهای از سرآیندهای HTTP که باید با هر درخواست ارسال شوند، پشتیبانی میکند. از جمله موارد دیگر، این امر امکان ارتقا از احراز هویت پایهی پیشفرض به احراز هویت نشستِ سریعتر را فراهم میکند. (مشارکتشده توسط Cédric Krier در bpo-35153.)