این مقاله ویژگیهای جدید پایتون 3.5 را در مقایسه با 3.4 توضیح میدهد. پایتون 3.5 در تاریخ ۱۳ سپتامبر ۲۰۱۵ منتشر شد. برای فهرست کامل تغییرات، فهرست تغییرات را ببینید.
قابلیتهای جدید¶
PEP 492 - همروالها با سینتکس async و await¶
PEP 492 با افزودن اشیاء انتظارپذیر، توابع همروال، پیمایش ناهمگام و مدیرهای زمینه ناهمگام، پشتیبانی از برنامهنویسی ناهمگام در پایتون را بهطور چشمگیری بهبود میبخشد.
توابع همروال با استفاده از سینتکس جدید async def تعریف میشوند:
>>> async def coro():
... return 'spam'
درون یک تابع همروال، میتوان از عبارت جدید await برای تعلیق اجرای همروال تا زمانی که نتیجه در دسترس باشد استفاده کرد. هر شیء را میتوان await کرد، به شرط آنکه پروتکل awaitable را با تعریف متد __await__() پیادهسازی کرده باشد.
PEP 492 همچنین دستور async for را برای پیمایش آسان روی پیمایشپذیرهای ناهمگام اضافه میکند.
مثالی از یک کلاینت HTTP ابتدایی که با استفاده از سینتکس جدید نوشته شده است:
import asyncio
async def http_get(domain):
reader, writer = await asyncio.open_connection(domain, 80)
writer.write(b'\r\n'.join([
b'GET / HTTP/1.1',
b'Host: %b' % domain.encode('latin-1'),
b'Connection: close',
b'', b''
]))
async for line in reader:
print('>>>', line)
writer.close()
loop = asyncio.get_event_loop()
try:
loop.run_until_complete(http_get('example.com'))
finally:
loop.close()
همانند پیمایش ناهمگام، سینتکس جدیدی برای مدیرهای زمینه ناهمگام وجود دارد. اسکریپت زیر:
import asyncio
async def coro(name, lock):
print('coro {}: waiting for lock'.format(name))
async with lock:
print('coro {}: holding the lock'.format(name))
await asyncio.sleep(1)
print('coro {}: releasing the lock'.format(name))
loop = asyncio.get_event_loop()
lock = asyncio.Lock()
coros = asyncio.gather(coro(1, lock), coro(2, lock))
try:
loop.run_until_complete(coros)
finally:
loop.close()
خروجی خواهد داد:
coro 2: waiting for lock
coro 2: holding the lock
coro 1: waiting for lock
coro 2: releasing the lock
coro 1: holding the lock
coro 1: releasing the lock
توجه داشته باشید که هر دو async for و async with تنها درون تابع همروالی که با async def تعریفشده است قابل استفاده هستند.
توابع همروال برای اجرا درون یک حلقه رویداد سازگار، مانند حلقهی asyncio، در نظر گرفته شدهاند.
همچنین ببینید
- PEP 492 -- همروالها با سینتکس async و await
PEP توسط یوری سلیوانوف نوشته و پیادهسازی شده است.
PEP 465 - عملگر میانوندی اختصاصی برای ضرب ماتریسی¶
PEP 465 عملگر میانوندی @ را برای ضرب ماتریسی اضافه میکند. در حال حاضر، هیچ نوع توکار پایتونی این عملگر جدید را پیادهسازی نکرده است، اما میتوان آن را با تعریف __matmul__()، __rmatmul__() و __imatmul__() برای ضرب ماتریسی معمولی، بازتابی و درجا پیادهسازی کرد. معناشناسی این متدها مشابه معناشناسی متدهایی است که سایر عملگرهای حسابی میانوندی را تعریف میکنند.
ضرب ماتریسی عملیاتی بهطور قابل توجهی رایج در بسیاری از حوزههای ریاضیات، علم و مهندسی است و افزودن @ امکان نوشتن کد تمیزتر را فراهم میکند:
S = (H @ beta - r).T @ inv(H @ V @ H.T) @ (H @ beta - r)
بهجای:
S = dot((dot(H, beta) - r).T,
dot(inv(dot(dot(H, V), H.T)), dot(H, beta) - r))
NumPy 1.10 از عملگر جدید پشتیبانی میکند:
>>> import numpy
>>> x = numpy.ones(3)
>>> x
array([ 1., 1., 1.])
>>> m = numpy.eye(3)
>>> m
array([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.]])
>>> x @ m
array([ 1., 1., 1.])
همچنین ببینید
- PEP 465 -- عملگر میانوندی اختصاصی برای ضرب ماتریسی
PEP نوشتهشده توسط Nathaniel J. Smith؛ پیادهسازیشده توسط Benjamin Peterson.
PEP 448 - تعمیمهای تکمیلی واگشایی¶
PEP 448 کاربردهای مجاز عملگر واگشایی پیمایشپذیر * و عملگر واگشایی دیکشنری ** را گسترش میدهد. اکنون میتوان از هر تعداد واگشایی در فراخوانی توابع استفاده کرد:
>>> print(*[1], *[2], 3, *[4, 5])
1 2 3 4 5
>>> def fn(a, b, c, d):
... print(a, b, c, d)
...
>>> fn(**{'a': 1, 'c': 3}, **{'b': 2, 'd': 4})
1 2 3 4
بهطور مشابه، نمایشهای تاپل، فهرست، مجموعه و دیکشنری چندین واگشایی را مجاز میدانند (به فهرستهای عبارت و نمایشهای دیکشنری مراجعه کنید):
>>> *range(4), 4
(0, 1, 2, 3, 4)
>>> [*range(4), 4]
[0, 1, 2, 3, 4]
>>> {*range(4), 4, *(5, 6, 7)}
{0, 1, 2, 3, 4, 5, 6, 7}
>>> {'x': 1, **{'y': 2}}
{'x': 1, 'y': 2}
همچنین ببینید
- PEP 448 -- تعمیمهای بیشتر واگشایی
PEP (پیشنهاد بهبود پایتون) نوشتهشده توسط جاشوا لاندائو؛ پیادهسازیشده توسط نیل گردار، توماس ووترز و جاشوا لاندائو.
PEP 461 - پشتیبانی از قالببندی درصدی برای bytes و bytearray¶
PEP 461 پشتیبانی از عملگر درونیابی % را به bytes و bytearray میافزاید.
اگرچه درونیابی معمولاً بهعنوان عملیاتی روی رشته در نظر گرفته میشود، مواردی وجود دارد که درونیابی روی bytes یا bytearrays منطقی است، و کار لازم برای جبران نبود این قابلیت از خوانایی کلی کد میکاهد. این مسئله بهویژه هنگام کار با پروتکلهای قالب سیمی (wire format) اهمیت دارد؛ پروتکلهایی که اغلب ترکیبی از دادههای دودویی و متن سازگار با اسکی هستند.
مثالها:
>>> b'Hello %b!' % b'World'
b'Hello World!'
>>> b'x=%i y=%f' % (1, 2.5)
b'x=1 y=2.500000'
یونیکد برای %b مجاز نیست، اما توسط %a پذیرفته میشود (معادل repr(obj).encode('ascii', 'backslashreplace')):
>>> b'Hello %b!' % 'World'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: %b requires bytes, or an object that implements __bytes__, not 'str'
>>> b'price: %a' % '10€'
b"price: '10\\u20ac'"
توجه داشته باشید که نوعهای تبدیل %s و %r، هرچند پشتیبانی میشوند، باید تنها در پایگاههای کدی استفاده شوند که به سازگاری با پایتون 2 نیاز دارند.
همچنین ببینید
- PEP 461 -- افزودن قالببندی % به bytes و bytearray
PEP نوشتهشده توسط Ethan Furman؛ پیادهسازیشده توسط Neil Schemenauer و Ethan Furman.
PEP 484 - راهنمای نوع¶
سینتکس حاشیهنویسی تابع از نسخه 3.0 یک قابلیت پایتون بوده است (PEP 3107)، اما معناشناسی حاشیهنویسیها تعریفنشده باقی مانده است.
تجربه نشان داده است که اکثر موارد استفاده از حاشیهنویسی تابع، ارائه راهنمای نوع برای پارامترهای تابع و مقادیر بازگشتی بوده است. آشکار شد که اگر کتابخانه استاندارد شامل تعاریف پایه و ابزارهای مربوط به حاشیهنویسی نوع باشد، برای کاربران پایتون سودمند خواهد بود.
PEP 484 یک ماژول آزمایشی را معرفی میکند که این تعریفها و ابزارهای استاندارد را، همراه با برخی قراردادها برای مواردی که حاشیهنویسیها در دسترس نیستند، فراهم میآورد.
برای مثال، در اینجا یک تابع ساده آمده است که نوع آرگومان و نوع بازگشتیاش در حاشیهنویسیها اعلام شده است:
def greeting(name: str) -> str:
return 'Hello ' + name
در حالی که این حاشیهنویسیها در زمان اجرا از طریق ویژگی متداول __annotations__ در دسترس هستند، هیچ بررسی نوع خودکاری در زمان اجرا انجام نمیشود. در عوض، فرض بر این است که یک بررسیگر نوع آفلاین جداگانه (مثلاً mypy) برای تحلیل کد منبع در صورت نیاز استفاده خواهد شد.
سیستم نوع از اجتماعها، نوعهای عام و یک نوع خاص به نام Any پشتیبانی میکند که با همه نوعها سازگار است (یعنی به همه نوعها و از همه نوعها قابل انتساب است).
همچنین ببینید
مستندات ماژول typing
- PEP 484 -- راهنماهای نوع
PEP نوشتهشده توسط Guido van Rossum، Jukka Lehtosalo و Łukasz Langa؛ پیادهسازیشده توسط Guido van Rossum.
- PEP 483 -- نظریهی راهنماهای نوع
PEP (پیشنهاد بهبود پایتون) نوشتهشده به دست گیدو ون روسوم
PEP 471 - تابع os.scandir() -- پیمایشگری بهتر و سریعتر برای پوشهها¶
PEP 471 یک تابع پیمایش پوشهی جدید، os.scandir()، به کتابخانه استاندارد اضافه میکند. علاوه بر این، os.walk() اکنون با استفاده از scandir پیادهسازی شده است که آن را در سیستمهای POSIX ۳ تا ۵ برابر و در سیستمهای ویندوز ۷ تا ۲۰ برابر سریعتر میکند. این امر عمدتاً با کاهش چشمگیر تعداد فراخوانیهای os.stat() مورد نیاز برای پیمایش یک درخت پوشه به دست آمده است.
علاوه بر این، scandir بهجای بازگرداندن فهرستی از نام پروندهها، یک پیمایشگر برمیگرداند که کارایی حافظه را هنگام پیمایش پوشههای بسیار بزرگ بهبود میبخشد.
مثال زیر استفادهی سادهای از os.scandir() را برای نمایش همهی پروندهها (بهجز پوشهها) در path دادهشده که با '.' شروع نمیشوند نشان میدهد. فراخوانی entry.is_file() بهطور کلی فراخوانی سیستمی اضافی انجام نمیدهد:
for entry in os.scandir(path):
if not entry.name.startswith('.') and entry.is_file():
print(entry.name)
همچنین ببینید
- PEP 471 -- تابع os.scandir() -- پیمایشگر پوشهای بهتر و سریعتر
PEP توسط Ben Hoyt با کمک Victor Stinner نوشته و پیادهسازی شده است.
PEP 475: تلاش مجدد برای فراخوانیهای سیستمی که با EINTR شکست میخورند¶
هر زمان که فراخوانی سیستمیای که در انتظار I/O است توسط سیگنالی قطع شود، کد خطای errno.EINTR برگردانده میشود. پیشتر، پایتون در چنین مواردی InterruptedError ایجاد میکرد. این بدان معنا بود که هنگام نوشتن یک برنامه پایتون، توسعهدهنده دو گزینه داشت:
InterruptedError را نادیده بگیرید.
InterruptedError را مدیریت کنید و در هر محل فراخوانی، تلاش کنید فراخوانی سیستمیِ قطعشده را دوباره اجرا کنید.
گزینه اول باعث میشود یک برنامه بهصورت متناوب از کار بیفتد. گزینه دوم مقدار زیادی کد پیشساخته اضافه میکند که خوانایی کد را تقریباً از بین میبرد. مقایسه کنید:
و:
while True:
try:
print("Hello World")
break
except InterruptedError:
continue
PEP 475 تلاش مجدد خودکار فراخوانهای سیستمی هنگام EINTR را پیادهسازی میکند. این امر در بیشتر موارد بارِ مواجهه با EINTR یا InterruptedError در کد کاربر را از بین میبرد و برنامههای پایتون، از جمله کتابخانه استاندارد، را مقاومتر میسازد. توجه داشته باشید که فراخوان سیستمی تنها در صورتی مجدداً اجرا میشود که هندلر سیگنال استثنایی ایجاد نکند.
در ادامه فهرستی از توابعی که اکنون هنگام قطع شدن توسط سیگنال، دوباره اجرا میشوند، آمده است:
open() و io.open()؛
توابع ماژول faulthandler؛
توابع os: fchdir(), fchmod(), fchown(), fdatasync(), fstat(), fstatvfs(), fsync(), ftruncate(), mkfifo(), mknod(), open(), posix_fadvise(), posix_fallocate(), pread(), pwrite(), read(), readv(), sendfile(), wait3(), wait4(), wait(), waitid(), waitpid(), write(), writev();
موارد خاص: os.close() و os.dup2() اکنون خطاهای EINTR را نادیده میگیرند؛ فراخوانی سیستمی دوباره تلاش نمیشود (برای منطق این تصمیم، به PEP (پیشنهاد بهبود پایتون) مراجعه کنید)؛
توابع select: devpoll.poll()، epoll.poll()، kqueue.control()، poll.poll()، select()؛
متدهای کلاس socket: accept()، connect() (بهجز سوکتهای غیرمسدودکننده)، recv()، recvfrom()، recvmsg()، send()، sendall()، sendmsg()، sendto()؛
signal.sigtimedwait() و signal.sigwaitinfo()؛
time.sleep().
همچنین ببینید
- PEP 475 -- تلاش دوباره برای فراخوانیهای سیستمی که با EINTR شکست میخورند
PEP و پیادهسازی آن توسط شارل-فرانسوا ناتالی و ویکتور استینر، با کمک آنتوان پیترو (اتصال فرانسوی) نوشته شده است.
PEP 479: تغییر مدیریت StopIteration درون تولیدگرها¶
تعامل تولیدگرها و StopIteration در پایتون 3.4 و نسخههای پیشین گاهی تعجبآور بود و میتوانست اشکالهای مبهم را پنهان کند. پیشتر، StopIteration که بهطور ناخواسته درون یک تابع تولیدگر برخاسته میشد، از سوی ساختار حلقهای که تولیدگر را پیش میبرد، بهعنوان پایان پیمایش تفسیر میشد.
PEP 479 رفتار تولیدگرها را تغییر میدهد: وقتی استثنای StopIteration درون یک تولیدگر مطرح شود، پیش از آنکه از فریم تولیدگر خارج شود، با RuntimeError جایگزین میشود. هدف اصلی این تغییر، آسانتر کردن اشکالزدایی در موقعیتی است که فراخوانی محافظتنشدهی next() استثنای StopIteration را مطرح میکند و باعث میشود پیمایشی که توسط تولیدگر کنترل میشود، بیصدا خاتمه یابد. این وضعیت بهویژه در ترکیب با سازهی yield from زیانبار است.
این یک تغییر ناسازگار با گذشته است، بنابراین برای فعالسازی رفتار جدید، ایمپورت __future__ ضروری است:
>>> from __future__ import generator_stop
>>> def gen():
... next(iter([]))
... yield
...
>>> next(gen())
Traceback (most recent call last):
File "<stdin>", line 2, in gen
StopIteration
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: generator raised StopIteration
بدون ایمپورت __future__، هر زمان که استثنای StopIteration درون یک تولیدگر ایجاد شود، هشدار PendingDeprecationWarning ایجاد خواهد شد.
همچنین ببینید
- PEP 479 -- تغییر نحوهی مدیریت StopIteration درون تولیدگرها
PEP نوشتهشده توسط Chris Angelico و Guido van Rossum. پیادهسازیشده توسط Chris Angelico، Yury Selivanov و Nick Coghlan.
PEP 485: تابعی برای آزمودن برابری تقریبی¶
PEP 485 توابع math.isclose() و cmath.isclose() را اضافه میکند که مشخص میکنند آیا دو مقدار تقریباً برابر یا «نزدیک» به یکدیگر هستند یا خیر. اینکه دو مقدار نزدیک در نظر گرفته شوند یا نه، بر اساس رواداریهای مطلق و نسبی دادهشده تعیین میشود. رواداری نسبی، بیشینهی اختلاف مجاز بین آرگومانهای isclose نسبت به مقدار مطلق بزرگتر است:
>>> import math
>>> a = 5.0
>>> b = 4.99998
>>> math.isclose(a, b, rel_tol=1e-5)
True
>>> math.isclose(a, b, rel_tol=1e-6)
False
همچنین میتوان دو مقدار را با استفاده از تلورانس مطلق، که باید مقداری نامنفی باشد، مقایسه کرد:
>>> import math
>>> a = 5.0
>>> b = 4.99998
>>> math.isclose(a, b, abs_tol=0.00003)
True
>>> math.isclose(a, b, abs_tol=0.00001)
False
همچنین ببینید
- PEP 485 -- تابعی برای آزمودن برابری تقریبی
PEP نوشتهشده توسط کریستوفر بارکر؛ پیادهسازیشده توسط کریس بارکر و تال اینات.
PEP 486: آگاهسازی راهانداز پایتون از محیطهای مجازی¶
PEP 486 راهانداز ویندوز (نگاه کنید به PEP 397) را از محیط مجازی فعال آگاه میکند. هنگامی که قرار باشد از مفسر پیشفرض استفاده شود و متغیر محیطی VIRTUAL_ENV تنظیمشده باشد، از مفسر موجود در محیط مجازی استفاده خواهد شد.
همچنین ببینید
- PEP 486 -- آگاه کردن راهانداز پایتون از محیطهای مجازی
PEP نوشته و پیادهسازیشده توسط Paul Moore.
PEP 488: حذف پروندههای PYO¶
PEP 488 مفهوم پروندههای .pyo را حذف میکند. این بدان معناست که پروندههای .pyc هم بایتکد بهینهنشده و هم بایتکد بهینهشده را نشان میدهند. برای جلوگیری از نیاز به تولید مجدد مداوم پروندههای بایتکد، پروندههای .pyc اکنون هنگامی که بایتکد بهینه شده باشد، یک برچسب اختیاری opt- در نام خود دارند. اثر جانبی این کار آن است که هنگام اجرا با هر یک از -O یا -OO، دیگر تداخل نام پروندههای بایتکد رخ نمیدهد. در نتیجه، پروندههای بایتکد تولیدشده با -O و -OO اکنون میتوانند همزمان وجود داشته باشند. importlib.util.cache_from_source() برای کمک به این تغییر، API بهروزرسانیشدهای دارد.
همچنین ببینید
- PEP 488 -- حذف پروندههای PYO
PEP (پیشنهاد بهبود پایتون) توسط برت کانون نوشته و پیادهسازی شده است.
PEP 489: مقداردهی اولیه چندمرحلهای ماژول توسعهای¶
PEP 489 مقداردهی اولیه ماژول توسعهای را بهروزرسانی میکند تا از سازوکار بارگذاری دومرحلهای ماژول که توسط PEP 451 در پایتون 3.4 معرفی شد، بهره بگیرد.
این تغییر باعث میشود معناشناسی ایمپورت ماژولهای توسعهای که استفاده از سازوکار جدید را انتخاب میکنند، بسیار به معناشناسی ایمپورت ماژولهای کد منبع و بایتکد پایتون نزدیکتر شود؛ از جمله امکان استفاده از هر شناسهی معتبر بهعنوان نام ماژول، بهجای محدود شدن به اسکی.
همچنین ببینید
- PEP 489 -- راهاندازی چندمرحلهای ماژول توسعهای
PEP نوشتهشده توسط Petr Viktorin، Stefan Behnel و Nick Coghlan؛ پیادهسازیشده توسط Petr Viktorin.
ماژولهای بهبودیافته¶
asyncio¶
از آنجا که ماژول asyncio آزمایشی است، تمام تغییرات معرفیشده در پایتون 3.5 به پایتون 3.4.x نیز بکپورت شدهاند.
تغییرات قابل توجه در ماژول asyncio از زمان پایتون 3.4.0:
بهروزرسانیها در 3.5.1:
بهروزرسانیها در 3.5.2:
cgi¶
کلاس FieldStorage اکنون از پروتکل مدیر زمینه پشتیبانی میکند. (مشارکتشده توسط برکر پکساگ در bpo-20289.)
cmath¶
تابع جدید isclose() راهی برای آزمون برابری تقریبی فراهم میکند. (مشارکتشده توسط کریس بارکر و تال اینات در bpo-24270.)
collections¶
کلاس OrderedDict اکنون در C پیادهسازی شده است، که آن را ۴ تا ۱۰۰ برابر سریعتر میکند. (مشارکتشده توسط اریک اسنو در bpo-16991.)
نماهای OrderedDict.items()، OrderedDict.keys() و OrderedDict.values() اکنون از پیمایش با reversed() پشتیبانی میکنند. (مشارکتشده توسط Serhiy Storchaka در bpo-19505.)
کلاس deque اکنون index()، insert() و copy() را تعریف میکند و از عملگرهای + و * پشتیبانی میکند. این امر باعث میشود صفهای دوطرفه بهعنوان یک MutableSequence شناخته شوند و قابلیت جایگزینی آنها بهجای فهرستها را بهبود میبخشد. (مشارکت Raymond Hettinger در bpo-23704.)
رشتههای مستند تولیدشده توسط namedtuple() اکنون میتوانند بهروزرسانی شوند:
Point = namedtuple('Point', ['x', 'y'])
Point.__doc__ += ': Cartesian coordinate'
Point.x.__doc__ = 'abscissa'
Point.y.__doc__ = 'ordinate'
(مشارکتشده توسط Berker Peksag در bpo-24064.)
کلاس UserString اکنون متدهای __getnewargs__()، __rmod__()، casefold()، format_map()، isprintable() و maketrans() را برای مطابقت با متدهای متناظر str پیادهسازی میکند. (مشارکتشده توسط Joe Jevnik در bpo-22189.)
compileall¶
گزینهی جدید -j N در compileall اجازه میدهد که N کارگر بهطور همزمان برای انجام کامپایل موازی بایتکد اجرا شوند. تابع compile_dir() پارامتر متناظری با نام workers دارد. (مشارکتشده توسط Claudiu Popa در bpo-16104.)
گزینهی جدید دیگر، -r، امکان کنترل حداکثر سطح بازگشتی برای زیرپوشهها را فراهم میکند. (مشارکتشده توسط Claudiu Popa در bpo-19628.)
گزینهی -q خط فرمان اکنون میتواند بیش از یک بار مشخص شود که در این صورت تمام خروجی، از جمله خطاها، سرکوب خواهد شد. پارامتر متناظر quiet در compile_dir()، compile_file() و compile_path() اکنون میتواند یک مقدار عدد صحیح را بپذیرد که سطح سرکوب خروجی را نشان میدهد. (مشارکت Thomas Kluyver در bpo-21338.)
configparser¶
configparser اکنون راهی برای سفارشیسازی تبدیل مقادیر فراهم میکند: با مشخص کردن دیکشنریای از مبدلها در سازندهی ConfigParser، یا با تعریف آنها بهعنوان متد در زیرکلاسهای ConfigParser. مبدلهای تعریفشده در یک نمونهی پارسر، توسط پراکسیهای بخش آن به ارث برده میشوند.
مثال:
>>> import configparser
>>> conv = {}
>>> conv['list'] = lambda v: [e.strip() for e in v.split() if e.strip()]
>>> cfg = configparser.ConfigParser(converters=conv)
>>> cfg.read_string("""
... [s]
... list = a b c d e f g
... """)
>>> cfg.get('s', 'list')
'a b c d e f g'
>>> cfg.getlist('s', 'list')
['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> section = cfg['s']
>>> section.getlist('list')
['a', 'b', 'c', 'd', 'e', 'f', 'g']
(مشارکتشده توسط Łukasz Langa در bpo-18159.)
contextlib¶
مدیر زمینه جدید redirect_stderr() (مشابه redirect_stdout()) کار با APIهای انعطافناپذیری را که خروجی خود را به sys.stderr مینویسند و هیچ گزینهای برای تغییر جهت دادن آن ارائه نمیدهند، برای اسکریپتهای ابزاری آسانتر میکند:
>>> import contextlib, io, logging
>>> f = io.StringIO()
>>> with contextlib.redirect_stderr(f):
... logging.warning('warning')
...
>>> f.getvalue()
'WARNING:root:warning\n'
(مشارکتشده توسط Berker Peksag در bpo-22389.)
csv¶
متد writerow() اکنون از پیمایشپذیرهای دلخواه پشتیبانی میکند، نه فقط از دنبالهها. (مشارکت Serhiy Storchaka در bpo-23171.)
dbm¶
dumb.open وقتی پرچم مقدار "n" را داشته باشد، همیشه یک پایگاه داده جدید ایجاد میکند. (مشارکتشده توسط Claudiu Popa در bpo-18039.)
difflib¶
اکنون میتوان مجموعهی نویسهها در پروندههای HTML تولیدشده توسط HtmlDiff.make_file() را با استفاده از آرگومان جدید فقطکلیدواژهای charset سفارشیسازی کرد. مجموعهی نویسههای پیشفرض پروندهی HTML از "ISO-8859-1" به "utf-8" تغییر کرد. (مشارکتشده توسط Berker Peksag در bpo-2052.)
تابع diff_bytes() اکنون میتواند فهرستهایی از رشتههای بایتی را مقایسه کند. این کار یک رگرسیون از پایتون ۲ را برطرف میکند. (مشارکتشده توسط تری جی. ریدی و گرگ وارد در bpo-17445.)
distutils¶
هر دو دستور build و build_ext اکنون گزینهی -j را برای فعالسازی ساخت موازی ماژولهای توسعهای میپذیرند. (ارائهشده توسط آنتوان پیترو در bpo-5309.)
ماژول distutils اکنون از فشردهسازی xz پشتیبانی میکند و میتوان آن را با ارسال xztar بهعنوان آرگومان به bdist --format فعال کرد. (مشارکتشده توسط Serhiy Storchaka در bpo-16314.)
email¶
یک گزینهی جدید برای سیاستها، Policy.mangle_from_، کنترل میکند که آیا سطرهایی در بدنهی ایمیلها که با "From " شروع میشوند، توسط تولیدگرها با نویسهی ">" پیشونددار میشوند یا خیر. مقدار پیشفرض برای compat32 برابر با True و برای همهی سیاستهای دیگر برابر با False است. (با مشارکت Milan Oberkirch در bpo-20098.)
متد جدید Message.get_content_disposition() دسترسی آسان به یک مقدار کانونیکال برای سرآیند Content-Disposition فراهم میکند. (مشارکتشده توسط Abhilash Raj در bpo-21083.)
یک گزینهی جدید سیاست EmailPolicy.utf8 میتواند روی True تنظیم شود تا سرآیندهای ایمیل بهجای استفاده از واژههای کدگذاریشده (encoded words)، با مجموعهنویسهی UTF-8 کدگذاری شوند. این امکان را فراهم میکند که Messages مطابق RFC 6532 قالببندی شوند و با یک سرور SMTP که از توسعهی SMTPUTF8 مطابق RFC 6531 پشتیبانی میکند، استفاده شوند. (مشارکتشده توسط R. David Murray در bpo-24211.)
سازندهی mime.text.MIMEText اکنون یک نمونه از charset.Charset را میپذیرد. (مشارکتشده توسط Claude Paroz و Berker Peksag در bpo-16324.)
enum¶
فراخوانیپذیر Enum پارامتر جدیدی به نام start دارد تا در صورتی که فقط names ارائه شده باشند، شمارهی آغازین مقادیر enum را مشخص کند:
>>> Animal = enum.Enum('Animal', 'cat dog', start=10)
>>> Animal.cat
<Animal.cat: 10>
>>> Animal.dog
<Animal.dog: 11>
(مشارکتشده توسط Ethan Furman در bpo-21706.)
functools¶
بخش عمدهی سازوکارِ @lru_cache اکنون به زبان C پیادهسازی شده است که آن را بهطور چشمگیری سریعتر میکند. (با مشارکت Matt Joiner، Alexey Kachayev و Serhiy Storchaka در bpo-14373.)
glob¶
توابع iglob() و glob() اکنون از جستجوی بازگشتی در زیرپوشهها با استفاده از الگوی "**" پشتیبانی میکنند. (مشارکت Serhiy Storchaka در bpo-13968.)
gzip¶
آرگومان حالت سازندهی GzipFile اکنون "x" را برای درخواست ایجاد انحصاری میپذیرد. (مشارکتشده توسط Tim Heaney در bpo-19222.)
heapq¶
مقایسه المانها در merge() اکنون میتواند با ارسال یک key function در آرگومان کلیدواژهای جدید و اختیاری key سفارشیسازی شود، و میتوان از آرگومان کلیدواژهای جدید و اختیاری reverse برای معکوس کردن مقایسه المانها استفاده کرد:
>>> import heapq
>>> a = ['9', '777', '55555']
>>> b = ['88', '6666']
>>> list(heapq.merge(a, b, key=len))
['9', '88', '777', '6666', '55555']
>>> list(heapq.merge(reversed(a), reversed(b), key=len, reverse=True))
['55555', '6666', '777', '88', '9']
(مشارکتکرده توسط ریموند هتینگر در bpo-13742.)
http¶
یک enum جدید HTTPStatus که مجموعهای از کدهای وضعیت HTTP، عبارتهای دلیل (reason phrase) و توضیحات بلند نوشتهشده به زبان انگلیسی را تعریف میکند. (مشارکت Demian Brecht در bpo-21793.)
http.client¶
HTTPConnection.getresponse() اکنون هنگامی که اتصال به سرور راه دور بهطور غیرمنتظره بسته شود، استثنای RemoteDisconnected ایجاد میکند. علاوه بر این، اگر استثنای ConnectionError (که RemoteDisconnected زیرکلاسی از آن است) ایجاد شود، سوکت کلاینت اکنون بهطور خودکار بسته میشود و در درخواست بعدی دوباره متصل میشود:
import http.client
conn = http.client.HTTPConnection('www.python.org')
for retries in range(3):
try:
conn.request('GET', '/')
resp = conn.getresponse()
except http.client.RemoteDisconnected:
pass
(مشارکتشده توسط مارتین پانتر در bpo-3566.)
idlelib و IDLE¶
از آنجا که idlelib پوسته و ویرایشگر IDLE را پیادهسازی میکند و برای ایمپورت توسط برنامههای دیگر در نظر گرفته نشده است، در هر نسخه بهبودهایی مییابد. برای فهرست تجمعی تغییرات از نسخه 3.4.0 به بعد، و همچنین تغییرات انجامشده در نسخههای آینده 3.5.x، به Lib/idlelib/NEWS.txt مراجعه کنید. این پرونده همچنین از طریق گفتوگوی IDLE Help ‣ About IDLE در دسترس است.
imaplib¶
کلاس IMAP4 اکنون از پروتکل مدیر زمینه پشتیبانی میکند. هنگامی که در دستور with استفاده شود، فرمان LOGOUT در IMAP4 بهطور خودکار در پایان بلوک فراخوانی میشود. (با مشارکت Tarek Ziadé و Serhiy Storchaka در bpo-4972.)
ماژول imaplib اکنون از RFC 5161 (افزونهی ENABLE) و RFC 6855 (پشتیبانی UTF-8) از طریق متد IMAP4.enable() پشتیبانی میکند. ویژگی جدید IMAP4.utf8_enabled پیگیری میکند که آیا پشتیبانی RFC 6855 فعال است یا خیر. (مشارکت از Milan Oberkirch، R. David Murray و Maciej Szulik در bpo-21800.)
ماژول imaplib اکنون بهطور خودکار نامهای کاربری و گذرواژههای رشتهایِ غیر ASCII را با استفاده از UTF-8، همانطور که در RFCها توصیه شده است، کدگذاری میکند. (مشارکت توسط Milan Oberkirch در bpo-21800.)
imghdr¶
تابع what() اکنون قالب OpenEXR (که توسط Martin Vignali و Claudiu Popa در bpo-20295 ارائهشده است) و قالب WebP (که توسط Fabrice Aneche و Claudiu Popa در bpo-20197 ارائهشده است) را میشناسد.
importlib¶
کلاس util.LazyLoader در برنامههایی که زمان راهاندازی در آنها اهمیت دارد، امکان بارگذاری تنبل ماژولها را فراهم میکند. (ارائهشده توسط برت کانون در bpo-17621.)
متد abc.InspectLoader.source_to_code() اکنون یک متد ایستا است. این کار مقداردهی اولیهی یک شیء ماژول با کد کامپایلشده از یک رشته را از طریق اجرای exec(code, module.__dict__) آسانتر میکند. (مشارکتشده توسط Brett Cannon در bpo-21156.)
تابع جدید util.module_from_spec() اکنون روش ترجیحی برای ایجاد یک ماژول جدید است. برخلاف ایجاد مستقیم یک نمونهی types.ModuleType، این تابع جدید ویژگیهای مختلفِ کنترلشده توسط ایمپورت را بر اساس شیء مشخصات ورودی تنظیم میکند. (مشارکتشده توسط Brett Cannon در bpo-20383.)
ipaddress¶
هر دو کلاس IPv4Network و IPv6Network اکنون آرگومان تاپل (address, netmask) را میپذیرند تا بتوان بهسادگی اشیای شبکه را از آدرسهای موجود ساخت:
>>> import ipaddress
>>> ipaddress.IPv4Network(('127.0.0.0', 8))
IPv4Network('127.0.0.0/8')
>>> ipaddress.IPv4Network(('127.0.0.0', '255.0.0.0'))
IPv4Network('127.0.0.0/8')
(ارائهشده توسط Peter Moody و Antoine Pitrou در bpo-16531.)
ویژگی جدید reverse_pointer برای کلاسهای IPv4Address و IPv6Address نام رکورد PTR در DNS معکوس را برمیگرداند:
>>> import ipaddress
>>> addr = ipaddress.IPv4Address('127.0.0.1')
>>> addr.reverse_pointer
'1.0.0.127.in-addr.arpa'
>>> addr6 = ipaddress.IPv6Address('::1')
>>> addr6.reverse_pointer
'1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa'
(مشارکتشده توسط لئون وبر در bpo-20480.)
json¶
رابط خط فرمان json.tool اکنون ترتیب کلیدها را در اشیای JSON ورودی حفظ میکند. برای مرتبسازی الفبایی کلیدها میتوان از گزینه جدید --sort-keys استفاده کرد. (مشارکتشده توسط Berker Peksag در bpo-21650.)
کدگشای JSON اکنون بهجای ValueError، استثنای JSONDecodeError را ایجاد میکند تا اطلاعات زمینهای بهتری دربارهی خطا فراهم کند. (مشارکتشده توسط Serhiy Storchaka در bpo-19361.)
linecache¶
تابع جدید lazycache() میتواند برای ثبت اطلاعات مربوط به ماژولی که مبتنی بر پرونده نیست استفاده شود تا امکان دریافت سطرهای آن بعداً از طریق getline() فراهم گردد. این کار از انجام عملیات ورودی/خروجی (I/O) تا زمانی که واقعاً به سطری نیاز باشد جلوگیری میکند، بدون آنکه لازم باشد متغیرهای سراسری ماژول را بهطور نامحدود همراه خود نگه داریم. (ارائهشده توسط Robert Collins در bpo-17911.)
locale¶
تابع جدید delocalize() را میتوان برای تبدیل یک رشته به یک رشتهی عددی نرمالشده به کار برد که تنظیمات LC_NUMERIC را در نظر میگیرد:
>>> import locale
>>> locale.setlocale(locale.LC_NUMERIC, 'de_DE.UTF-8')
'de_DE.UTF-8'
>>> locale.delocalize('1.234,56')
'1234.56'
>>> locale.setlocale(locale.LC_NUMERIC, 'en_US.UTF-8')
'en_US.UTF-8'
>>> locale.delocalize('1,234.56')
'1234.56'
(مشارکتشده توسط Cédric Krier در bpo-13918.)
گزارشگیری¶
همهی متدهای گزارشگیری (Logger log()، exception()، critical()، debug() و غیره)، اکنون علاوه بر مقادیر بولی و تاپلهای استثنا، نمونههای استثنا را بهعنوان آرگومان exc_info میپذیرند:
>>> import logging
>>> try:
... 1/0
... except ZeroDivisionError as ex:
... logging.error('exception', exc_info=ex)
ERROR:root:exception
(مشارکتشده توسط یوری سلیوانوف در bpo-20537.)
کلاس handlers.HTTPHandler اکنون یک نمونهی اختیاری از ssl.SSLContext را برای پیکربندی تنظیمات SSL استفادهشده در یک اتصال HTTP میپذیرد. (مشارکت الکس گینور در bpo-22788.)
کلاس handlers.QueueListener اکنون آرگومان کلیدواژهای respect_handler_level را میپذیرد که اگر روی True تنظیم شود، پیامها را با در نظر گرفتن سطوح هندلر به هندلرها ارسال میکند. (مشارکتشده توسط Vinay Sajip.)
math¶
دو ثابت جدید به ماژول math افزوده شده است: inf و nan. (مشارکت Mark Dickinson در bpo-23185.)
تابع جدید isclose() راهی برای آزمون برابری تقریبی فراهم میکند. (مشارکتشده توسط Chris Barker و Tal Einat در bpo-24270.)
تابع جدید gcd() افزوده شده است. تابع fractions.gcd() اکنون منسوخ شده است. (مشارکتشده توسط Mark Dickinson و Serhiy Storchaka در bpo-22486.)
تابع جدید scandir() که پیمایشگری از اشیاء DirEntry را برمیگرداند، اضافه شده است. در صورت امکان، scandir() هنگام پویش یک پوشه، ویژگیهای پرونده را استخراج میکند و نیاز به انجام فراخوانیهای سیستمی بعدی برای تعیین نوع یا ویژگیهای پرونده را از بین میبرد، که این امر ممکن است کارایی را بهطور چشمگیری بهبود بخشد. (با مشارکت Ben Hoyt و با کمک Victor Stinner در bpo-22524.)
در ویندوز، اکنون ویژگی جدید stat_result.st_file_attributes در دسترس است. این ویژگی با عضو dwFileAttributes از ساختار BY_HANDLE_FILE_INFORMATION که توسط GetFileInformationByHandle() بازگردانده میشود مطابقت دارد. (مشارکتشده توسط Ben Hoyt در bpo-21719.)
تابع urandom() اکنون در Linux 3.17 یا جدیدتر از فراخوانی سیستمی getrandom() و در OpenBSD 5.6 و جدیدتر از getentropy() استفاده میکند؛ بدینترتیب نیاز به استفاده از /dev/urandom برطرف میشود و از بروز خطا به دلیل احتمال تمامشدن توصیفگرهای پرونده جلوگیری میشود. (مشارکتشده توسط Victor Stinner در bpo-22181.)
توابع جدید get_blocking() و set_blocking() امکان دریافت و تنظیم حالت مسدودکنندهی توصیفگر پرونده (O_NONBLOCK) را فراهم میکنند. (مشارکتشده توسط Victor Stinner در bpo-22054.)
توابع truncate() و ftruncate() اکنون در ویندوز پشتیبانی میشوند. (مشارکتشده توسط استیو داور در bpo-23668.)
تابع جدید os.path.commonpath() وجود دارد که بلندترین زیرمسیر مشترک هر یک از مسیرنامهای ارسالشده را برمیگرداند. برخلاف تابع os.path.commonprefix()، این تابع همیشه یک مسیر معتبر برمیگرداند:
>>> os.path.commonprefix(['/usr/lib', '/usr/local/lib'])
'/usr/l'
>>> os.path.commonpath(['/usr/lib', '/usr/local/lib'])
'/usr'
(مشارکتشده توسط Rafik Draoui و Serhiy Storchaka در bpo-10395.)
pathlib¶
از متد جدید Path.samefile() میتوان برای بررسی اینکه آیا مسیر به همان پروندهای اشاره میکند که مسیر دیگری به آن اشاره دارد، استفاده کرد؛ آن مسیر میتواند شیء دیگری از نوع Path یا یک رشته باشد:
>>> import pathlib
>>> p1 = pathlib.Path('/etc/hosts')
>>> p2 = pathlib.Path('/etc/../etc/hosts')
>>> p1.samefile(p2)
True
(مشارکتشده توسط Vajrasky Kok و Antoine Pitrou در bpo-19775.)
متد Path.mkdir() اکنون یک آرگومان اختیاری جدید exist_ok را میپذیرد تا با عملکرد mkdir -p و os.makedirs() مطابقت داشته باشد. (با مشارکت Berker Peksag در bpo-21539.)
متد جدیدی Path.expanduser() برای بسط پیشوندهای ~ و ~user وجود دارد. (مشارکت Serhiy Storchaka و Claudiu Popa در bpo-19776.)
از متد کلاس جدید Path.home() میتوان برای به دست آوردن نمونهای از Path که نمایانگر پوشهی خانگی کاربر است، استفاده کرد. (مشارکتشده توسط Victor Salgado و Mayank Tripathi در bpo-19777.)
متدهای جدید Path.write_text()، Path.read_text()، Path.write_bytes() و Path.read_bytes() برای سادهسازی عملیات خواندن/نوشتن روی پروندهها.
قطعهکد زیر پروندهی موجود ~/spam42 را ایجاد یا بازنویسی میکند:
>>> import pathlib
>>> p = pathlib.Path('~/spam42')
>>> p.expanduser().write_text('ham')
3
(مشارکتشده توسط Christopher Welborn در bpo-20218.)
pickle¶
اشیاء تودرتو، مانند متدهای غیرمقید یا کلاسهای تودرتو، اکنون میتوانند با استفاده از پروتکلهای پیکل قدیمیتر از نسخه ۴ پروتکل پیکل شوند. نسخه ۴ پروتکل از قبل این موارد را پشتیبانی میکند. (ارائهشده توسط Serhiy Storchaka در bpo-23611.)
poplib¶
فرمان جدید POP3.utf8() پشتیبانی از RFC 6856 (رایانامه بینالمللیسازیشده) را فعال میکند، اگر سرور POP از آن پشتیبانی کند. (با مشارکت Milan OberKirch در bpo-21804.)
ارجاعها و ارجاعهای شرطی به گروههای با طول ثابت اکنون در شرطهای پسنگر مجاز هستند:
>>> import re
>>> pat = re.compile(r'(a|b).(?<=\1)c')
>>> pat.match('aac')
<_sre.SRE_Match object; span=(0, 3), match='aac'>
>>> pat.match('bbc')
<_sre.SRE_Match object; span=(0, 3), match='bbc'>
(مشارکتشده توسط Serhiy Storchaka در bpo-9179.)
تعداد گروههای ثبتکننده در عبارتهای باقاعده دیگر محدود به ۱۰۰ نیست. (مشارکتشده توسط Serhiy Storchaka در bpo-22437.)
توابع sub() و subn() اکنون به جای برخاست دادن استثنا، گروههای تطبیقنیافته را با رشتههای خالی جایگزین میکنند. (مشارکتشده توسط Serhiy Storchaka در bpo-1519638.)
استثناهای re.error دارای ویژگیهای جدید msg، pattern، pos، lineno و colno هستند که اطلاعات زمینهای بهتری دربارهی خطا فراهم میکنند:
>>> re.compile("""
... (?x)
... .++
... """)
Traceback (most recent call last):
...
sre_constants.error: multiple repeat at position 16 (line 3, column 7)
(مشارکتشده توسط Serhiy Storchaka در bpo-22578.)
readline¶
میتوان از تابع جدید append_history_file() برای الحاق تعداد مشخصشدهای از عناصر انتهایی تاریخچه به پروندهی دادهشده استفاده کرد. (مشارکتشده توسط Bruno Cauet در bpo-22940.)
selectors¶
کلاس جدید DevpollSelector از پایش کارآمد /dev/poll در Solaris پشتیبانی میکند. (مشارکتشده توسط Giampaolo Rodola' در bpo-18931.)
shutil¶
تابع move() اکنون آرگومان copy_function را میپذیرد که برای مثال در صورت نیاز به نادیدهگرفتن فرادادههای پرونده هنگام انتقال، امکان میدهد بهجای copy2() پیشفرض از تابع copy() استفاده شود. (مشارکتشده توسط Claudiu Popa در bpo-19840.)
تابع make_archive() اکنون از قالب xztar پشتیبانی میکند. (مشارکتشده توسط Serhiy Storchaka در bpo-5411.)
سیگنال¶
در ویندوز، تابع set_wakeup_fd() اکنون از دستههای سوکت نیز پشتیبانی میکند. (مشارکتشده توسط ویکتور استینر در bpo-22018.)
ثابتهای گوناگون SIG* در ماژول signal به Enumها تبدیل شدهاند. این امر اجازه میدهد که در حین اشکالزدایی، نامهای معنادار بهجای «اعداد جادویی» از نوع عدد صحیح چاپ شوند. (با مشارکت Giampaolo Rodola' در bpo-21076.)
smtpd¶
هر دو کلاس SMTPServer و SMTPChannel اکنون یک آرگومان کلیدواژهای decode_data را میپذیرند تا تعیین کنند که آیا بخش DATA از تراکنش SMTP با استفاده از کدک "utf-8" کدگشایی میشود یا بهجای آن بهصورت رشته بایتی به متد SMTPServer.process_message() ارائه میشود. مقدار پیشفرض به دلایل سازگاری با نسخههای قبلی True است، اما در پایتون 3.6 به False تغییر خواهد کرد. اگر decode_data روی False تنظیم شود، متد process_message باید برای پذیرش آرگومانهای کلیدواژهای آماده باشد. (مشارکت Maciej Szulik در bpo-19662.)
کلاس SMTPServer اکنون در صورتی که decode_data روی True تنظیمشده باشد، افزونهی 8BITMIME (RFC 6152) را اعلام میکند. اگر کلاینت در دستور MAIL مقدار BODY=8BITMIME را مشخص کند، این مقدار از طریق کلیدواژهی mail_options به SMTPServer.process_message() منتقل میشود. (با مشارکت Milan Oberkirch و R. David Murray در bpo-21795.)
کلاس SMTPServer اکنون از توسعهی SMTPUTF8 نیز پشتیبانی میکند (RFC 6531: ایمیل بینالمللیشده). اگر کلاینت SMTPUTF8 BODY=8BITMIME را در دستور MAIL مشخص کرده باشد، آنها از طریق کلیدواژهی mail_options به SMTPServer.process_message() پاس داده میشوند. مسئولیت مدیریت صحیح دادههای SMTPUTF8 بر عهدهی متد process_message است. (با مشارکت Milan Oberkirch در bpo-21725.)
اکنون میتوان آدرسهای IPv6 را مستقیماً یا از طریق حل نام در سازندهی SMTPServer ارائه کرد و اتصال آن با موفقیت برقرار شود. (مشارکتشده توسط Milan Oberkirch در bpo-14758.)
sndhdr¶
توابع what() و whathdr() اکنون یک namedtuple() برمیگردانند. (مشارکتشده توسط Claudiu Popa در bpo-18615.)
socket¶
توابع دارای مهلت زمانی اکنون بهجای ساعت سیستم از ساعت یکنواخت استفاده میکنند. (ارائهشده توسط ویکتور استینر در bpo-22043.)
متد جدید socket.sendfile() امکان ارسال یک پرونده از طریق سوکت را با استفاده از تابع با کارایی بالا os.sendfile() در یونیکس فراهم میکند و در نتیجه، بارگذاریها ۲ تا ۳ برابر سریعتر از حالتی خواهند بود که از socket.send() ساده استفاده شود. (مشارکتشده توسط Giampaolo Rodola' در bpo-17552.)
متد socket.sendall() دیگر با هر بار دریافت یا ارسال بایتها، مهلت زمانی سوکت را بازنشانی نمیکند. مهلت زمانی سوکت اکنون حداکثر مدت زمان کل برای ارسال تمام دادهها است. (مشارکت Victor Stinner در bpo-23853.)
آرگومان صف انتظار (backlog) از متد socket.listen() اکنون اختیاری است. بهطور پیشفرض روی SOMAXCONN یا 128 تنظیم میشود، هر کدام که کمتر باشد. (مشارکتشده توسط Charles-François Natali در bpo-21455.)
ssl¶
پشتیبانی از BIO حافظه¶
(مشارکت Geert Jansen در bpo-21965.)
کلاس جدید SSLObject برای فراهم کردن پشتیبانی از پروتکل SSL در مواردی که قابلیتهای ورودی/خروجی شبکهی SSLSocket لازم نیستند یا بهینه نیستند، افزوده شده است. SSLObject نمایانگر یک نمونه از پروتکل SSL است، اما هیچیک از متدهای ورودی/خروجی شبکه را پیادهسازی نمیکند و در عوض یک رابط بافر حافظه فراهم میکند. از کلاس جدید MemoryBIO میتوان برای انتقال دادهها بین پایتون و یک نمونه از پروتکل SSL استفاده کرد.
پشتیبانی SSL مبتنی بر BIO حافظه در درجه اول برای استفاده در چارچوبهایی در نظر گرفته شده است که ورودی/خروجی ناهمگام را پیادهسازی میکنند و مدل آمادگی SSLSocket ("select/poll") برای آنها ناکارآمد است.
میتوان از متد جدید SSLContext.wrap_bio() برای ایجاد یک نمونهی جدید SSLObject استفاده کرد.
پشتیبانی از مذاکره پروتکل لایه کاربرد (Application-Layer Protocol Negotiation)¶
(مشارکتشده توسط بنجامین پیترسون در bpo-20188.)
در جایی که پشتیبانی OpenSSL وجود دارد، ماژول ssl اکنون افزونهی TLS مذاکره پروتکل لایه کاربردی (Application-Layer Protocol Negotiation) را، همانطور که در RFC 7301 شرح داده شده است، پیادهسازی میکند.
میتوان از SSLContext.set_alpn_protocols() جدید برای تعیین اینکه یک سوکت باید در طول دستدهی TLS چه پروتکلهایی را اعلام کند، استفاده کرد.
متد جدید SSLSocket.selected_alpn_protocol() پروتکلی را که در طول دستدهی TLS انتخاب شده است برمیگرداند. پرچم HAS_ALPN نشان میدهد که آیا پشتیبانی از ALPN وجود دارد یا خیر.
سایر تغییرات¶
یک متد جدید SSLSocket.version() برای پرسوجو از نسخهی واقعی پروتکل در حال استفاده وجود دارد. (ارائهشده توسط Antoine Pitrou در bpo-20421.)
کلاس SSLSocket اکنون یک متد SSLSocket.sendfile() را پیادهسازی میکند. (مشارکتشده توسط Giampaolo Rodola' در bpo-17552.)
متد SSLSocket.send() اکنون روی سوکت غیرمسدودکننده، در صورتی که عملیات مسدود شود، یکی از استثناهای ssl.SSLWantReadError یا ssl.SSLWantWriteError را ایجاد میکند. پیشتر، مقدار 0 را برمیگرداند. (مشارکتشده توسط نیکولاوس راث در bpo-20951.)
تابع cert_time_to_seconds() اکنون مطابق RFC 5280 زمان ورودی را بهعنوان UTC و نه زمان محلی تفسیر میکند. علاوه بر این، مقدار بازگشتی همیشه یک int است. (مشارکتشده توسط Akira Li در bpo-19940.)
متدهای جدید SSLObject.shared_ciphers() و SSLSocket.shared_ciphers() فهرست رمزهایی را که کلاینت در طول دستدهی ارسال کرده است، برمیگردانند. (مشارکتشده توسط Benjamin Peterson در bpo-23186.)
متدهای SSLSocket.do_handshake()، SSLSocket.read()، SSLSocket.shutdown() و SSLSocket.write() از کلاس SSLSocket دیگر مهلت زمانی سوکت را در هر بار دریافت یا ارسال بایتها بازنشانی نمیکنند. مهلت زمانی سوکت اکنون حداکثر مدت زمان کل متد است. (مشارکتشده توسط Victor Stinner در bpo-23853.)
تابع match_hostname() اکنون از تطبیق نشانیهای IP پشتیبانی میکند. (مشارکتشده توسط آنتوان پیترو در bpo-23239.)
sqlite3¶
کلاس Row اکنون بهطور کامل از پروتکل دنباله پشتیبانی میکند، بهویژه پیمایش با reversed() و اندیسگذاری اسلایسی. (مشارکتشده توسط Claudiu Popa در bpo-10203؛ و توسط Lucas Sinclair، Jessica McKellar و Serhiy Storchaka در bpo-13583.)
subprocess¶
تابع جدید run() اضافه شده است. این تابع فرمان مشخصشده را اجرا میکند و شیء CompletedProcess را برمیگرداند که فرایندی تمامشده را توصیف میکند. API جدید یکدستتر است و رویکرد توصیهشده برای فراخوانی زیرفرایندها در کد پایتونی است که نیازی به حفظ سازگاری با نسخههای قدیمیتر پایتون ندارد. (مشارکتشده توسط Thomas Kluyver در bpo-23342.)
مثالها:
>>> subprocess.run(["ls", "-l"]) # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)
>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1
>>> subprocess.run(["ls", "-l", "/dev/null"], stdout=subprocess.PIPE)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n')
sys¶
تابع جدید set_coroutine_wrapper() امکان تنظیم یک قلاب سراسری را فراهم میکند که هر زمان یک شیء همروال توسط تابع async def ایجاد شود، فراخوانی خواهد شد. میتوان از get_coroutine_wrapper() متناظر برای بهدستآوردن پوششی که در حال حاضر تنظیم شده است استفاده کرد. هر دو تابع آزمایشی هستند و صرفاً برای مقاصد اشکالزدایی در نظر گرفته شدهاند. (مشارکت Yury Selivanov در bpo-24017.)
میتوان از تابع جدید is_finalizing() برای بررسی اینکه آیا مفسر پایتون در حال خاموش شدن است یا خیر، استفاده کرد. (مشارکتشده توسط آنتوان پیترو در bpo-22696.)
sysconfig¶
نام پوشهی اسکریپتهای کاربر در ویندوز اکنون دو جزء نخست نسخهی پایتون را در بر میگیرد. (مشارکتشده توسط Paul Moore در bpo-23437.)
tarfile¶
آرگومان حالت تابع open() اکنون "x" را برای درخواست ایجاد انحصاری میپذیرد. (مشارکت Berker Peksag در bpo-21717.)
متدهای TarFile.extractall() و TarFile.extract() اکنون یک آرگومان کلیدواژهای numeric_owner میپذیرند. اگر روی True تنظیم شود، پروندهها و پوشههای استخراجشده متعلق به uid و gid عددی موجود در پرونده tar خواهند بود. اگر روی False تنظیم شود (مقدار پیشفرض، و رفتار نسخههای پیش از 3.5)، آنها متعلق به کاربر و گروه نامبردهشده در پرونده tar خواهند بود. (مشارکتشده توسط مایکل فوگت و اریک اسمیت در bpo-23193.)
متد TarFile.list() اکنون یک آرگومان کلیدواژهای اختیاری members را میپذیرد که میتوان آن را روی زیرمجموعهای از فهرست بازگرداندهشده توسط TarFile.getmembers() تنظیم کرد. (مشارکتشده توسط Serhiy Storchaka در bpo-21549.)
timeit¶
میتوان از گزینهی جدید خط فرمان -u یا --unit=U برای تعیین واحد زمان در خروجی تایمر استفاده کرد. گزینههای پشتیبانیشده usec، msec، یا sec هستند. (مشارکت Julian Gindi در bpo-18983.)
تابع timeit() پارامتر جدیدی به نام globals برای تعیین فضای نامی که کد در آن اجرا خواهد شد، دارد. (مشارکتشده توسط Ben Roberts در bpo-2527.)
tkinter¶
ماژول tkinter._fix که برای راهاندازی محیط Tcl/Tk در ویندوز استفاده میشد، با تابعی خصوصی در ماژول _tkinter جایگزین شده است که هیچ تغییر دائمی در متغیرهای محیطی ایجاد نمیکند. (ارائهشده توسط Zachary Ware در bpo-20035.)
unittest¶
متد TestLoader.loadTestsFromModule() اکنون یک آرگومان صرفاً کلیدواژهای pattern را میپذیرد که بهعنوان آرگومان سوم به load_tests ارسال میشود. بستههای یافتشده اکنون از نظر وجود load_tests بررسی میشوند، صرفنظر از اینکه مسیرشان با pattern مطابقت دارد یا خیر، زیرا امکان ندارد نام یک بسته با الگوی پیشفرض مطابقت داشته باشد. (مشارکتشده توسط Robert Collins و Barry A. Warsaw در bpo-16662.)
اکنون خطاهای کشف unittest در ویژگی TestLoader.errors از نمونهی TestLoader آشکار میشوند. (مشارکتشده توسط Robert Collins در bpo-19746.)
گزینهی جدید خط فرمان --locals برای نمایش متغیرهای محلی در ردگیریها. (مشارکت رابرت کالینز در bpo-22936.)
urllib¶
کلاس جدید request.HTTPPasswordMgrWithPriorAuth اجازه میدهد اطلاعات احراز هویت پایهی HTTP بهگونهای مدیریت شوند که رسیدگی غیرضروری به پاسخ 401 حذف شود، یا اینکه اطلاعات احراز هویت بهطور بیقید و شرط در نخستین درخواست ارسال شوند تا امکان برقراری ارتباط با سرورهایی که در صورت عدم ارسال سرآیند Authorization بهجای پاسخ 401 پاسخ 404 برمیگردانند فراهم شود. (مشارکتشده توسط Matej Cepl در bpo-19494 و Akshit Khurana در bpo-7159.)
آرگومان جدید quote_via برای تابع parse.urlencode() در صورت نیاز، راهی برای کنترل کدگذاری بخشهای پرسوجو فراهم میکند. (مشارکتشده توسط Samwyse و Arnon Yaari در bpo-13866.)
تابع request.urlopen() یک شیء ssl.SSLContext را بهعنوان آرگومان زمینه میپذیرد که برای اتصال HTTPS استفاده خواهد شد. (ارائهشده توسط الکس گینور در bpo-22366.)
تابع parse.urljoin() بهروزرسانی شد تا برای حل URLهای نسبی، بهجای RFC 1808 و RFC 2396 از معناشناسی RFC 3986 استفاده کند. (مشارکتشده توسط Demian Brecht و Senthil Kumaran در bpo-22118.)
wsgiref¶
آرگومان headers در سازندهی کلاس headers.Headers اکنون اختیاری است. (مشارکتشده توسط Pablo Torres Navarrete و SilentGhost در bpo-5800.)
zipfile¶
خروجی ZIP اکنون میتواند در جریانهای غیرقابل مکانیابی نوشته شود. (مشارکتشده توسط Serhiy Storchaka در bpo-23252.)
آرگومان حالت از متد ZipFile.open() اکنون "x" را برای درخواست ایجاد انحصاری میپذیرد. (مشارکت Serhiy Storchaka در bpo-21717.)