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

نویسنده:

A.M. Kuchling (amk at amk.ca)

این مقاله ویژگی‌های جدید در پایتون 2.7 را توضیح می‌دهد. پایتون 2.7 در ۳ ژوئیه ۲۰۱۰ منتشر شد.

پردازش اعداد به روش‌های بسیاری بهبود یافته است، هم برای اعداد ممیز شناور و هم برای کلاس Decimal. افزودنی‌های مفیدی به کتابخانه استاندارد اضافه شده‌اند، مانند ماژول unittest که به‌طور چشمگیری ارتقا یافته است، ماژول argparse برای پارس کردن گزینه‌های خط فرمان، کلاس‌های سودمند OrderedDict و Counter در ماژول collections، و بسیاری از بهبودهای دیگر.

پایتون 2.7 قرار است آخرین نسخه از سری 2.x باشد، بنابراین تلاش کردیم آن را به نسخه‌ای خوب برای بلندمدت تبدیل کنیم. برای کمک به انتقال به پایتون 3، چندین ویژگی جدید از سری پایتون 3.x در 2.7 گنجانده شده‌اند.

این مقاله تلاش نمی‌کند مشخصات کاملی از ویژگی‌های جدید ارائه دهد، بلکه در عوض مروری مناسب فراهم می‌آورد. برای جزئیات کامل، باید به مستندات پایتون 2.7 در https://docs.python.org مراجعه کنید. اگر می‌خواهید منطق طراحی و پیاده‌سازی را درک کنید، به PEP (پیشنهاد بهبود پایتون) مربوط به ویژگی جدید خاصی، یا به مورد در https://bugs.python.org که در آن تغییری بحث شده است، مراجعه کنید. هر زمان که ممکن باشد، «تازه‌های پایتون» برای هر تغییر به آیتم باگ/وصل پیوند می‌دهد.

آینده‌ی Python 2.x

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

با این حال، اگرچه زیرمجموعه‌ی مشترک بزرگی میان Python 2.7 و Python 3 وجود دارد و بسیاری از تغییرات درگیر در مهاجرت به آن زیرمجموعه‌ی مشترک، یا مستقیماً به Python 3، را می‌توان به‌صورت ایمن خودکار کرد، برخی تغییرات دیگر (به‌ویژه آن‌هایی که با مدیریت یونیکد مرتبط‌اند) ممکن است برای مهاجرت مؤثر به بررسی دقیق و ترجیحاً بدنه‌های مقاوم آزمون رگرسیون خودکار نیاز داشته باشند.

این بدان معناست که پایتون 2.7 برای مدت طولانی در جای خود باقی خواهد ماند و پلتفرم پایه‌ای پایدار و پشتیبانی‌شده برای سیستم‌های عملیاتی که هنوز به پایتون 3 منتقل نشده‌اند، فراهم خواهد کرد. کل چرخه‌ی حیات مورد انتظار سری پایتون 2.7 در PEP 373 به‌تفصیل شرح داده شده است.

برخی از پیامدهای کلیدی اهمیت بلندمدت 2.7 عبارت‌اند از:

  • همان‌طور که در بالا ذکر شد، نسخه‌ی 2.7 در مقایسه با نسخه‌های قبلی 2.x، دوره‌ی نگهداری بسیار طولانی‌تری دارد. در حال حاضر انتظار می‌رود پایتون 2.7 حداقل تا سال ۲۰۲۰ (۱۰ سال پس از انتشار اولیه‌ی آن، در مقایسه با دوره‌ی پشتیبانی معمول‌تر ۱۸--۲۴ ماه) از سوی تیم توسعه‌ی هسته پشتیبانی شود (با دریافت به‌روزرسانی‌های امنیتی و رفع سایر اشکال‌ها).

  • همان‌طور که کتابخانه استاندارد پایتون 2.7 قدیمی می‌شود، استفاده مؤثر از شاخص بسته‌های پایتون (Python Package Index)، چه به‌طور مستقیم و چه از طریق یک بازتوزیع‌کننده (redistributor)، برای کاربران پایتون 2 اهمیت بیشتری پیدا می‌کند. علاوه بر تنوع گسترده‌ای از بسته‌های شخص ثالث برای وظایف مختلف، بسته‌های موجود شامل بک‌پورت‌هایی از ماژول‌ها و قابلیت‌های جدید کتابخانه استاندارد پایتون 3 که با پایتون 2 سازگار هستند، و همچنین ابزارها و کتابخانه‌های مختلفی است که می‌توانند مهاجرت به پایتون 3 را آسان‌تر کنند. راهنمای کاربری بسته‌بندی پایتون راهنمایی‌هایی درباره‌ی دانلود و نصب نرم‌افزار از شاخص بسته‌های پایتون ارائه می‌دهد.

  • در حالی که رویکرد ترجیحی برای بهبود پایتون 2 اکنون انتشار بسته‌های جدید در فهرست بسته‌های پایتون (Python Package Index) است، این رویکرد لزوماً در همه موارد کارساز نیست، به‌ویژه موارد مربوط به امنیت شبکه. در مواردی استثنایی که نمی‌توان با انتشار بسته‌های جدید یا به‌روزرسانی‌شده در PyPI به‌طور کافی از پس آن‌ها برآمد، می‌توان از فرایند پیشنهاد بهبود پایتون (PEP) برای استدلال در حمایت از افزودن قابلیت‌های جدید مستقیماً به کتابخانه استاندارد پایتون 2 استفاده کرد. هرگونه افزودنی از این دست، و نسخه‌های نگهداری که در آن‌ها افزوده شده‌اند، در بخش ویژگی‌های جدید افزوده‌شده به نسخه‌های نگهداری پایتون 2.7 که در ادامه آمده است، ذکر خواهند شد.

برای پروژه‌هایی که مایل به مهاجرت از پایتون 2 به پایتون 3 هستند، یا برای توسعه‌دهندگان کتابخانه‌ها و چارچوب‌ها که می‌خواهند از کاربران هر دو نسخه‌ی پایتون 2 و پایتون 3 پشتیبانی کنند، ابزارها و راهنماهای گوناگونی در دسترس است که به تصمیم‌گیری درباره‌ی رویکردی مناسب و مدیریت برخی از جزئیات فنی مربوط کمک می‌کنند. نقطه‌ی شروع پیشنهادی، راهنمای عملی چگونه کد پایتون 2 را به پایتون 3 منتقل کنیم است.

تغییرات در مدیریت هشدارهای منسوخ‌شدگی

برای پایتون 2.7، تصمیمی سیاستی گرفته شد تا هشدارهایی که تنها برای توسعه‌دهندگان اهمیت دارند به‌طور پیش‌فرض خاموش شوند. اکنون DeprecationWarning و زیرکلاس‌های آن، مگر آنکه خلاف آن درخواست شود، نادیده گرفته می‌شوند؛ این امر مانع از آن می‌شود که کاربران هشدارهایی را که توسط یک برنامه ایجاد شده‌اند ببینند. این تغییر در شاخه‌ای که به پایتون 3.2 تبدیل شد نیز اعمال شد. (در stdlib-sig بحث شد و در bpo-7319 انجام شد.)

در نسخه‌های پیشین، پیام‌های DeprecationWarning به‌صورت پیش‌فرض فعال بودند و به توسعه‌دهندگان پایتون نشان روشنی می‌دادند که کدشان ممکن است در نسخه‌ی اصلی (major) آینده‌ی پایتون در کجا بشکند.

با این حال، شمار کاربران برنامه‌های مبتنی بر پایتون که مستقیماً در توسعه‌ی این برنامه‌ها نقشی ندارند، روزبه‌روز بیشتر می‌شود. پیام‌های DeprecationWarning برای چنین کاربرانی بی‌ربط است؛ این پیام‌ها باعث می‌شوند کاربران درباره‌ی برنامه‌ای که در واقع به‌درستی کار می‌کند نگران شوند و بار پاسخ‌گویی به این نگرانی‌ها را بر دوش توسعه‌دهندگان برنامه می‌گذارند.

می‌توانید نمایش پیام‌های DeprecationWarning را با اجرای پایتون به‌همراه سوییچ -Wdefault (شکل کوتاه: -Wd)، یا با تنظیم متغیر محیطی PYTHONWARNINGS روی "default" (یا "d") پیش از اجرای پایتون، دوباره فعال کنید. کد پایتون نیز می‌تواند آن‌ها را با فراخوانی warnings.simplefilter('default') دوباره فعال کند.

ماژول unittest همچنین هنگام اجرای آزمون‌ها، هشدارهای منسوخ‌شدن را به‌طور خودکار دوباره فعال می‌کند.

قابلیت‌های Python 3.1

درست همان‌طور که پایتون 2.6 ویژگی‌هایی از پایتون 3.0 را در بر گرفت، نسخه 2.7 نیز برخی از ویژگی‌های جدید پایتون 3.1 را در بر می‌گیرد. سری 2.x همچنان ابزارهایی برای مهاجرت به سری 3.x ارائه می‌دهد.

فهرست ناقصی از قابلیت‌های 3.1 که به نسخه 2.7 بک‌پورت شده‌اند:

  • سینتکس مقادیر لفظی مجموعه ({1,2,3} یک مجموعه تغییرپذیر است).

  • درک دیکشنری و درک مجموعه ({i: i*2 for i in range(3)}).

  • چندین مدیر زمینه در یک دستور with.

  • نسخه‌ی جدید کتابخانه‌ی io که برای کارایی بیشتر به زبان C بازنویسی شده است.

  • نوع دیکشنری مرتب که در PEP 372: افزودن دیکشنری مرتب به collections توصیف شده است.

  • مشخص‌کننده‌ی قالب جدید "," که در PEP 378: مشخص‌کننده قالب برای جداکننده هزارگان توضیح داده شده است.

  • شیء memoryview.

  • زیرمجموعه‌ی کوچکی از ماژول importlib، که در ادامه توصیف شده است.

  • repr() برای عدد اعشاری x در بسیاری از موارد کوتاه‌تر است: اکنون بر پایه‌ی کوتاه‌ترین رشته‌ی مبنای ده‌ای است که تضمین می‌شود با گرد کردن، به x بازگردد. مانند نسخه‌های پیشین پایتون، تضمین شده است که float(repr(x)) مقدار x را بازیابی می‌کند.

  • تبدیل عدد ممیز شناور به رشته و رشته به عدد ممیز شناور به‌درستی گرد می‌شود. تابع round() نیز اکنون به‌درستی گرد می‌کند.

  • نوع PyCapsule، که برای فراهم کردن یک API زبان C برای ماژول‌های توسعه‌ای استفاده می‌شود.

  • تابع PyLong_AsLongAndOverflow() در API زبان C.

سایر هشدار‌های جدید حالت Python3 عبارت‌اند از:

  • operator.isCallable() و operator.sequenceIncludes() که در 3.x پشتیبانی نمی‌شوند، اکنون هشدار ایجاد می‌کنند.

  • سوییچ -3 اکنون به‌طور خودکار سوییچ -Qwarn را فعال می‌کند که هشدارهایی درباره‌ی استفاده از تقسیم کلاسیک روی اعداد صحیح و اعداد صحیح بلند ایجاد می‌کند.

PEP 372: افزودن دیکشنری مرتب به collections

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

API مربوط به OrderedDict همان رابط دیکشنری‌های معمولی را فراهم می‌کند، اما کلیدها و مقادیر را به ترتیبی تضمین‌شده که به زمان نخستین درج هر کلید بستگی دارد، پیمایش می‌کند:

>>> from collections import OrderedDict
>>> d = OrderedDict([('first', 1),
...                  ('second', 2),
...                  ('third', 3)])
>>> d.items()
[('first', 1), ('second', 2), ('third', 3)]

اگر ورودی جدیدی ورودی موجود را بازنویسی کند، موقعیت درج اصلی بدون تغییر باقی می‌ماند:

>>> d['second'] = 4
>>> d.items()
[('first', 1), ('second', 4), ('third', 3)]

حذف یک ورودی و درج مجدد آن، آن را به انتها منتقل می‌کند:

>>> del d['second']
>>> d['second'] = 5
>>> d.items()
[('first', 1), ('third', 3), ('second', 5)]

متد popitem() یک آرگومان اختیاری last دارد که مقدار پیش‌فرض آن True است. اگر last درست باشد، آخرین کلید افزوده‌شده برگردانده و حذف می‌شود؛ اگر نادرست باشد، قدیمی‌ترین کلید انتخاب می‌شود:

>>> od = OrderedDict([(x,0) for x in range(20)])
>>> od.popitem()
(19, 0)
>>> od.popitem()
(18, 0)
>>> od.popitem(last=False)
(0, 0)
>>> od.popitem(last=False)
(1, 0)

مقایسه‌ی دو دیکشنری مرتب، هم کلیدها و هم مقادیر را بررسی می‌کند و نیازمند آن است که ترتیب درج یکسان باشد:

>>> od1 = OrderedDict([('first', 1),
...                    ('second', 2),
...                    ('third', 3)])
>>> od2 = OrderedDict([('third', 3),
...                    ('first', 1),
...                    ('second', 2)])
>>> od1 == od2
False
>>> # Move 'third' key to the end
>>> del od2['third']; od2['third'] = 3
>>> od1 == od2
True

مقایسه‌ی یک OrderedDict با یک دیکشنری معمولی، ترتیب درج را نادیده می‌گیرد و فقط کلیدها و مقادیر را مقایسه می‌کند.

OrderedDict چگونه کار می‌کند؟ این کلاس یک فهرست پیوندی دوطرفه از کلیدها را نگه می‌دارد و کلیدهای جدید را هنگام درج به فهرست می‌افزاید. یک دیکشنری ثانویه کلیدها را به گره‌های متناظرشان در فهرست نگاشت می‌کند، به‌طوری که حذف نیازی به پیمایش کل فهرست پیوندی ندارد و بنابراین O(1) باقی می‌ماند.

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

  • ماژول ConfigParser به‌صورت پیش‌فرض از آن‌ها استفاده می‌کند؛ به این معنا که پرونده‌های پیکربندی اکنون می‌توانند به ترتیب اصلی خود خوانده، تغییر داده و سپس بازنوشته شوند.

  • متد _asdict() برای collections.namedtuple() اکنون یک دیکشنری مرتب بازمی‌گرداند که مقدارهای آن به همان ترتیب اندیس‌های تاپل زیرین ظاهر می‌شوند.

  • سازنده‌ی کلاس JSONDecoder در ماژول json با پارامتر object_pairs_hook توسعه یافت تا کدگشا بتواند نمونه‌های OrderedDict را بسازد. پشتیبانی از ابزارهای شخص ثالث مانند PyYAML نیز اضافه شد.

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

PEP 372 - افزودن دیکشنری مرتب به collections

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

PEP 378: مشخص‌کننده قالب برای جداکننده هزارگان

برای خواناتر شدن خروجی برنامه، ممکن است مفید باشد که به اعداد بزرگ جداکننده اضافه شود تا به‌جای 18446744073709551616 به‌صورت 18,446,744,073,709,551,616 نمایش داده شوند.

راه‌حل کاملاً عمومی برای انجام این کار، ماژول locale است که می‌تواند از جداکننده‌های متفاوت ("," در آمریکای شمالی، "." در اروپا) و اندازه‌های گروه‌بندی متفاوت استفاده کند، اما استفاده از locale پیچیده است و برای برنامه‌های چندنخی که نخ‌های مختلفی برای locale‌های گوناگون خروجی تولید می‌کنند، مناسب نیست.

بنابراین، سازوکار ساده‌ای برای گروه‌بندی با کاما به زبان کوچک (mini-language) مورد استفاده در متد str.format() افزوده شده است. هنگام قالب‌بندی یک عدد ممیز شناور، کافی است یک کاما بین عرض و دقت قرار دهید:

>>> '{:20,.2f}'.format(18446744073709551616.0)
'18,446,744,073,709,551,616.00'

هنگام قالب‌بندی یک عدد صحیح، ویرگول را پس از عرض قرار دهید:

>>> '{:20,d}'.format(18446744073709551616)
'18,446,744,073,709,551,616'

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

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

PEP 378 - مشخص‌کننده قالب برای جداکننده هزارگان

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

PEP 389: ماژول argparse برای تجزیه خط فرمان

ماژول argparse برای تجزیه آرگومان‌های خط فرمان، به‌عنوان جایگزینی قدرتمندتر برای ماژول optparse افزوده شد.

این بدان معناست که پایتون اکنون از سه ماژول متفاوت برای پارس کردن آرگومان‌های خط فرمان پشتیبانی می‌کند: getopt، optparse و argparse. ماژول getopt شباهت نزدیکی به تابع getopt() کتابخانه‌ی C دارد، بنابراین اگر در حال نوشتن پیش‌نمونه‌ای پایتونی هستید که در نهایت در C بازنویسی خواهد شد، این ماژول همچنان مفید است. optparse زائد می‌شود، اما هیچ برنامه‌ای برای حذف آن وجود ندارد، زیرا هنوز اسکریپت‌های زیادی از آن استفاده می‌کنند و هیچ راه خودکاری برای به‌روزرسانی این اسکریپت‌ها وجود ندارد. (سازگار کردن API ماژول argparse با رابط optparse مورد بحث قرار گرفت، اما به دلیل به‌هم‌ریختگی و دشواری بیش از حد رد شد.)

به‌طور خلاصه، اگر در حال نوشتن اسکریپت جدیدی هستید و نیازی به نگرانی درباره سازگاری با نسخه‌های قبلی پایتون ندارید، به جای optparse از argparse استفاده کنید.

در ادامه یک مثال آمده است:

import argparse

parser = argparse.ArgumentParser(description='Command-line example.')

# Add optional switches
parser.add_argument('-v', action='store_true', dest='is_verbose',
                    help='produce verbose output')
parser.add_argument('-o', action='store', dest='output',
                    metavar='FILE',
                    help='direct output to FILE instead of stdout')
parser.add_argument('-C', action='store', type=int, dest='context',
                    metavar='NUM', default=0,
                    help='display NUM lines of added context')

# Allow any number of additional arguments.
parser.add_argument(nargs='*', action='store', dest='inputs',
                    help='input filenames (default is stdin)')

args = parser.parse_args()
print args.__dict__

مگر اینکه آن را بازنویسی کنید، سوییچ‌های -h و --help به‌طور خودکار اضافه می‌شوند و خروجی مرتب و قالب‌بندی‌شده تولید می‌کنند:

-> ./python.exe argparse-example.py --help
usage: argparse-example.py [-h] [-v] [-o FILE] [-C NUM] [inputs [inputs ...]]

Command-line example.

positional arguments:
  inputs      input filenames (default is stdin)

optional arguments:
  -h, --help  show this help message and exit
  -v          produce verbose output
  -o FILE     direct output to FILE instead of stdout
  -C NUM      display NUM lines of added context

مانند optparse، سوییچ‌ها و آرگومان‌های خط فرمان به‌صورت یک شیء با ویژگی‌هایی که نام آن‌ها توسط پارامترهای dest مشخص می‌شود، بازگردانده می‌شوند:

-> ./python.exe argparse-example.py -v
{'output': None,
 'is_verbose': True,
 'context': 0,
 'inputs': []}

-> ./python.exe argparse-example.py -v -o /tmp/output -C 4 file1 file2
{'output': '/tmp/output',
 'is_verbose': True,
 'context': 4,
 'inputs': ['file1', 'file2']}

argparse اعتبارسنجی بسیار پیشرفته‌تری نسبت به optparse دارد؛ می‌توانید تعداد دقیق آرگومان‌ها را به‌صورت یک عدد صحیح مشخص کنید، ۰ یا بیشتر آرگومان را با ارسال '*'، ۱ یا بیشتر را با ارسال '+'، یا یک آرگومان اختیاری را با ارسال '?'. یک پارسر سطح‌بالا می‌تواند شامل زیرپارسرهایی برای تعریف زیرفرمان‌هایی باشد که مجموعه‌های متفاوتی از سوییچ‌ها دارند، مانند svn commit و svn checkout و غیره. می‌توانید نوع یک آرگومان را به‌صورت FileType مشخص کنید که به‌طور خودکار پرونده‌ها را برای شما باز می‌کند و درک می‌کند که '-' به معنای ورودی یا خروجی استاندارد است.

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

مستندات argparse

صفحه مستندات ماژول argparse.

مهاجرت کد optparse به argparse

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

PEP 389 - argparse - ماژول جدید تجزیه خط فرمان

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

PEP 391: پیکربندی مبتنی بر دیکشنری برای گزارش‌گیری

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

همه‌ی این انعطاف‌پذیری می‌تواند به پیکربندی زیادی نیاز داشته باشد. می‌توانید دستورهای پایتون بنویسید تا اشیاء را ایجاد و ویژگی‌هایشان را تنظیم کنید، اما راه‌اندازی پیچیده نیازمند کدی پرجزئیات اما خسته‌کننده است. logging همچنین از تابع fileConfig() پشتیبانی می‌کند که یک پرونده را تجزیه می‌کند، اما قالب پرونده از پیکربندی فیلترها پشتیبانی نمی‌کند و تولید آن به‌صورت برنامه‌ای نیز دردسرسازتر است.

پایتون 2.7 تابع dictConfig() را اضافه می‌کند که از یک دیکشنری برای پیکربندی گزارش‌گیری استفاده می‌کند. راه‌های زیادی برای تولید دیکشنری از منابع مختلف وجود دارد: ساختن آن با کد؛ تجزیه‌ی پرونده‌ای حاوی JSON؛ یا استفاده از کتابخانه‌ی تجزیه‌ی YAML در صورت نصب بودن آن. برای اطلاعات بیشتر به توابع پیکربندی مراجعه کنید.

مثال زیر دو گزارش‌گیر را پیکربندی می‌کند: گزارش‌گیر ریشه و گزارش‌گیری به نام "network". پیام‌هایی که به گزارش‌گیر ریشه فرستاده می‌شوند، با استفاده از پروتکل syslog به گزارش سیستم ارسال خواهند شد و پیام‌های ارسالی به گزارش‌گیر "network" در پرونده‌ی network.log نوشته خواهند شد؛ این پرونده به محض رسیدن گزارش به ۱ مگابایت چرخانده خواهد شد.

import logging
import logging.config

configdict = {
 'version': 1,    # Configuration schema in use; must be 1 for now
 'formatters': {
     'standard': {
         'format': ('%(asctime)s %(name)-15s '
                    '%(levelname)-8s %(message)s')}},

 'handlers': {'netlog': {'backupCount': 10,
                     'class': 'logging.handlers.RotatingFileHandler',
                     'filename': '/logs/network.log',
                     'formatter': 'standard',
                     'level': 'INFO',
                     'maxBytes': 1000000},
              'syslog': {'class': 'logging.handlers.SysLogHandler',
                         'formatter': 'standard',
                         'level': 'ERROR'}},

 # Specify all the subordinate loggers
 'loggers': {
             'network': {
                         'handlers': ['netlog']
             }
 },
 # Specify properties of the root logger
 'root': {
          'handlers': ['syslog']
 },
}

# Set up configuration
logging.config.dictConfig(configdict)

# As an example, log two error messages
logger = logging.getLogger('/')
logger.error('Database not found')

netlogger = logging.getLogger('network')
netlogger.error('Connection failed')

سه بهبود کوچک‌تر در ماژول logging، که همگی توسط Vinay Sajip پیاده‌سازی شده‌اند، عبارت‌اند از:

  • کلاس SysLogHandler اکنون از syslog از طریق TCP پشتیبانی می‌کند. سازنده دارای پارامتر socktype است که نوع سوکت مورد استفاده را تعیین می‌کند: یا socket.SOCK_DGRAM برای UDP یا socket.SOCK_STREAM برای TCP. پروتکل پیش‌فرض همچنان UDP است.

  • متد getChild() به نمونه‌های Logger اضافه شد که با استفاده از یک مسیر نسبی، یک گزارش‌گیر فرزند را بازیابی می‌کند. برای مثال، وقتی با اجرای log = getLogger('app') یک گزارش‌گیر را بازیابی کنید، فراخوانی log.getChild('network.listen') معادل getLogger('app.network.listen') است.

  • به کلاس LoggerAdapter متد isEnabledFor() اضافه شد که یک سطح می‌گیرد و برمی‌گرداند که آیا گزارش‌گیر زیرین پیامی با آن سطح از اهمیت را پردازش می‌کند یا خیر.

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

PEP 391 - پیکربندی مبتنی بر دیکشنری برای گزارش‌گیری

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

PEP 3106: نماهای دیکشنری

متدهای دیکشنری keys()، values() و items() در پایتون 3.x متفاوت هستند. آن‌ها به‌جای فهرستی کاملاً عینیت‌یافته (materialized)، شیئی به نام نما <view> برمی‌گردانند.

تغییر مقادیر بازگشتیِ keys()، values() و items() در پایتون 2.7 ممکن نیست، زیرا کدهای زیادی می‌شکستند. در عوض، نسخه‌های 3.x با نام‌های جدید viewkeys()، viewvalues() و viewitems() افزوده شدند.

>>> d = dict((i*10, chr(65+i)) for i in range(26))
>>> d
{0: 'A', 130: 'N', 10: 'B', 140: 'O', 20: ..., 250: 'Z'}
>>> d.viewkeys()
dict_keys([0, 130, 10, 140, 20, 150, 30, ..., 250])

نماها را می‌توان پیمایش کرد، اما نماهای کلید و آیتم مانند مجموعه‌ها نیز رفتار می‌کنند. عملگر & اشتراک را انجام می‌دهد و | اجتماع را انجام می‌دهد:

>>> d1 = dict((i*10, chr(65+i)) for i in range(26))
>>> d2 = dict((i**.5, i) for i in range(1000))
>>> d1.viewkeys() & d2.viewkeys()
set([0.0, 10.0, 20.0, 30.0])
>>> d1.viewkeys() | range(0, 30)
set([0, 1, 130, 3, 4, 5, 6, ..., 120, 250])

نما دیکشنری را پیگیری می‌کند و با تغییر دیکشنری، محتوای آن نیز تغییر می‌کند:

>>> vk = d.viewkeys()
>>> vk
dict_keys([0, 130, 10, ..., 250])
>>> d[260] = '&'
>>> vk
dict_keys([0, 130, 260, 10, ..., 250])

با این حال، توجه داشته باشید که در حین پیمایش روی نما نمی‌توانید کلیدها را اضافه یا حذف کنید:

>>> for k in vk:
...     d[k*2] = k
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: dictionary changed size during iteration

می‌توانید از متدهای نما در کد پایتون 2.x استفاده کنید و مبدل 2to3 آن‌ها را به متدهای استاندارد keys()، values() و items() تغییر می‌دهد.

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

PEP 3106 - بازطراحی dict.keys()، .values() و .items()

PEP نوشته‌شده توسط گیدو ون‌روسوم. به نسخه 2.7 توسط الکساندر واسالوتی بک‌پورت شد؛ bpo-1967.

PEP 3137: شیء memoryview

شیء memoryview نمایی از محتوای حافظه‌ی شیء دیگر فراهم می‌کند که با رابط نوع bytes مطابقت دارد.

>>> import string
>>> m = memoryview(string.letters)
>>> m
<memory at 0x37f850>
>>> len(m)           # Returns length of underlying object
52
>>> m[0], m[25], m[26]   # Indexing returns one byte
('a', 'z', 'A')
>>> m2 = m[0:26]         # Slicing returns another memoryview
>>> m2
<memory at 0x37f080>

محتوای نما را می‌توان به رشته‌ای از بایت‌ها یا فهرستی از اعداد صحیح تبدیل کرد:

>>> m2.tobytes()
'abcdefghijklmnopqrstuvwxyz'
>>> m2.tolist()
[97, 98, 99, 100, 101, 102, 103, ... 121, 122]
>>>

شیءهای memoryview در صورتی که شیء زیرین تغییرپذیر باشد، اجازه می‌دهند آن را تغییر دهید.

>>> m2[0] = 75
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot modify read-only memory
>>> b = bytearray(string.letters)  # Creating a mutable object
>>> b
bytearray(b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
>>> mb = memoryview(b)
>>> mb[0] = '*'         # Assign to view, changing the bytearray.
>>> b[0:5]              # The bytearray has been changed.
bytearray(b'*bcde')
>>>

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

PEP 3137 - بایت‌های تغییرناپذیر و بافر تغییرپذیر

این PEP را Guido van Rossum نوشته است. Travis Oliphant، Antoine Pitrou و دیگران آن را پیاده‌سازی کرده‌اند. Antoine Pitrou آن را به نسخه‌ی 2.7 بک‌پورت کرده است؛ bpo-2396.

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

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

  • سینتکس مقادیر لفظی مجموعه از پایتون 3.x به نسخه‌های قدیمی‌تر بک‌پورت شده است. از آکولادها برای دربرگرفتن محتویات مجموعه‌ی تغییرپذیر حاصل استفاده می‌شود؛ مقادیر لفظی مجموعه با نداشتن دو نقطه و مقادیر، از دیکشنری‌ها متمایز می‌شوند. {} همچنان یک دیکشنری خالی را نشان می‌دهد؛ برای مجموعه‌ی خالی از set() استفاده کنید.

    >>> {1, 2, 3, 4, 5}
    set([1, 2, 3, 4, 5])
    >>> set() # empty set
    set([])
    >>> {}    # empty dict
    {}
    

    بک‌پورت‌شده به نسخه‌های پیشین توسط Alexandre Vassalotti؛ bpo-2335.

  • درک‌های دیکشنری و مجموعه ویژگی دیگری هستند که از 3.x بک‌پورت شده‌اند و درک‌های فهرستی/تولیدگر را به‌گونه‌ای تعمیم می‌دهند که از سینتکس لفظی مجموعه‌ها و دیکشنری‌ها استفاده کنند.

    >>> {x: x*x for x in range(6)}
    {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
    >>> {('a'*x) for x in range(6)}
    set(['', 'a', 'aa', 'aaa', 'aaaa', 'aaaaa'])
    

    بک‌پورت شده توسط الکساندر واسالوتی؛ bpo-2333.

  • دستور with اکنون می‌تواند از چندین مدیر زمینه در یک دستور استفاده کند. مدیران زمینه از چپ به راست پردازش می‌شوند و هر یک به عنوان آغاز یک دستور with جدید در نظر گرفته می‌شود. این بدان معناست که:

    with A() as a, B() as b:
        ... suite of statements ...
    

    معادل است با:

    with A() as a:
        with B() as b:
            ... suite of statements ...
    

    تابع contextlib.nested() کارکردی بسیار مشابه ارائه می‌دهد، بنابراین دیگر ضروری نیست و منسوخ شده است.

    (پیشنهاد‌شده در https://codereview.appspot.com/53094؛ پیاده‌سازی‌شده توسط Georg Brandl.)

  • تبدیل‌های بین اعداد ممیز شناور و رشته‌ها اکنون در بیشتر پلتفرم‌ها به‌درستی گرد می‌شوند. این تبدیل‌ها در بسیاری از مکان‌های مختلف رخ می‌دهند: str() روی اعداد اعشاری و مختلط؛ سازنده‌های float و complex؛ قالب‌بندی عددی؛ سریال‌سازی و سریال‌زدایی اعداد اعشاری و مختلط با استفاده از ماژول‌های marshal، pickle و json؛ تجزیه‌ی مقادیر لفظی اعشاری و موهومی در کد پایتون؛ و تبدیل Decimal به عدد اعشاری.

    در ارتباط با این موضوع، repr() یک عدد ممیز شناور x اکنون نتیجه‌ای را برمی‌گرداند که بر اساس کوتاه‌ترین رشته‌ی اعشاری‌ای است که تضمین شده تحت گرد کردن صحیح (با حالت گرد کردن نصف به زوج) دوباره به x گرد شود. پیش‌تر، رشته‌ای بر اساس گرد کردن x به ۱۷ رقم اعشاری می‌داد.

    کتابخانه گرد کردن مسئول این بهبود، روی ویندوز و روی پلتفرم‌های یونیکس که از کامپایلرهای gcc، icc یا suncc استفاده می‌کنند کار می‌کند. ممکن است تعداد کمی پلتفرم وجود داشته باشد که نتوان عملکرد صحیح این کد را در آن‌ها تضمین کرد، بنابراین در چنین سیستم‌هایی از این کد استفاده نمی‌شود. می‌توانید با بررسی sys.float_repr_style متوجه شوید که از کدام کد استفاده می‌شود؛ این مقدار در صورت استفاده از کد جدید short و در غیر این صورت legacy خواهد بود.

    پیاده‌سازی‌شده توسط Eric Smith و Mark Dickinson، با استفاده از کتابخانه‌ی dtoa.c نوشته‌ی David Gay؛ bpo-7117.

  • تبدیل اعداد صحیح بلند و اعداد صحیح معمولی به ممیز شناور اکنون به شکل متفاوتی گرد می‌شود و نزدیک‌ترین عدد ممیز شناور به آن عدد را برمی‌گرداند. این موضوع برای اعداد صحیح کوچکی که می‌توان آن‌ها را دقیقاً تبدیل کرد اهمیتی ندارد، اما برای اعداد بزرگی که ناگزیر دقت را از دست می‌دهند، پایتون 2.7 اکنون تقریب نزدیک‌تری می‌زند. برای مثال، پایتون 2.6 موارد زیر را محاسبه می‌کرد:

    >>> n = 295147905179352891391
    >>> float(n)
    2.9514790517935283e+20
    >>> n - long(float(n))
    65535L
    

    نتیجه ممیز شناور پایتون 2.7 بزرگ‌تر است، اما بسیار نزدیک‌تر به مقدار واقعی:

    >>> n = 295147905179352891391
    >>> float(n)
    2.9514790517935289e+20
    >>> n - long(float(n))
    -1L
    

    (پیاده‌سازی‌شده توسط Mark Dickinson؛ bpo-3166.)

    تقسیم اعداد صحیح نیز در رفتار گرد کردن خود دقیق‌تر است. (همچنین توسط Mark Dickinson پیاده‌سازی شده است؛ bpo-1811.)

  • تبدیل ضمنی نوع برای اعداد مختلط حذف شده است؛ مفسر دیگر هرگز تلاش نخواهد کرد که متد __coerce__() را روی اشیاء مختلط فراخوانی کند. (حذف شده توسط Meador Inge و Mark Dickinson؛ bpo-5211.)

  • متد str.format() اکنون از شماره‌گذاری خودکار فیلدهای جایگزینی پشتیبانی می‌کند. این باعث می‌شود استفاده از str.format() بیشتر شبیه به استفاده از قالب‌بندی %s باشد:

    >>> '{}:{}:{}'.format(2009, 04, 'Sunday')
    '2009:4:Sunday'
    >>> '{}:{}:{day}'.format(2009, 4, day='Sunday')
    '2009:4:Sunday'
    

    شماره‌گذاری خودکار فیلدها را از چپ به راست در نظر می‌گیرد؛ بنابراین نخستین مشخص‌گر {...} از نخستین آرگومانِ str.format() استفاده خواهد کرد، مشخص‌گر بعدی از آرگومان بعدی، و به همین ترتیب. شما نمی‌توانید شماره‌گذاری خودکار و شماره‌گذاری صریح را با هم ترکیب کنید — یا همه‌ی فیلدهای مشخص‌گرتان را شماره‌گذاری کنید یا هیچ‌کدام را — اما می‌توانید شماره‌گذاری خودکار را با فیلدهای نام‌دار ترکیب کنید، همان‌طور که در مثال دومِ بالا آمده است. (ارائه‌شده توسط اریک اسمیت؛ bpo-5237.)

    اعداد مختلط اکنون به‌درستی از استفاده با format() پشتیبانی می‌کنند و به‌طور پیش‌فرض راست‌چین هستند. مشخص کردن دقت یا جداسازی با کاما بر هر دو بخش حقیقی و موهومی عدد اعمال می‌شود، اما عرض فیلد و چینشِ مشخص‌شده بر کل خروجی 1.5+3j حاصل اعمال می‌شود. (ارائه‌شده توسط اریک اسمیت؛ bpo-1588 و bpo-7988.)

    کد قالب 'F' اکنون همیشه خروجی خود را با نویسه‌های بزرگ قالب‌بندی می‌کند، بنابراین اکنون 'INF' و 'NAN' تولید خواهد کرد. (مشارکت اریک اسمیت؛ bpo-3382.)

    یک تغییر در سطح پایین: متد object.__format__() اکنون اگر یک رشته قالب‌بندی به آن ارسال شود، هشدار PendingDeprecationWarning را ایجاد می‌کند، زیرا متد __format__() برای object شیء را به بازنمایی رشته‌ای تبدیل کرده و آن را قالب‌بندی می‌کند. پیش‌تر این متد رشته قالب‌بندی را به‌صورت بی‌صدا روی بازنمایی رشته‌ای اعمال می‌کرد، اما این می‌توانست اشتباه‌هایی را در کد پایتون پنهان کند. اگر شما اطلاعات قالب‌بندی مانند ترازبندی یا دقت را ارائه می‌کنید، احتمالاً انتظار دارید که قالب‌بندی به شیوه‌ای مخصوص آن شیء اعمال شود. (توسط اریک اسمیت اصلاح شد؛ bpo-7994.)

  • نوع‌های int() و long() متد bit_length را به دست آوردند که تعداد بیت‌های لازم برای نمایش آرگومان خود در مبنای دودویی را برمی‌گرداند:

    >>> n = 37
    >>> bin(n)
    '0b100101'
    >>> n.bit_length()
    6
    >>> n = 2**123-1
    >>> n.bit_length()
    123
    >>> (n+1).bit_length()
    124
    

    (مشارکت فردریک یوهانسون و ویکتور استینر؛ bpo-3439.)

  • دستور import اگر یک ایمپورت نسبی (مثلاً from .os import sep) شکست بخورد، دیگر یک ایمپورت مطلق را امتحان نخواهد کرد. این کار یک اشکال را رفع می‌کند، اما ممکن است برخی دستورهای import را که صرفاً به‌طور تصادفی کار می‌کردند، از کار بیندازد. (اصلاح توسط Meador Inge؛ bpo-7902.)

  • اکنون برای یک زیرکلاس از نوع توکار unicode امکان‌پذیر است که متد __unicode__() را بازتعریف کند. (پیاده‌سازی توسط Victor Stinner؛ bpo-1583863.)

  • متد translate() نوع bytearray اکنون None را به‌عنوان آرگومان اول خود می‌پذیرد. (اصلاح‌شده توسط Georg Brandl؛ bpo-4759.)

  • هنگام استفاده از @classmethod و @staticmethod برای پوشش دادن متد‌ها به‌عنوان متد‌های کلاس یا متد‌های ایستا، شیء پوششی اکنون تابع پوشش‌داده‌شده را به‌عنوان ویژگی __func__ خود در دسترس قرار می‌دهد. (مشارکت‌شده توسط Amaury Forgeot d'Arc، پس از پیشنهاد George Sakkis؛ bpo-5982.)

  • وقتی مجموعه‌ی محدودی از ویژگی‌ها با استفاده از __slots__ تنظیم شده بود، حذف یک ویژگی تنظیم‌نشده همان‌طور که انتظار می‌رفت AttributeError ایجاد نمی‌کرد. این مشکل توسط Benjamin Peterson برطرف شد؛ bpo-7604.)

  • اکنون دو کدگذاری جدید مورد پشتیبانی قرار می‌گیرند: «cp720» که عمدتاً برای متن عربی به کار می‌رود؛ و «cp858»، گونه‌ای از CP 850 که نماد یورو را اضافه می‌کند. (CP720 با مشارکت Alexander Belchenko و Amaury Forgeot d'Arc در bpo-1616979؛ CP858 با مشارکت Tim Hatch در bpo-8016.)

  • شیء file اکنون هنگام تلاش برای باز کردن یک پوشه در پلتفرم‌های POSIX، ویژگی filename را روی استثنای IOError تنظیم می‌کند (توسط Jan Kaliszewski اشاره شد؛ bpo-4764)، و به‌جای اعتماد به کتابخانه C برای گرفتن و گزارش خطا، اکنون به‌طور صریح نوشتن در اشیاء پرونده‌ی فقط‌خواندنی را بررسی می‌کند و ممنوع می‌کند (توسط Stefan Krah برطرف شد؛ bpo-5677).

  • خود توکن‌ساز پایتون اکنون پایان سطرها را تبدیل می‌کند، بنابراین تابع توکار compile() اکنون کدی را که از هر قرارداد پایان سطر استفاده می‌کند، می‌پذیرد. به‌علاوه، این تابع دیگر الزام نمی‌کند که کد با یک سطر جدید پایان یابد.

  • در پایتون 3.x، پرانتزهای اضافی در تعریف توابع غیرمجاز هستند، به این معنا که از def f((x)): pass خطای سینتکس دریافت می‌کنید. در حالت هشدار پایتون ۳ (Python3-warning)، پایتون 2.7 اکنون درباره‌ی این کاربرد عجیب هشدار می‌دهد. (یادداشت‌شده توسط James Lingard؛ bpo-7362.)

  • اکنون می‌توان به شیءهای کلاس‌های قدیمی (old-style) ارجاع ضعیف ایجاد کرد. کلاس‌های جدید (new-style) همیشه قابل ارجاع ضعیف بودند. (اصلاح توسط Antoine Pitrou؛ bpo-8268.)

  • هنگامی که یک شیء ماژول زباله‌روبی می‌شود، دیکشنری ماژول اکنون تنها زمانی پاک‌سازی می‌شود که هیچ‌کس دیگری ارجاعی به آن دیکشنری نگه نداشته باشد (bpo-7140).

تغییرات مفسر

یک متغیر محیطی جدید، PYTHONWARNINGS، امکان کنترل هشدارها را فراهم می‌کند. مقدار این متغیر باید رشته‌ای شامل تنظیمات هشدار باشد؛ تنظیماتی معادل موارد استفاده‌شده با سوییچ -W که با کاما از هم جدا شده‌اند. (ارائه‌شده توسط برایان کرتین؛ bpo-7301.)

برای مثال، تنظیم زیر هشدارها را هر بار که رخ می‌دهند چاپ می‌کند، اما هشدارهای ماژول Cookie را به خطا تبدیل می‌کند. (سینتکس دقیق برای تنظیم یک متغیر محیطی بین سیستم‌عامل‌ها و پوسته‌های مختلف متفاوت است.)

export PYTHONWARNINGS=all,error:::Cookie:0

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

چندین بهبود کارایی افزوده شده است:

  • یک آپ‌کد جدید برای انجام بوت‌استرپینگ دستورهای with افزوده شد که متدهای __enter__() و __exit__() را جستجو می‌کند. (مشارکت توسط Benjamin Peterson.)

  • زباله‌روب اکنون برای یک الگوی استفاده‌ی رایج عملکرد بهتری دارد: زمانی که اشیاء زیادی تخصیص داده می‌شوند بدون این‌که هیچ‌یک از آن‌ها آزادسازی شود. پیش‌تر این کار برای زباله‌روبی زمان درجه دوم می‌گرفت، اما اکنون تعداد زباله‌روبی‌های کامل با رشد تعداد اشیاء روی هیپ کاهش می‌یابد. منطق جدید تنها زمانی یک گذر کامل زباله‌روبی انجام می‌دهد که نسل میانی ۱۰ بار جمع‌آوری شده باشد و تعداد اشیاء بازمانده از نسل میانی از ۱۰ درصد تعداد اشیاء در قدیمی‌ترین نسل فراتر رود. (پیشنهاد Martin von Löwis و پیاده‌سازی Antoine Pitrou؛ bpo-4074.)

  • زباله‌روب تلاش می‌کند ظرف‌های ساده‌ای را که نمی‌توانند بخشی از یک چرخه باشند پیگیری نکند. در پایتون 2.7، این امر اکنون برای تاپل‌ها و دیکشنری‌های حاوی نوع‌های اتمی (مانند اعداد صحیح، رشته‌ها و غیره) برقرار است. به‌طور انتقالی، دیکشنری‌ای که حاوی تاپل‌هایی از نوع‌های اتمی باشد نیز پیگیری نخواهد شد. این امر با کاهش تعداد اشیایی که باید توسط زباله‌روب در نظر گرفته و پیمایش شوند، به کاهش هزینه‌ی هر زباله‌روبی کمک می‌کند. (مشارکت‌شده توسط Antoine Pitrou؛ bpo-4688.)

  • اعداد صحیح بلند اکنون به‌صورت داخلی یا در مبنای 2**15 یا در مبنای 2**30 ذخیره می‌شوند و این مبنا در زمان ساخت تعیین می‌شود. پیش‌تر، آن‌ها همیشه در مبنای 2**15 ذخیره می‌شدند. استفاده از مبنای 2**30 بهبودهای عملکردی چشمگیری روی رایانه‌های ۶۴ بیتی به همراه دارد، اما نتایج بنچمارک روی رایانه‌های ۳۲ بیتی مختلط بوده‌اند. بنابراین، پیش‌فرض استفاده از مبنای 2**30 روی رایانه‌های ۶۴ بیتی و مبنای 2**15 روی رایانه‌های ۳۲ بیتی است؛ در یونیکس، گزینه‌ی جدید configure به نام --enable-big-digits وجود دارد که می‌توان از آن برای نادیده گرفتن این پیش‌فرض استفاده کرد.

    جدای از بهبودهای کارایی، این تغییر باید برای کاربران نهایی نامرئی باشد، با یک استثنا: برای اهداف آزمون و اشکال‌زدایی، یک دنباله ساختاری (structseq) جدید sys.long_info وجود دارد که اطلاعاتی درباره قالب داخلی فراهم می‌کند و تعداد بیت‌ها به ازای هر رقم و اندازه بر حسب بایت نوع C استفاده‌شده برای ذخیره‌سازی هر رقم را نشان می‌دهد:

    >>> import sys
    >>> sys.long_info
    sys.long_info(bits_per_digit=30, sizeof_digit=4)
    

    (با مشارکت مارک دیکینسون؛ bpo-4258.)

    مجموعه‌ای دیگر از تغییرات، اشیاء long را چند بایت کوچک‌تر کرد: ۲ بایت کوچک‌تر در سیستم‌های ۳۲ بیتی و ۶ بایت در سیستم‌های ۶۴ بیتی. (مشارکت‌شده توسط Mark Dickinson؛ bpo-5260.)

  • الگوریتم تقسیم اعداد صحیح بلند با فشرده‌سازی حلقه داخلی، انجام شیفت به جای ضرب و رفع یک پیمایش اضافی غیر‌ضروری، سریع‌تر شده است. بنچمارک‌های مختلف، افزایش سرعتی بین ۵۰٪ تا ۱۵۰٪ را برای تقسیم اعداد صحیح بلند و عملیات باقیمانده (modulo) نشان می‌دهند. (مشارکت‌شده توسط مارک دیکینسون؛ bpo-5512.) عملیات بیتی نیز به‌طور قابل توجهی سریع‌تر شده‌اند (وصل اولیه توسط گرگوری اسمیت؛ bpo-1087418).

  • پیاده‌سازی % بررسی می‌کند که آیا عملوند سمت چپ یک رشته پایتون است و آن را به‌صورت ویژه مدیریت می‌کند؛ این امر منجر به افزایش کارایی ۱ تا ۳ درصدی برای برنامه‌هایی می‌شود که به‌طور مکرر از % همراه با رشته‌ها استفاده می‌کنند، مانند کتابخانه‌های قالب‌سازی. (پیاده‌سازی‌شده توسط Collin Winter؛ bpo-5176.)

  • درک‌های فهرستی که دارای شرط if هستند، به بایت‌کد سریع‌تری کامپایل می‌شوند. (وصل توسط آنتوان پی‌ترو، بازگردانی‌شده (back-ported) به نسخه 2.7 توسط جفری یاسکین؛ bpo-4715.)

  • تبدیل عدد صحیح یا عدد صحیح بلند به رشته ده‌دهی با پیاده‌سازی حالت خاص برای مبنای ۱۰، به‌جای استفاده از تابع تبدیل عمومی که مبناهای دلخواه را پشتیبانی می‌کند، سریع‌تر شد. (وصله توسط گاوین بولتون؛ bpo-6713.)

  • متدهای split()، replace()، rindex()، rpartition() و rsplit() در نوع‌های شبه‌رشته (رشته‌ها، رشته‌های یونیکد و اشیاء bytearray) اکنون به‌جای پویش نویسه‌به‌نویسه، از یک الگوریتم سریع جست‌وجوی معکوس استفاده می‌کنند. این گاهی ۱۰ برابر سریع‌تر است. (افزوده‌شده توسط Florent Xicluna؛ bpo-7462 و bpo-7622.)

  • ماژول‌های pickle و cPickle اکنون رشته‌های استفاده‌شده برای نام ویژگی‌ها را به‌طور خودکار درون‌سازی (intern) می‌کنند و مصرف حافظه‌ی اشیاء حاصل از پیکل‌گشایی را کاهش می‌دهند. (مشارکت توسط جیک مک‌گوایر؛ bpo-5084.)

  • ماژول cPickle اکنون حالت خاصی را برای دیکشنری‌ها در نظر می‌گیرد و زمان مورد نیاز برای پیکل کردن آن‌ها را تقریباً نصف می‌کند. (با مشارکت Collin Winter؛ bpo-5670.)

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

مانند هر نسخه، کتابخانه‌ی استاندارد پایتون تعدادی بهبود و رفع اشکال دریافت کرده است. در ادامه، فهرست ناقصی از برجسته‌ترین تغییرات که به ترتیب الفبا بر اساس نام ماژول مرتب شده‌اند، آمده است. برای فهرست کامل‌تری از تغییرات به پرونده‌ی Misc/NEWS در درخت سورس مراجعه کنید، یا برای همه‌ی جزئیات، گزارش‌های Subversion را مرور کنید.

  • کلاس پایه‌ی اشکال‌زدایی ماژول bdb یعنی Bdb قابلیتی برای پرش از ماژول‌ها به دست آورد. سازنده اکنون یک شیء پیمایش‌پذیر حاوی الگوهایی به سبک glob مانند django.* را می‌پذیرد؛ اشکال‌زدا به فریم‌های پشته‌ی ماژولی که با یکی از این الگوها مطابقت داشته باشد، وارد نمی‌شود. (مشارکت‌شده توسط Maru Newby پس از پیشنهاد Senthil Kumaran؛ bpo-5142.)

  • ماژول binascii اکنون از API بافر پشتیبانی می‌کند، بنابراین می‌توان از آن با نمونه‌های memoryview و دیگر اشیاء بافر مشابه استفاده کرد. (بک‌پورت شده از 3.x توسط Florent Xicluna؛ bpo-7703.)

  • ماژول به‌روزرسانی‌شده: ماژول bsddb از نسخه‌ی 4.7.2devel9 به نسخه‌ی 4.8.4 از بسته‌ی pybsddb به‌روزرسانی شده است. نسخه‌ی جدید دارای سازگاری بهتر با Python 3.x و رفع اشکالات مختلف است و چندین پرچم و متد جدید BerkeleyDB اضافه می‌کند. (به‌روزرسانی توسط Jesús Cea Avión؛ bpo-8156. تغییرنامه‌ی pybsddb را می‌توان در https://hg.jcea.es/pybsddb/file/tip/ChangeLog خواند.)

  • کلاس BZ2File در ماژول bz2 اکنون از پروتکل مدیریت زمینه پشتیبانی می‌کند، بنابراین می‌توانید with bz2.BZ2File(...) as f: بنویسید. (با مشارکت Hagen Fürstenau؛ bpo-3860.)

  • کلاس جدید: کلاس Counter در ماژول collections برای شمارش داده‌ها مفید است. نمونه‌های Counter عمدتاً مانند دیکشنری‌ها رفتار می‌کنند، اما برای کلیدهای ناموجود، به‌جای ایجاد خطای KeyError مقدار صفر برمی‌گردانند:

    >>> from collections import Counter
    >>> c = Counter()
    >>> for letter in 'here is a sample of english text':
    ...   c[letter] += 1
    ...
    >>> c
    Counter({' ': 6, 'e': 5, 's': 3, 'a': 2, 'i': 2, 'h': 2,
    'l': 2, 't': 2, 'g': 1, 'f': 1, 'm': 1, 'o': 1, 'n': 1,
    'p': 1, 'r': 1, 'x': 1})
    >>> c['e']
    5
    >>> c['z']
    0
    

    سه متد دیگر برای Counter وجود دارد. most_common()، N عنصر پرتکرارتر و شمارش آن‌ها را برمی‌گرداند. elements() پیمایش‌گری روی عناصر موجود در آن برمی‌گرداند که هر عنصر را به تعداد شمارش آن تکرار می‌کند. subtract() یک پیمایش‌پذیر می‌گیرد و به‌جای افزودن، برای هر عنصر یکی کم می‌کند؛ اگر آرگومان یک دیکشنری یا یک Counter دیگر باشد، شمارش‌ها کم می‌شوند.

    >>> c.most_common(5)
    [(' ', 6), ('e', 5), ('s', 3), ('a', 2), ('i', 2)]
    >>> c.elements() ->
       'a', 'a', ' ', ' ', ' ', ' ', ' ', ' ',
       'e', 'e', 'e', 'e', 'e', 'g', 'f', 'i', 'i',
       'h', 'h', 'm', 'l', 'l', 'o', 'n', 'p', 's',
       's', 's', 'r', 't', 't', 'x'
    >>> c['e']
    5
    >>> c.subtract('very heavy on the letter e')
    >>> c['e']    # Count is now lower
    -1
    

    مشارکت‌شده توسط Raymond Hettinger؛ bpo-1696199.

    کلاس جدید: OrderedDict در بخش پیشین PEP 372: افزودن دیکشنری مرتب به collections شرح داده شده است.

    متد جدید: نوع داده‌ی deque اکنون دارای متد count() است که تعداد عناصر درون خود که برابر با آرگومان داده‌شده‌ی x هستند را برمی‌گرداند، و متد reverse() که عناصر صف دوطرفه را به‌صورت درجا وارونه می‌کند. deque همچنین طول بیشینه‌ی خود را به‌صورت ویژگی فقط‌خواندنی maxlen در دسترس قرار می‌دهد. (هر دو قابلیت توسط Raymond Hettinger افزوده شده‌اند.)

    کلاس namedtuple اکنون یک پارامتر اختیاری rename دارد. اگر rename درست باشد، نام‌های فیلدی که به این دلیل که تکرار شده‌اند یا شناسه‌های قانونی پایتون نیستند نامعتبر هستند، به نام‌های قانونی‌ای تغییر نام داده می‌شوند که از موقعیت فیلد در فهرست فیلدها برگرفته شده‌اند:

    >>> from collections import namedtuple
    >>> T = namedtuple('T', ['field1', '$illegal', 'for', 'field2'], rename=True)
    >>> T._fields
    ('field1', '_1', '_2', 'field2')
    

    (افزوده‌شده توسط Raymond Hettinger؛ bpo-1818.)

    در نهایت، کلاس پایه انتزاعی Mapping اکنون اگر یک نگاشت با نوع دیگری که Mapping نیست مقایسه شود، NotImplemented را برمی‌گرداند. (توسط Daniel Stutzbach اصلاح شد؛ bpo-8729.)

  • سازنده‌های کلاس‌های تجزیه‌کننده در ماژول ConfigParser اکنون پارامتر allow_no_value را می‌پذیرند که مقدار پیش‌فرض آن false است؛ اگر true باشد، گزینه‌های بدون مقدار مجاز خواهند بود. برای مثال:

    >>> import ConfigParser, StringIO
    >>> sample_config = """
    ... [mysqld]
    ... user = mysql
    ... pid-file = /var/run/mysqld/mysqld.pid
    ... skip-bdb
    ... """
    >>> config = ConfigParser.RawConfigParser(allow_no_value=True)
    >>> config.readfp(StringIO.StringIO(sample_config))
    >>> config.get('mysqld', 'user')
    'mysql'
    >>> print config.get('mysqld', 'skip-bdb')
    None
    >>> print config.get('mysqld', 'unknown')
    Traceback (most recent call last):
      ...
    NoOptionError: No option 'unknown' in section: 'mysqld'
    

    (مشارکت‌شده توسط ماتس کیندال؛ bpo-7005.)

  • تابع منسوخ‌شده: contextlib.nested()، که اجازه می‌دهد بیش از یک مدیر زمینه با تنها یک دستور with مدیریت شود، منسوخ شده است، زیرا دستور with اکنون از چندین مدیر زمینه پشتیبانی می‌کند.

  • ماژول cookielib اکنون کوکی‌هایی را که فیلد نسخه‌ی نامعتبر دارند، یعنی فیلدی که حاوی مقدار عدد صحیح نیست، نادیده می‌گیرد. (توسط John J. Lee اصلاح شد؛ bpo-3924.)

  • تابع deepcopy() ماژول copy اکنون متدهای مقید به نمونه را به‌درستی کپی می‌کند. (پیاده‌سازی توسط Robert Collins؛ bpo-1515.)

  • ماژول ctypes اکنون برای آرگومان‌هایی که به‌عنوان اشاره‌گر تعریف شده‌اند، همیشه None را به یک اشاره‌گر NULL در C تبدیل می‌کند. (تغییر توسط Thomas Heller؛ bpo-4606.) کتابخانه‌ی زیربنایی libffi به نسخه 3.0.9 به‌روزرسانی شده است که شامل اصلاح‌های گوناگونی برای پلتفرم‌های مختلف است. (به‌روزرسانی توسط Matthias Klose؛ bpo-8142.)

  • متد جدید: کلاس timedelta از ماژول datetime متد total_seconds() را دریافت کرد که تعداد ثانیه‌های مدت‌زمان را برمی‌گرداند. (با مشارکت برایان کوینلان؛ bpo-5788.)

  • متد جدید: به کلاس Decimal متد کلاس from_float() اضافه شد که تبدیل دقیق یک عدد ممیز شناور به Decimal را انجام می‌دهد. این تبدیل دقیق در پی نزدیک‌ترین تقریب دهدهی به مقدار نمایش ممیز شناور است؛ بنابراین مقدار دهدهی حاصل، اگر عدم دقتی وجود داشته باشد، همچنان شامل آن خواهد بود. برای مثال، Decimal.from_float(0.1) مقدار Decimal('0.1000000000000000055511151231257827021181583404541015625') را برمی‌گرداند. (پیاده‌سازی‌شده توسط Raymond Hettinger؛ bpo-4796.)

    مقایسه‌ی نمونه‌های Decimal با اعداد ممیز شناور اکنون نتایج معقولی بر اساس مقادیر عددی عملوندها تولید می‌کند. پیش‌تر چنین مقایسه‌هایی به قواعد پیش‌فرض پایتون برای مقایسه‌ی اشیاء بازگشت می‌کردند که نتایجی دلخواه بر اساس نوع اشیاء تولید می‌کرد. توجه داشته باشید که همچنان نمی‌توانید Decimal و ممیز شناور را در عملیات‌های دیگر مانند جمع ترکیب کنید، زیرا باید به‌طور صریح انتخاب کنید که چگونه بین float و Decimal تبدیل انجام شود. (توسط Mark Dickinson اصلاح شد؛ bpo-2531.)

    سازنده‌ی Decimal اکنون اعداد ممیز شناور (افزوده‌شده توسط Raymond Hettinger؛ bpo-8257) و نویسه‌های یونیکد غیراروپایی مانند ارقام عربی-هندی (با مشارکت Mark Dickinson؛ bpo-6595) را می‌پذیرد.

    بیشتر متدهای کلاس Context اکنون علاوه بر نمونه‌های Decimal، اعداد صحیح را نیز می‌پذیرند؛ تنها استثناها متدهای canonical() و is_canonical() هستند. (وصله توسط Juan José Conti؛ bpo-7633.)

    هنگام استفاده از نمونه‌های Decimal با متد format() رشته، تراز‌بندی پیش‌فرض قبلاً چپ‌چینی بود. این امر به راست‌چینی تغییر یافته است که برای نوع‌های عددی منطقی‌تر است. (تغییر توسط Mark Dickinson؛ bpo-6857.)

    مقایسه‌های شامل مقدار NaN علامت‌دهنده (یا sNAN) اکنون به جای آنکه بسته به عملگر مقایسه، بی‌صدا مقداری درست یا نادرست برگردانند، سیگنال InvalidOperation را صادر می‌کنند. مقادیر NaN خاموش (یا NaN) اکنون هش‌پذیر هستند. (توسط Mark Dickinson اصلاح شد؛ bpo-7279.)

  • ماژول difflib اکنون از طریق یک تغییر کوچک — استفاده از نویسه تب به جای فاصله‌ها به‌عنوان جداکننده در سرآیند حاوی نام پرونده — خروجی‌ای تولید می‌کند که با ابزارهای مدرن diff/patch سازگارتر است. (اصلاح توسط Anatoly Techtonik؛ bpo-7585.)

  • دستور sdist در Distutils اکنون همیشه پرونده‌ی MANIFEST را بازتولید می‌کند، زیرا حتی اگر پرونده‌های MANIFEST.in یا setup.py تغییر نکرده باشند، ممکن است کاربر پرونده‌های جدیدی ایجاد کرده باشد که باید گنجانده شوند. (توسط Tarek Ziadé برطرف شد؛ bpo-8688.)

  • پرچم IGNORE_EXCEPTION_DETAIL در ماژول doctest اکنون نام ماژولِ حاوی استثنای مورد آزمون را نادیده می‌گیرد. (وصل توسط Lennart Regebro؛ bpo-7490.)

  • کلاس Message از ماژول email از این پس باری با مقدار یونیکد را می‌پذیرد و بار را به‌طور خودکار به کدگذاری مشخص‌شده توسط output_charset تبدیل می‌کند. (افزوده‌شده توسط R. David Murray؛ bpo-1368247.)

  • کلاس Fraction اکنون یک عدد اعشاری یا نمونه‌ای از Decimal، یا دو عدد گویا را به‌عنوان آرگومان‌های سازنده‌ی خود می‌پذیرد. (پیاده‌سازی‌شده توسط Mark Dickinson؛ اعداد گویا در bpo-5812 و float/decimal در bpo-8294 اضافه شدند.)

    مقایسه‌های ترتیبی (<، <=، >، >=) بین کسرها و اعداد مختلط اکنون یک TypeError ایجاد می‌کنند. این کار یک کاستی را برطرف می‌کند و باعث می‌شود Fraction با سایر انواع عددی سازگار باشد.

  • کلاس جدید: FTP_TLS در ماژول ftplib اتصالات امن FTP را با استفاده از کپسوله‌سازی TLS برای احراز هویت و همچنین انتقال‌های کنترل و داده‌ی بعدی فراهم می‌کند. (ارائه‌شده توسط Giampaolo Rodola؛ bpo-2054.)

    متد storbinary() برای بارگذاری‌های دودویی اکنون می‌تواند به لطف پارامتر افزوده‌شده‌ی rest، بارگذاری‌ها را از سر بگیرد (وصل توسط Pablo Mouzo؛ bpo-6845.)

  • دکوراتور جدید کلاس: @~functools.total_ordering در ماژول functools کلاسی را می‌گیرد که متد __eq__() و یکی از __lt__()، __le__()، __gt__() یا __ge__() را تعریف می‌کند، و متدهای مقایسه‌ی مفقود را تولید می‌کند. از آنجا که متد __cmp__() در پایتون 3.x منسوخ می‌شود، این دکوراتور تعریف کلاس‌های دارای ترتیب را آسان‌تر می‌کند. (افزوده‌شده توسط Raymond Hettinger؛ bpo-5479.)

    تابع جدید: cmp_to_key() یک تابع مقایسه‌ی قدیمی که دو آرگومان می‌گیرد را می‌پذیرد و یک فراخوانی‌پذیر جدید برمی‌گرداند که می‌توان از آن به‌عنوان پارامتر کلید در توابعی مانند sorted()، min() و max() و غیره استفاده کرد. کاربرد اصلی موردنظر، کمک به سازگار کردن کد با پایتون 3.x است. (افزوده‌شده توسط Raymond Hettinger.)

  • تابع جدید: تابع is_tracked() ماژول gc در صورتی که یک نمونه‌ی داده‌شده توسط زباله‌روب پیگیری شود مقدار true و در غیر این صورت مقدار false را برمی‌گرداند. (مشارکت‌شده توسط Antoine Pitrou؛ bpo-4688.)

  • کلاس GzipFile ماژول gzip اکنون از پروتکل مدیریت زمینه پشتیبانی می‌کند، بنابراین می‌توانید بنویسید with gzip.GzipFile(...) as f: (ارائه‌شده توسط Hagen Fürstenau؛ bpo-3860)، و اکنون کلاس پایه انتزاعی io.BufferedIOBase را پیاده‌سازی می‌کند، بنابراین می‌توانید برای پردازش سریع‌تر آن را با io.BufferedReader دربرگیرید (ارائه‌شده توسط Nir Aides؛ bpo-7471). همچنین اکنون می‌توان با فراهم کردن یک مهر زمانی اختیاری برای سازنده، زمان اصلاح ثبت‌شده در یک پرونده فشرده‌شده با gzip را بازنویسی کرد. (ارائه‌شده توسط Jacques Frechet؛ bpo-4272.)

    پرونده‌ها در قالب gzip ممکن است با بایت‌های صفرِ انتهایی پدینگ شوند؛ ماژول gzip اکنون این بایت‌های انتهایی را مصرف می‌کند. (اصلاح‌شده توسط Tadek Pietraszek و Brian Curtin؛ bpo-2846.)

  • ویژگی جدید: ماژول hashlib اکنون دارای ویژگی algorithms است که حاوی تاپلی از نام الگوریتم‌های پشتیبانی‌شده است. در پایتون 2.7، hashlib.algorithms شامل ('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512') است. (مشارکت‌شده توسط کارل شنِه؛ bpo-7418.)

  • کلاس پیش‌فرض HTTPResponse که توسط ماژول httplib استفاده می‌شود، اکنون از بافر کردن پشتیبانی می‌کند و در نتیجه، خواندن پاسخ‌های HTTP بسیار سریع‌تر شده است. (مشارکت‌شده توسط Kristján Valur Jónsson؛ bpo-4879.)

    کلاس‌های HTTPConnection و HTTPSConnection اکنون از پارامتر source_address پشتیبانی می‌کنند؛ یک تاپل دوتایی (host, port) که آدرس مبدأی را که برای اتصال استفاده خواهد شد، مشخص می‌کند. (با مشارکت Eldon Ziegler؛ bpo-3972.)

  • ماژول ihooks اکنون از ایمپورت‌های نسبی پشتیبانی می‌کند. توجه داشته باشید که ihooks ماژولی قدیمی‌تر برای سفارشی‌سازی ایمپورت‌هاست که ماژول imputil افزوده‌شده در پایتون 2.0 جایگزین آن شده است. (پشتیبانی از ایمپورت نسبی توسط نیل شمناور افزوده شد.)

  • ماژول imaplib اکنون از نشانی‌های IPv6 پشتیبانی می‌کند. (با مشارکت Derek Morr؛ bpo-1655.)

  • تابع جدید: getcallargs() ماژول inspect یک فراخوانی‌پذیر و آرگومان‌های جایگاهی و کلیدواژه‌ای آن را می‌گیرد و تشخیص می‌دهد که کدام‌یک از پارامترهای فراخوانی‌پذیر هر آرگومان را دریافت خواهد کرد و دیکشنری‌ای برمی‌گرداند که نام آرگومان‌ها را به مقادیرشان نگاشت می‌کند. برای مثال:

    >>> from inspect import getcallargs
    >>> def f(a, b=1, *pos, **named):
    ...     pass
    ...
    >>> getcallargs(f, 1, 2, 3)
    {'a': 1, 'b': 2, 'pos': (3,), 'named': {}}
    >>> getcallargs(f, a=2, x=4)
    {'a': 2, 'b': 1, 'pos': (), 'named': {'x': 4}}
    >>> getcallargs(f)
    Traceback (most recent call last):
    ...
    TypeError: f() takes at least 1 argument (0 given)
    

    مشارکت‌شده توسط جورج ساکیس؛ bpo-3135.

  • ماژول به‌روزرسانی‌شده: کتابخانه‌ی io به نسخه‌ای که همراه پایتون 3.1 عرضه شده است ارتقا یافته است. در نسخه 3.1، کتابخانه‌ی ورودی/خروجی به‌طور کامل به زبان C بازنویسی شد و بسته به وظیفه‌ای که انجام می‌شود، ۲ تا ۲۰ برابر سریع‌تر است. نسخه‌ی اصلی پایتون به ماژول _pyio تغییر نام یافت.

    یک تغییر جزئی ناشی از این: کلاس io.TextIOBase اکنون دارای ویژگی errors است که تنظیم خطای به‌کاررفته برای خطاهای کدگذاری و کدگشایی را ارائه می‌دهد (یکی از 'strict'، 'replace'، 'ignore').

    کلاس io.FileIO اکنون هنگامی که یک توصیف‌گر پرونده‌ی نامعتبر به آن داده شود، OSError ایجاد می‌کند. (پیاده‌سازی‌شده توسط Benjamin Peterson؛ bpo-4991.) متد truncate() اکنون مکان پرونده را حفظ می‌کند؛ پیش‌تر مکان پرونده را به انتهای پرونده‌ی جدید تغییر می‌داد. (اصلاح‌شده توسط Pascal Chambon؛ bpo-6939.)

  • تابع جدید: itertools.compress(data, selectors) دو پیمایش‌گر می‌گیرد. المان‌های data در صورتی برگردانده می‌شوند که مقدار متناظر در selectors درست باشد:

    itertools.compress('ABCDEF', [1,0,1,0,1,1]) =>
      A, C, E, F
    

    تابع جدید: itertools.combinations_with_replacement(iter, r) تمام ترکیبات ممکن به طول r از المان‌های پیمایش‌پذیر iter را برمی‌گرداند. برخلاف combinations()، المان‌های منفرد می‌توانند در ترکیبات تولیدشده تکرار شوند:

    itertools.combinations_with_replacement('abc', 2) =>
      ('a', 'a'), ('a', 'b'), ('a', 'c'),
      ('b', 'b'), ('b', 'c'), ('c', 'c')
    

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

    تابع itertools.count() اکنون آرگومان step دارد که امکان افزایش با مقادیری غیر از ۱ را فراهم می‌کند. count() همچنین اکنون پذیرش آرگومان‌های کلیدواژه‌ای و استفاده از مقادیر غیرصحیح مانند اعداد ممیز شناور یا نمونه‌های Decimal را ممکن می‌سازد. (پیاده‌سازی‌شده توسط Raymond Hettinger؛ bpo-5032.)

    itertools.combinations() و itertools.product() پیش‌تر برای مقادیر r بزرگ‌تر از پیمایش‌پذیر ورودی، استثنای ValueError ایجاد می‌کردند. این موضوع یک خطای مشخصات در نظر گرفته شد، بنابراین اکنون یک پیمایش‌گر خالی برمی‌گردانند. (توسط Raymond Hettinger اصلاح شد؛ bpo-4816.)

  • ماژول به‌روزرسانی‌شده: ماژول json به نسخه 2.0.9 از بسته‌ی simplejson ارتقا یافت که شامل یک ماژول توسعه‌ای C است که کدگذاری و کدگشایی را سریع‌تر می‌کند. (با مشارکت Bob Ippolito؛ bpo-4136.)

    برای پشتیبانی از نوع جدید collections.OrderedDict، تابع json.load() اکنون دارای پارامتر اختیاری object_pairs_hook است که با هر شیء لفظی که به فهرستی از جفت‌ها کدگشایی می‌شود، فراخوانی خواهد شد. (ارائه‌شده توسط Raymond Hettinger؛ bpo-5381.)

  • کلاس Maildir در ماژول mailbox اکنون مهر زمانی پوشه‌هایی را که می‌خواند ثبت می‌کند و تنها در صورتی آن‌ها را مجدداً می‌خواند که زمان تغییرشان بعداً تغییر کرده باشد. این امر با جلوگیری از پویش‌های غیرضروری پوشه‌ها، کارایی را بهبود می‌بخشد. (توسط A.M. Kuchling و Antoine Pitrou اصلاح شد؛ bpo-1607951، bpo-6896.)

  • توابع جدید: ماژول math توابع erf() و erfc() را برای تابع خطا و تابع خطای مکمل، expm1() را که e**x - 1 را با دقت بیشتر از استفاده از exp() و کم کردن ۱ محاسبه می‌کند، gamma() را برای تابع گاما، و lgamma() را برای لگاریتم طبیعی تابع گاما به دست آورد. (ارائه‌شده توسط Mark Dickinson و nirinA raseliarison؛ bpo-3366.)

  • کلاس‌های Manager* در ماژول multiprocessing اکنون می‌توانند یک فراخوانی‌پذیر دریافت کنند که هرگاه یک زیرفرایند آغاز شود، فراخوانی می‌شود، به همراه مجموعه‌ای از آرگومان‌ها که به آن فراخوانی‌پذیر منتقل می‌شوند. (مشارکت‌شده توسط lekma؛ bpo-5585.)

    کلاس Pool که یک استخر از فرایندهای کارگر را کنترل می‌کند، اکنون یک پارامتر اختیاری maxtasksperchild دارد. فرایندهای کارگر تعداد مشخصی از وظایف را انجام می‌دهند و سپس خارج می‌شوند که این امر باعث می‌شود Pool کارگر جدیدی را راه‌اندازی کند. این قابلیت زمانی مفید است که وظایف ممکن است منجر به نشت حافظه یا منابع دیگر شوند، یا برخی وظایف باعث شوند کارگر بسیار بزرگ شود. (ارائه‌شده توسط Charles Cazabon؛ bpo-6963.)

  • ماژول nntplib اکنون از نشانی‌های IPv6 پشتیبانی می‌کند. (با مشارکت Derek Morr؛ bpo-1664.)

  • توابع جدید: ماژول os فراخوانی‌های سیستمی POSIX زیر را پوشش می‌دهد: getresgid() و getresuid() که GIDها و UIDهای واقعی، مؤثر و ذخیره‌شده را برمی‌گردانند؛ setresgid() و setresuid() که GIDها و UIDهای واقعی، مؤثر و ذخیره‌شده را به مقادیر جدید تنظیم می‌کنند؛ initgroups() که فهرست دسترسی گروهی را برای فرایند جاری مقداردهی اولیه می‌کند. (توابع GID/UID توسط Travis H. ارائه شده‌اند؛ bpo-6508. پشتیبانی از initgroups توسط Jean-Paul Calderone افزوده شده است؛ bpo-7333.)

    تابع os.fork() اکنون قفل ایمپورت را در فرایند فرزند مجدداً مقداردهی اولیه می‌کند؛ این کار مشکلات سولاریس را هنگامی که fork() از یک نخ فراخوانی می‌شود برطرف می‌کند. (برطرف‌شده توسط Zsolt Cserna؛ bpo-7242.)

  • در ماژول os.path، توابع normpath() و abspath() اکنون یونیکد را حفظ می‌کنند؛ اگر مسیر ورودی آن‌ها یک رشته یونیکد باشد، مقدار بازگشتی نیز یک رشته یونیکد خواهد بود. (normpath() توسط Matt Giuca در bpo-5827 اصلاح شد؛ abspath() توسط Ezio Melotti در bpo-3426 اصلاح شد.)

  • ماژول pydoc اکنون برای نمادهای گوناگونی که پایتون به کار می‌برد، راهنما دارد. اکنون می‌توانید برای مثال help('<<') یا help('@') را اجرا کنید. (مشارکت‌شده توسط David Laban؛ bpo-4739.)

  • توابع split()، sub() و subn() در ماژول re اکنون برای سازگاری با سایر توابع این ماژول، آرگومان اختیاری flags را می‌پذیرند. (افزوده شده توسط Gregory P. Smith.)

  • تابع جدید: run_path() در ماژول runpy کد موجود در مسیر ارائه‌شده در آرگومان path را اجرا می‌کند. path می‌تواند مسیر یک پرونده‌ی منبع پایتون (example.py)، یک پرونده‌ی بایت‌کد کامپایل‌شده (example.pyc)، یک پوشه (./package/) یا یک آرشیو zip (example.zip) باشد. اگر مسیر یک پوشه یا zip ارائه شود، به ابتدای sys.path افزوده می‌شود و ماژول __main__ ایمپورت خواهد شد. انتظار می‌رود که پوشه یا zip شامل یک __main__.py باشد؛ اگر چنین نباشد، ممکن است __main__.py دیگری از مکانی در ادامه‌ی sys.path ایمپورت شود. این کار بخش بیشتری از سازوکار runpy را در اختیار اسکریپت‌هایی قرار می‌دهد که می‌خواهند شیوه‌ی پردازش نام مسیر صریح توسط خط فرمان پایتون را تقلید کنند. (افزوده‌شده توسط Nick Coghlan؛ bpo-6816.)

  • تابع جدید: در ماژول shutil، تابع make_archive() یک نام پرونده، نوع آرشیو (zip یا قالب tar) و یک مسیر پوشه را می‌گیرد و آرشیوی حاوی محتویات پوشه می‌سازد. (افزوده‌شده توسط Tarek Ziadé.)

    توابع copyfile() و copytree() در ماژول shutil اکنون وقتی از آن‌ها خواسته شود که یک پایپ نام‌دار را کپی کنند، استثنای SpecialFileError ایجاد می‌کنند. پیش‌تر کد با باز کردن پایپ‌های نام‌دار برای خواندن، آن‌ها را مانند یک پرونده معمولی در نظر می‌گرفت و این کار به‌طور نامحدود مسدود می‌شد. (توسط Antoine Pitrou اصلاح شد؛ bpo-3002.)

  • ماژول signal دیگر هندلر سیگنال را مجدداً نصب نمی‌کند، مگر اینکه این کار واقعاً ضروری باشد؛ این تغییر اشکالی را برطرف می‌کند که می‌توانست گرفتن سیگنال EINTR را به‌طور مقاوم ناممکن کند. (اصلاح‌شده توسط Charles-Francois Natali؛ bpo-8354.)

  • توابع جدید: در ماژول site، سه تابع جدید مسیرهای مختلف مخصوص سایت و کاربر را برمی‌گردانند. getsitepackages() فهرستی شامل تمام پوشه‌های سراسری site-packages را برمی‌گرداند، getusersitepackages() مسیر پوشه site-packages کاربر را برمی‌گرداند و getuserbase() مقدار متغیر محیطی USER_BASE را برمی‌گرداند که مسیر پوشه‌ای را ارائه می‌دهد که می‌توان از آن برای ذخیره داده استفاده کرد. (مشارکت‌شده توسط Tarek Ziadé؛ bpo-6693.)

    ماژول site اکنون استثناهایی را که هنگام ایمپورت شدن ماژول sitecustomize رخ می‌دهند گزارش می‌دهد و دیگر استثنای KeyboardInterrupt را نمی‌گیرد و نمی‌بلعید. (توسط Victor Stinner اصلاح شد؛ bpo-3137.)

  • تابع create_connection() پارامتر source_address را دریافت کرد؛ یک تاپل دوتایی (host, port) که نشانی مبدأی را که برای اتصال استفاده خواهد شد تعیین می‌کند. (مشارکت‌کننده: Eldon Ziegler؛ bpo-3972.)

    متدهای recv_into() و recvfrom_into() اکنون در اشیایی که از API بافر پشتیبانی می‌کنند می‌نویسند که مفیدترین آن‌ها اشیاء bytearray و memoryview هستند. (پیاده‌سازی توسط Antoine Pitrou؛ bpo-8104.)

  • کلاس TCPServer در ماژول SocketServer اکنون از مهلت‌های زمانی سوکت و غیرفعال کردن الگوریتم ناگل (Nagle) پشتیبانی می‌کند. ویژگی کلاس disable_nagle_algorithm به طور پیش‌فرض False است؛ اگر بازنویسی شود تا مقدار آن true باشد، گزینه‌ی TCP_NODELAY روی اتصال‌های درخواست جدید تنظیم می‌شود تا از بافر شدن تعداد زیادی ارسال کوچک در یک بسته‌ی TCP واحد جلوگیری شود. ویژگی کلاس timeout می‌تواند حاوی مهلت زمانی بر حسب ثانیه باشد که روی سوکت درخواست اعمال خواهد شد؛ اگر در این مدت هیچ درخواستی دریافت نشود، handle_timeout() فراخوانی می‌شود و handle_request() بازمی‌گردد. (مشارکت توسط Kristján Valur Jónsson؛ bpo-6192 و bpo-6267.)

  • ماژول به‌روزرسانی‌شده: ماژول sqlite3 به نسخه 2.6.0 از بسته‌ی pysqlite به‌روزرسانی شده است. نسخه 2.6.0 شامل تعدادی رفع اشکال است و قابلیت بارگذاری افزونه‌های SQLite از کتابخانه‌های اشتراکی را می‌افزاید. برای فعال‌سازی افزونه‌ها، متد enable_load_extension(True) را فراخوانی کنید و سپس برای بارگذاری یک کتابخانه‌ی اشتراکی خاص، load_extension() را فراخوانی کنید. (به‌روزرسانی توسط Gerhard Häring.)

  • شیءهای SSLSocket در ماژول ssl اکنون از API بافر پشتیبانی می‌کنند، که یک شکست در بدنه آزمون را برطرف کرد (اصلاح توسط آنتوان پی‌ترو؛ bpo-7133) و به‌طور خودکار ماکروی SSL_MODE_AUTO_RETRY در OpenSSL را تنظیم می‌کنند، که جلوگیری خواهد کرد از بازگردانده شدن کد خطا از عملیات recv() که موجب دست‌دهی مجدد SSL می‌شوند (اصلاح توسط آنتوان پی‌ترو؛ bpo-8222).

    تابع سازنده‌ی wrap_socket() اکنون آرگومان ciphers را می‌پذیرد که رشته‌ای است و الگوریتم‌های رمزنگاری مجاز را فهرست می‌کند؛ قالب این رشته در مستندات OpenSSL توضیح داده‌شده است. (افزوده‌شده توسط Antoine Pitrou؛ bpo-8322.)

    تغییر دیگری باعث می‌شود ماژول توسعه‌ای، همه‌ی رمزها و الگوریتم‌های چکیده OpenSSL را بارگذاری کند تا همگی در دسترس باشند. برخی از گواهی‌های SSL قابل راستی‌آزمایی نبودند و خطای "unknown algorithm" گزارش می‌شد. (گزارش‌شده توسط Beda Kosata و برطرف‌شده توسط Antoine Pitrou؛ bpo-8484.)

    نسخه OpenSSL مورد استفاده، اکنون به‌صورت ویژگی‌های ماژول ssl.OPENSSL_VERSION (یک رشته)، ssl.OPENSSL_VERSION_INFO (یک تاپل ۵تایی) و ssl.OPENSSL_VERSION_NUMBER (یک عدد صحیح) در دسترس است. (افزوده‌شده توسط Antoine Pitrou؛ bpo-8321.)

  • ماژول struct دیگر هنگامی که مقداری برای یک کد قالب عدد صحیح خاص (یکی از bBhHiIlLqQ) بیش از حد بزرگ باشد، خطاهای سرریز را بی‌صدا نادیده نمی‌گیرد؛ اکنون همیشه یک استثنای struct.error ایجاد می‌کند. (تغییر توسط Mark Dickinson؛ bpo-1523.) تابع pack() همچنین پیش از امتحان کردن متد __int__() یا گزارش دادن خطا، تلاش خواهد کرد که برای تبدیل و بسته‌بندی مقادیر غیرصحیح از __index__() استفاده کند. (تغییر توسط Mark Dickinson؛ bpo-8300.)

  • تابع جدید: تابع check_output() ماژول subprocess فرمانی را با مجموعه‌ای مشخص از آرگومان‌ها اجرا می‌کند و در صورتی که فرمان بدون خطا اجرا شود، خروجی فرمان را به‌صورت یک رشته برمی‌گرداند؛ در غیر این صورت، استثنای CalledProcessError را ایجاد می‌کند.

    >>> subprocess.check_output(['df', '-h', '.'])
    'Filesystem     Size   Used  Avail Capacity  Mounted on\n
    /dev/disk0s2    52G    49G   3.0G    94%    /\n'
    
    >>> subprocess.check_output(['df', '-h', '/bogus'])
      ...
    subprocess.CalledProcessError: Command '['df', '-h', '/bogus']' returned non-zero exit status 1
    

    (مشارکت‌شده توسط Gregory P. Smith.)

    ماژول subprocess اکنون پس از دریافت سیگنال EINTR، فراخوانی‌های سیستمی داخلی خود را دوباره انجام می‌دهد. (توسط چندین نفر گزارش شد؛ وصل نهایی توسط گرگوری پی. اسمیت در bpo-1068268.)

  • تابع جدید: is_declared_global() در ماژول symtable برای متغیرهایی که به‌طور صریح سراسری اعلام‌شده‌اند مقدار درست و برای متغیرهایی که به‌طور ضمنی سراسری‌اند مقدار نادرست برمی‌گرداند. (مشارکت توسط Jeremy Hylton.)

  • ماژول syslog اکنون به‌جای مقدار پیش‌فرض قبلی 'python'، از مقدار sys.argv[0] به‌عنوان شناسه استفاده خواهد کرد. (تغییر داده‌شده توسط Sean Reifschneider؛ bpo-8451.)

  • مقدار sys.version_info اکنون یک تاپل نام‌دار است، با ویژگی‌هایی به نام‌های major، minor، micro، releaselevel و serial. (ارائه‌شده توسط Ross Light؛ bpo-4285.)

    sys.getwindowsversion() نیز یک تاپل نام‌دار برمی‌گرداند که ویژگی‌هایی با نام‌های major، minor، build، platform، service_pack، service_pack_major، service_pack_minor، suite_mask و product_type دارد. (مشارکت‌شده توسط Brian Curtin؛ bpo-7766.)

  • مدیریت خطای پیش‌فرض ماژول tarfile تغییر کرده است تا دیگر خطا‌های مهلک را سرکوب نکند. سطح خطای پیش‌فرض قبلاً 0 بود، به این معنا که خطاها فقط باعث می‌شدند پیامی در گزارش اشکال‌زدایی نوشته شود، اما از آنجا که گزارش اشکال‌زدایی به‌طور پیش‌فرض فعال نیست، این خطاها نادیده می‌مانند. سطح خطای پیش‌فرض اکنون 1 است که در صورت وقوع خطا، استثنا مطرح می‌کند. (تغییر توسط Lars Gustäbel؛ bpo-7357.)

    ماژول tarfile اکنون از فیلتر کردن اشیاء TarInfo که به یک پرونده tar افزوده می‌شوند پشتیبانی می‌کند. هنگامی که add() را فراخوانی می‌کنید، می‌توانید یک آرگومان اختیاری filter که فراخوانی‌پذیر است ارائه کنید. فراخوانی‌پذیر filter برای هر پرونده‌ای که افزوده می‌شود، شیء TarInfo مربوط به آن را دریافت می‌کند و می‌تواند آن را تغییر داده و برگرداند. اگر فراخوانی‌پذیر None را برگرداند، آن پرونده در آرشیو حاصل قرار نخواهد گرفت. این قابلیت از آرگومان موجود exclude قدرتمندتر است و بنابراین آن آرگومان منسوخ شده است. (افزوده شده توسط Lars Gustäbel؛ bpo-6856.) کلاس TarFile نیز اکنون از پروتکل مدیریت زمینه پشتیبانی می‌کند. (افزوده شده توسط Lars Gustäbel؛ bpo-7232.)

  • متد wait() از کلاس threading.Event اکنون هنگام خروج، پرچم داخلی را برمی‌گرداند. این بدان معناست که این متد معمولاً مقدار درست را برمی‌گرداند، زیرا wait() باید تا زمانی که پرچم داخلی درست شود، مسدود بماند. مقدار بازگشتی تنها در صورتی نادرست خواهد بود که مهلت زمانی تعیین شده باشد و عملیات از مهلت آن بگذرد. (مشارکت‌شده توسط Tim Lesher؛ bpo-1674032.)

  • پایگاه داده‌ی یونیکد ارائه‌شده توسط ماژول unicodedata اکنون به‌طور داخلی برای تعیین اینکه کدام نویسه‌ها عددی، فضای سفید یا نشان‌دهنده‌ی شکست خط هستند، استفاده می‌شود. این پایگاه داده همچنین اطلاعاتی از پرونده داده‌ای Unihan.txt را در بر می‌گیرد (وصل توسط Anders Chrigström و Amaury Forgeot d'Arc؛ bpo-1571184) و به نسخه‌ی 5.2.0 به‌روزرسانی شده است (به‌روزرسانی توسط Florent Xicluna؛ bpo-8024).

  • تابع urlsplit() در ماژول urlparse اکنون طرح‌واره‌های ناشناخته‌ی URL را به شکلی سازگار با RFC 3986 مدیریت می‌کند: اگر URL به شکل "<something>://..." باشد، متن پیش از :// به‌عنوان طرح‌واره در نظر گرفته می‌شود، حتی اگر طرح‌واره‌ای ساختگی باشد که ماژول آن را نمی‌شناسد. این تغییر ممکن است کدهایی را که برای دور زدن رفتار قدیمی نوشته‌شده بودند، از کار بیندازد. برای مثال، پایتون 2.6.4 یا 2.5 موارد زیر را برمی‌گرداند:

    >>> import urlparse
    >>> urlparse.urlsplit('invented://host/filename?query')
    ('invented', '', '//host/filename?query', '', '')
    

    پایتون 2.7 (و پایتون 2.6.5) خواهد برگرداند:

    >>> import urlparse
    >>> urlparse.urlsplit('invented://host/filename?query')
    ('invented', 'host', '/filename?query', '', '')
    

    (در واقع پایتون 2.7 خروجی کمی متفاوتی تولید می‌کند، زیرا به‌جای یک تاپل استاندارد، یک تاپل نام‌دار برمی‌گرداند.)

    ماژول urlparse همچنین از نشانی‌های لفظی IPv6 طبق تعریف RFC 2732 پشتیبانی می‌کند (با مشارکت Senthil Kumaran؛ bpo-2987).

    >>> urlparse.urlparse('http://[1080::8:800:200C:417A]/foo')
    ParseResult(scheme='http', netloc='[1080::8:800:200C:417A]',
                path='/foo', params='', query='', fragment='')
    
  • کلاس جدید: کلاس WeakSet در ماژول weakref مجموعه‌ای است که تنها ارجاع‌های ضعیف به عناصر خود را نگه می‌دارد؛ عناصر به محض اینکه هیچ ارجاعی به آن‌ها اشاره نکند، حذف می‌شوند. (ابتدا در Python 3.x توسط Raymond Hettinger پیاده‌سازی شد و توسط Michael Foord به نسخه 2.7 بک‌پورت شد.)

  • کتابخانه‌ی xml.etree.ElementTree هنگام خروجی گرفتن دستورالعمل پردازش XML (که به شکل <?xml-stylesheet href="#style1"?> است) یا کامنت (که به شکل <!-- comment --> است)، دیگر امپرسندها و کمانک‌ها را خنثی نمی‌کند. (وصل توسط Neil Muller؛ bpo-2746.)

  • کلاینت و سرور XML-RPC، که توسط ماژول‌های xmlrpclib و SimpleXMLRPCServer ارائه‌شده‌اند، با پشتیبانی از قابلیت keep-alive در HTTP/1.1 و با استفاده‌ی اختیاری از کدگذاری gzip برای فشرده‌سازی XML در حال مبادله، کارایی خود را بهبود بخشیده‌اند. فشرده‌سازی gzip توسط ویژگی encode_threshold از SimpleXMLRPCRequestHandler کنترل می‌شود که حاوی اندازه‌ای بر حسب بایت است؛ پاسخ‌های بزرگ‌تر از این مقدار فشرده می‌شوند. (ارائه‌شده توسط Kristján Valur Jónsson؛ bpo-6267.)

  • کلاس ZipFile در ماژول zipfile اکنون از پروتکل مدیریت زمینه پشتیبانی می‌کند، بنابراین می‌توانید بنویسید with zipfile.ZipFile(...) as f:. (مشارکت‌شده توسط برایان کورتین؛ bpo-5511.)

    zipfile اکنون از آرشیو کردن پوشه‌های خالی نیز پشتیبانی می‌کند و آن‌ها را به‌درستی استخراج می‌کند. (اصلاح‌شده توسط Kuba Wieczorek؛ bpo-4710.) خواندن پرونده‌ها از یک آرشیو سریع‌تر شده است، و تناوب بین read() و readline() اکنون به‌درستی کار می‌کند. (مشارکت‌شده توسط Nir Aides؛ bpo-7610.)

    تابع is_zipfile() اکنون علاوه بر مسیرنام‌های پذیرفته‌شده در نسخه‌های قبلی، یک شیء پرونده را نیز می‌پذیرد. (مشارکت از Gabriel Genellina؛ bpo-4756.)

    متد writestr() اکنون یک پارامتر اختیاری compress_type دارد که به شما امکان می‌دهد روش فشرده‌سازی پیش‌فرضِ تعیین‌شده در سازنده‌ی ZipFile را نادیده بگیرید. (مشارکت‌کننده: رونالد اوسورن؛ bpo-6003.)

ماژول جدید: importlib

پایتون 3.1 شامل بسته‌ی importlib است؛ بازپیاده‌سازی منطق زیربنایی دستور import پایتون. importlib برای پیاده‌سازان مفسرهای پایتون و کاربرانی که می‌خواهند ایمپورت‌کننده‌های جدیدی بنویسند که بتوانند در فرایند ایمپورت مشارکت کنند، مفید است. پایتون 2.7 شامل بسته‌ی کامل importlib نیست، بلکه در عوض زیرمجموعه‌ی بسیار کوچکی دارد که تنها یک تابع، import_module()، را در بر می‌گیرد.

import_module(name, package=None) یک ماژول را ایمپورت می‌کند. name رشته‌ای است که نام ماژول یا بسته را در بر دارد. می‌توان با ارائه‌ی رشته‌ای که با نویسه‌ی . آغاز می‌شود (مانند ..utils.errors) ایمپورت‌های نسبی را انجام داد. برای ایمپورت‌های نسبی، آرگومان package باید ارائه شود و نام بسته‌ای است که به‌عنوان لنگر برای ایمپورت نسبی استفاده خواهد شد. import_module() هم ماژول ایمپورت‌شده را در sys.modules درج می‌کند و هم شیء ماژول را برمی‌گرداند.

در ادامه چند مثال آورده‌شده است:

>>> from importlib import import_module
>>> anydbm = import_module('anydbm')  # Standard absolute import
>>> anydbm
<module 'anydbm' from '/p/python/Lib/anydbm.py'>
>>> # Relative import
>>> file_util = import_module('..file_util', 'distutils.command')
>>> file_util
<module 'distutils.file_util' from '/python/Lib/distutils/file_util.pyc'>

importlib توسط Brett Cannon پیاده‌سازی شد و در پایتون 3.1 معرفی شد.

ماژول جدید: sysconfig

ماژول sysconfig از بسته‌ی Distutils جدا شده و به یک ماژول سطح‌بالا جدید و مستقل تبدیل شده است. sysconfig توابعی برای دریافت اطلاعاتی درباره‌ی فرایند ساخت پایتون فراهم می‌کند: سوییچ‌های کامپایلر، مسیرهای نصب، نام پلتفرم و اینکه آیا پایتون از پوشه‌ی منبع خود اجرا می‌شود یا خیر.

برخی از توابع این ماژول عبارت‌اند از:

  • get_config_var() متغیرها را از Makefile پایتون و پرونده‌ی pyconfig.h بازمی‌گرداند.

  • get_config_vars() دیکشنری‌ای را برمی‌گرداند که شامل تمام متغیرهای پیکربندی است.

  • get_path() مسیر پیکربندی‌شده برای نوع خاصی از ماژول را برمی‌گرداند: کتابخانه استاندارد، ماژول‌های مخصوص سایت، ماژول‌های مخصوص پلتفرم و غیره.

  • is_python_build() در صورتی که در حال اجرای یک پرونده دودویی از درخت منبع پایتون باشید، مقدار true را برمی‌گرداند و در غیر این صورت false.

برای جزئیات بیشتر و فهرست کامل توابع، به مستندات sysconfig مراجعه کنید.

بسته‌ی Distutils و sysconfig اکنون توسط طارق زیاده نگهداری می‌شوند، که همچنین بسته‌ی Distutils2 (مخزن منبع در https://hg.python.org/distutils2/) را برای توسعه‌ی نسخه‌ی نسل بعدی Distutils آغاز کرده است.

ttk: ابزارک‌های تم‌دار برای Tk

Tcl/Tk 8.5 مجموعه‌ای از ابزارک‌های تم‌دار را در بر می‌گیرد که ابزارک‌های پایه‌ی Tk را بازپیاده‌سازی می‌کنند، اما ظاهر آن‌ها بیشتر قابل سفارشی‌سازی است و از این رو می‌توانند شباهت بیشتری به ابزارک‌های پلتفرم بومی داشته باشند. این مجموعه ابزارک در ابتدا Tile نام داشت، اما هنگام افزوده شدن به نسخه‌ی 8.5 از Tcl/Tck، به Ttk تغییر نام داد (مخفف "themed Tk").

برای اطلاعات بیشتر، مستندات ماژول ttk را بخوانید. ممکن است بخواهید صفحه راهنمای Tcl/Tk را نیز بخوانید که موتور تم Ttk را شرح می‌دهد و در نشانی https://www.tcl.tk/man/tcl8.5/TkCmd/ttk_intro.html در دسترس است. چند تصویر صفحه از کد Python/Ttk در حال استفاده در نشانی https://code.google.com/archive/p/python-ttk/wikis/Screenshots.wiki موجود است.

ماژول tkinter.ttk توسط Guilherme Polo نوشته شد و در bpo-2983 اضافه شد. نسخه‌ی جایگزینی به نام Tile.py که توسط Martin Franklin نوشته و توسط Kevin Walzer نگهداری می‌شد، در bpo-2618 برای گنجاندن پیشنهاد شد، اما نویسندگان استدلال کردند که کار Guilherme Polo جامع‌تر بود.

ماژول به‌روزرسانی‌شده: unittest

ماژول unittest به‌طور چشمگیری بهبود یافت؛ ویژگی‌های جدید بسیاری به آن افزوده شد. بیشتر این ویژگی‌ها، مگر خلاف آن ذکر شده باشد، توسط Michael Foord پیاده‌سازی شده‌اند. نسخه‌ی بهبودیافته‌ی این ماژول، برای استفاده با نسخه‌های 2.4 تا 2.6 پایتون، در قالب بسته‌ی unittest2 بسته‌بندی شده و به‌طور جداگانه از unittest2 قابل دانلود است.

هنگام استفاده از خط فرمان، این ماژول می‌تواند آزمون‌ها را به‌طور خودکار کشف کند. این ماژول به اندازه‌ی py.test یا nose پیشرفته نیست، اما راهی ساده برای اجرای آزمون‌هایی که در مجموعه‌ای از پوشه‌های بسته نگه‌داری می‌شوند فراهم می‌کند. برای مثال، دستور زیر، زیرپوشه‌ی test/ را برای یافتن هر پرونده‌ی آزمونِ قابل‌ایمپورت با نام test*.py جستجو خواهد کرد:

python -m unittest discover -s test

برای جزئیات بیشتر به مستندات ماژول unittest مراجعه کنید. (در bpo-6001 توسعه یافت.)

تابع main() از برخی گزینه‌های جدید دیگر پشتیبانی می‌کند:

  • -b یا --buffer جریان‌های خروجی استاندارد و خطای استاندارد را در طول هر آزمون بافر می‌کند. اگر آزمون موفق باشد، هرگونه خروجی حاصل دور ریخته می‌شود؛ در صورت شکست، خروجی بافرشده نمایش داده می‌شود.

  • -c یا --catch باعث می‌شود وقفه‌ی control-C با ظرافت بیشتری مدیریت شود. به‌جای آنکه فرایند آزمون بلافاصله دچار وقفه شود، آزمون در حال اجرا به پایان می‌رسد و سپس نتایج جزئی تا لحظه‌ی وقفه گزارش می‌شوند. اگر صبور نیستید، فشردن دوباره‌ی control-C باعث وقفه‌ی فوری می‌شود.

    این هندلر کنترل-C تلاش می‌کند در مواردی که کد مورد آزمون یا آزمون‌های در حال اجرا هندلر سیگنال خود را تعریف کرده‌اند، با تشخیص اینکه هندلر سیگنالی از قبل تنظیم شده و فراخوانی آن، از ایجاد مشکلات جلوگیری کند. اگر این روش برای شما کار نکرد، دکوراتور removeHandler() وجود دارد که می‌توان از آن برای علامت‌گذاری آزمون‌هایی که باید مدیریت کنترل-C در آن‌ها غیرفعال شود، استفاده کرد.

  • -f یا --failfast باعث می‌شود اجرای آزمون‌ها به محض شکست یک آزمون، به‌جای ادامه‌ی اجرای آزمون‌های بعدی، متوقف شود. (پیشنهاد داده‌شده توسط Cliff Dyer و پیاده‌سازی‌شده توسط Michael Foord؛ bpo-8074.)

پیام‌های پیشرفت اکنون هنگام اجرا در حالت پرگویی (verbose)، 'x' را برای شکست‌های مورد انتظار و 'u' را برای موفقیت‌های غیرمنتظره نمایش می‌دهند. (با مشارکت Benjamin Peterson.)

موارد آزمون می‌توانند برای رد کردن یک آزمون، استثنای SkipTest را ایجاد کنند (bpo-1034053).

پیام‌های خطا برای شکست‌های assertEqual()، assertTrue() و assertFalse() اکنون اطلاعات بیشتری ارائه می‌دهند. اگر ویژگی longMessage کلاس‌های TestCase خود را به true تنظیم کنید، در صورت شکست، هم پیام خطای استاندارد و هم هر پیام اضافی‌ای که ارائه کرده باشید چاپ خواهد شد. (افزوده شده توسط مایکل فورد؛ bpo-5663.)

متد assertRaises() اکنون هنگامی که بدون ارائه‌ی شیء فراخوانی‌پذیر برای اجرا فراخوانی شود، یک مدیر زمینه برمی‌گرداند. برای مثال، می‌توانید این را بنویسید:

with self.assertRaises(KeyError):
    {}['foo']

(پیاده‌سازی‌شده توسط آنتوان پی‌ترو؛ bpo-4444.)

ثابت‌های آزمایشی راه‌اندازی و برچیدن (setup و teardown) در سطح ماژول و کلاس اکنون پشتیبانی می‌شوند. ماژول‌ها می‌توانند شامل توابع setUpModule() و tearDownModule() باشند. کلاس‌ها می‌توانند متدهای setUpClass() و tearDownClass() را داشته باشند که باید به‌صورت متد کلاس تعریف شوند (با استفاده از @classmethod یا معادل آن). این توابع و متدها هنگامی فراخوانی می‌شوند که اجراکننده آزمون به مورد آزمونی در ماژول یا کلاسی دیگر جابه‌جا شود.

متدهای addCleanup() و doCleanups() افزوده شدند. addCleanup() به شما امکان می‌دهد توابع پاک‌سازی‌ای اضافه کنید که بدون قید و شرط فراخوانی می‌شوند (پس از setUp() اگر setUp() شکست بخورد، در غیر این صورت پس از tearDown()). این امر تخصیص و آزادسازی منابع را در طول آزمون‌ها بسیار ساده‌تر می‌کند (bpo-5679).

تعدادی متد جدید اضافه شد که آزمون‌های تخصصی‌تر فراهم می‌کنند. بسیاری از این متدها توسط مهندسان گوگل برای استفاده در بدنه‌های آزمون خود نوشته شدند؛ Gregory P. Smith، Michael Foord و GvR روی ادغام آن‌ها در نسخه‌ی پایتونِ unittest کار کردند.

  • assertIsNone() و assertIsNotNone() یک عبارت دریافت می‌کنند و تأیید می‌کنند که نتیجه None است یا نیست.

  • assertIs() و assertIsNot() دو مقدار می‌گیرند و بررسی می‌کنند که آیا این دو مقدار به یک شیء ارزیابی می‌شوند یا خیر. (افزوده‌شده توسط Michael Foord؛ bpo-2578.)

  • assertIsInstance() و assertNotIsInstance() بررسی می‌کنند که آیا شیء حاصل، نمونه‌ای از یک کلاس خاص است یا نمونه‌ای از یکی از کلاس‌های یک تاپل. (اضافه‌شده توسط Georg Brandl؛ bpo-7031.)

  • assertGreater()، assertGreaterEqual()، assertLess() و assertLessEqual() دو مقدار را مقایسه می‌کنند.

  • assertMultiLineEqual() دو رشته را مقایسه می‌کند و اگر برابر نباشند، مقایسه‌ای مفید نمایش می‌دهد که تفاوت‌های میان دو رشته را برجسته می‌سازد. این مقایسه اکنون به‌طور پیش‌فرض هنگام مقایسه‌ی رشته‌های یونیکد با assertEqual() استفاده می‌شود.

  • assertRegexpMatches() و assertNotRegexpMatches() بررسی می‌کنند که آیا آرگومان اول رشته‌ای است که با عبارت باقاعده‌ی ارائه‌شده به‌عنوان آرگومان دوم تطبیق می‌کند یا نمی‌کند (bpo-8038).

  • assertRaisesRegexp() بررسی می‌کند که آیا استثنای خاصی پرتاب می‌شود، و سپس همچنین بررسی می‌کند که نمایش رشته‌ای استثنا با عبارت باقاعده‌ی ارائه‌شده مطابقت داشته باشد.

  • assertIn() و assertNotIn() بررسی می‌کنند که آیا اولی در دومی است یا نیست.

  • assertItemsEqual() آزمایش می‌کند که آیا دو دنباله‌ی ارائه‌شده حاوی همان عناصر هستند.

  • assertSetEqual() بررسی می‌کند که آیا دو مجموعه برابر هستند یا خیر، و در صورت خطا تنها تفاوت‌های بین مجموعه‌ها را گزارش می‌کند.

  • به‌طور مشابه، assertListEqual() و assertTupleEqual() انواع مشخص‌شده را مقایسه می‌کنند و هرگونه تفاوت را بدون آنکه لزوماً مقادیر کامل آن‌ها را چاپ کنند، توضیح می‌دهند؛ این متدها اکنون به‌طور پیش‌فرض هنگام مقایسه فهرست‌ها و تاپل‌ها با استفاده از assertEqual() به کار می‌روند. به‌طور کلی‌تر، assertSequenceEqual() دو دنباله را مقایسه می‌کند و می‌تواند به‌صورت اختیاری بررسی کند که آیا هر دو دنباله از نوع خاصی هستند یا خیر.

  • assertDictEqual() دو دیکشنری را مقایسه می‌کند و تفاوت‌ها را گزارش می‌دهد؛ این متد اکنون به‌صورت پیش‌فرض هنگام مقایسه‌ی دو دیکشنری با استفاده از assertEqual() به کار می‌رود. assertDictContainsSubset() بررسی می‌کند که آیا همه‌ی جفت‌های کلید/مقدار موجود در اول، در دوم یافت می‌شوند یا خیر.

  • assertAlmostEqual() و assertNotAlmostEqual() آزمون می‌کنند که آیا first و second تقریباً برابر هستند یا نه. این متد می‌تواند اختلاف آن‌ها را تا تعداد رقم‌هایی که به‌صورت اختیاری در places مشخص می‌شود گرد کند (مقدار پیش‌فرض ۷ است) و آن را با صفر مقایسه کند، یا الزام کند که اختلاف کوچک‌تر از مقدار delta داده‌شده باشد.

  • loadTestsFromName() به‌درستی از ویژگی suiteClass در TestLoader پیروی می‌کند. (توسط Mark Roddy اصلاح شد؛ bpo-6866.)

  • قلاب جدیدی به شما امکان می‌دهد متد assertEqual() را برای مدیریت نوع‌های داده‌ی جدید گسترش دهید. متد addTypeEqualityFunc() یک شیء نوع و یک تابع می‌گیرد. این تابع زمانی استفاده می‌شود که هر دو شیءی که در حال مقایسه هستند از نوع مشخص‌شده باشند. این تابع باید دو شیء را مقایسه کند و در صورت عدم مطابقت، استثنایی ایجاد کند؛ ایده‌ی خوبی است که تابع اطلاعات بیشتری درباره‌ی اینکه چرا دو شیء با هم مطابقت ندارند ارائه دهد، درست همان‌طور که متدهای جدید مقایسه‌ی دنباله انجام می‌دهند.

تابع unittest.main() اکنون یک آرگومان اختیاری exit می‌پذیرد. اگر نادرست باشد، main() تابع sys.exit() را فراخوانی نمی‌کند و به این ترتیب می‌توان main() را در مفسر تعاملی به کار برد. (مشارکت از J. Pablo Fernández؛ bpo-3379.)

کلاس TestResult متدهای جدید startTestRun() و stopTestRun() دارد که بلافاصله پیش و پس از یک اجرای آزمون فراخوانی می‌شوند. (مشارکت‌شده توسط رابرت کالینز؛ bpo-5728.)

با تمام این تغییرات، پرونده‌ی unittest.py به‌طرزی ناخوشایند بزرگ می‌شد، بنابراین ماژول به یک بسته تبدیل شد و کد به چندین پرونده تقسیم شد (توسط Benjamin Peterson). این امر بر نحوه‌ی ایمپورت یا استفاده از ماژول تأثیری نمی‌گذارد.

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

https://web.archive.org/web/20210619163128/http://www.voidspace.org.uk/python/articles/unittest2.shtml

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

ماژول به‌روزرسانی‌شده: ElementTree 1.3

نسخه‌ی کتابخانه ElementTree که همراه پایتون ارائه می‌شود، به نسخه 1.3 به‌روزرسانی شد. برخی از قابلیت‌های جدید عبارت‌اند از:

  • توابع تجزیه‌ی گوناگون اکنون یک آرگومان کلیدواژه‌ای parser می‌پذیرند که نمونه‌ی XMLParser مورد استفاده را مشخص می‌کند. این کار امکان نادیده گرفتن کدگذاری داخلی پرونده را فراهم می‌کند:

    p = ET.XMLParser(encoding='utf-8')
    t = ET.XML("""<root/>""", parser=p)
    

    خطاهای تجزیه XML اکنون استثنای ParseError ایجاد می‌کنند که نمونه‌های آن ویژگی position دارند؛ این ویژگی شامل یک تاپل (سطر، ستون) است که محل مشکل را مشخص می‌کند.

  • کد ElementTree برای تبدیل درخت‌ها به رشته به‌طور قابل‌توجهی بازنویسی شده است که این امر آن را در بسیاری از موارد تقریباً دو برابر سریع‌تر می‌کند. متدهای ElementTree.write() و Element.write() اکنون یک پارامتر method دارند که می‌تواند "xml" (پیش‌فرض)، "html" یا "text" باشد. حالت HTML المان‌های خالی را به‌جای <empty/> به‌صورت <empty></empty> خروجی می‌دهد و حالت متنی از روی المان‌ها عبور می‌کند و فقط تکه‌های متنی را خروجی می‌دهد. اگر ویژگی tag یک المان را برابر None قرار دهید اما فرزندان آن را سر جای خود نگه دارید، هنگام نوشتن درخت، آن المان از خروجی حذف خواهد شد؛ بنابراین برای حذف یک المان واحد نیازی به بازآرایی گسترده‌تر ندارید.

    مدیریت فضای نام نیز بهبود یافته است. اکنون تمام اعلان‌های xmlns:<whatever> روی عنصر ریشه درج می‌شوند، نه به‌صورت پراکنده در سراسر XML حاصل. می‌توانید فضای نام پیش‌فرض یک درخت را با تنظیم ویژگی default_namespace تعیین کنید و پیشوندهای جدید را با register_namespace() ثبت کنید. در حالت XML، می‌توانید از پارامتر درست/نادرست xml_declaration برای سرکوب اعلان XML استفاده کنید.

  • متد جدید Element: extend() آیتم‌های یک دنباله را به فرزندان عنصر می‌افزاید. خودِ عناصر مانند دنباله‌ها رفتار می‌کنند، بنابراین جابه‌جایی فرزندان از یک عنصر به عنصر دیگر آسان است:

    from xml.etree import ElementTree as ET
    
    t = ET.XML("""<list>
      <item>1</item> <item>2</item>  <item>3</item>
    </list>""")
    new = ET.XML('<root/>')
    new.extend(t)
    
    # Outputs <root><item>1</item>...</root>
    print ET.tostring(new)
    
  • متد جدید Element: iter() فرزندان عنصر را به‌صورت یک تولیدگر تولید می‌کند. همچنین می‌توانید for child in elem: را بنویسید تا روی فرزندان یک عنصر حلقه بزنید. متد موجود getiterator() اکنون منسوخ شده است؛ getchildren() که فهرستی از فرزندان می‌سازد و برمی‌گرداند نیز منسوخ شده است.

  • متد جدید Element: itertext() تمام تکه‌های متنی را که فرزندان این عنصر هستند تولید می‌کند. برای مثال:

    t = ET.XML("""<list>
      <item>1</item> <item>2</item>  <item>3</item>
    </list>""")
    
    # Outputs ['\n  ', '1', ' ', '2', '  ', '3', '\n']
    print list(t.itertext())
    
  • منسوخ: استفاده از یک المان به‌عنوان مقدار بولی (یعنی if elem:) در صورتی که المان فرزندی داشته باشد، مقدار درست و در صورتی که فرزندی نداشته باشد، مقدار نادرست را برمی‌گرداند. این رفتار سردرگم‌کننده است — None نادرست است، اما المان بی‌فرزند هم نادرست است؟ — بنابراین اکنون FutureWarning فعال خواهد شد. در کد خود باید صریح باشید: اگر به تعداد فرزندان علاقه‌مندید، len(elem) != 0 بنویسید، یا elem is not None.

فردریک لوند ElementTree را توسعه می‌دهد و نسخه‌ی 1.3 را تولید کرد؛ می‌توانید مقاله‌ی او درباره‌ی نسخه‌ی 1.3 را در https://web.archive.org/web/20200703234532/http://effbot.org/zone/elementtree-13-intro.htm بخوانید. فلوران شیکلونا پس از بحث‌هایی در python-dev و در bpo-6472، نسخه‌ی همراه پایتون را به‌روزرسانی کرد.)

تغییرات ساخت و C API

تغییرات در فرایند ساخت پایتون و در API زبان C شامل موارد زیر است:

  • آخرین نسخه‌ی منتشرشده‌ی اشکال‌زدای گنو، یعنی GDB 7، قابل اسکریپت‌نویسی با پایتون است. هنگامی که اشکال‌زدایی یک برنامه‌ی اجرایی P را آغاز می‌کنید، GDB به دنبال پرونده‌ای با نام P-gdb.py می‌گردد و آن را به‌طور خودکار می‌خواند. دیو مالکوم یک python-gdb.py ارائه کرده است که تعدادی دستور مفید برای اشکال‌زدایی خودِ پایتون اضافه می‌کند. برای نمونه، py-up و py-down یک فریم پشته‌ی پایتون به بالا یا پایین می‌روند که معمولاً معادل چندین فریم پشته‌ی C است. py-print مقدار یک متغیر پایتون را چاپ می‌کند و py-bt ردگیری پشته‌ی پایتون را چاپ می‌کند. (در نتیجه‌ی bpo-8032 اضافه شد.)

  • اگر از پرونده‌ی .gdbinit ارائه‌شده به همراه پایتون استفاده کنید، ماکرو "pyo" در نسخه‌ی 2.7 اکنون به‌درستی کار می‌کند زمانی که نخِ در حال اشکال‌زدایی قفل مفسر سراسری را در اختیار ندارد؛ این ماکرو اکنون پیش از چاپ، آن را در اختیار می‌گیرد. (مشارکت‌شده توسط Victor Stinner؛ bpo-3632.)

  • Py_AddPendingCall() اکنون نخ‌ایمن است و به هر نخ کارگری اجازه می‌دهد اعلان‌هایی را به نخ اصلی پایتون ارسال کند. این به‌ویژه برای عملیات ورودی/خروجی ناهمگام مفید است. (مشارکت‌شده توسط Kristján Valur Jónsson؛ bpo-4293.)

  • تابع جدید: PyCode_NewEmpty() یک شیء کد خالی ایجاد می‌کند؛ تنها نام پرونده، نام تابع و شماره سطر اول لازم است. این برای ماژول‌های توسعه‌ای که در تلاش‌اند پشته ردگیری کاربردی‌تری بسازند مفید است. پیش‌تر چنین ماژول‌هایی لازم بود PyCode_New() را فراخوانی کنند که آرگومان‌های بسیار بیشتری داشت. (افزوده‌شده توسط Jeffrey Yasskin.)

  • تابع جدید: PyErr_NewExceptionWithDoc() یک کلاس استثنا جدید ایجاد می‌کند، درست همان‌طور که PyErr_NewException() موجود انجام می‌دهد، اما یک آرگومان اضافی char * می‌گیرد که رشته مستند کلاس استثنا جدید را در بر دارد. (افزوده‌شده توسط 'lekma' در سامانه پیگیری اشکال پایتون؛ bpo-7033.)

  • تابع جدید: PyFrame_GetLineNumber() یک شیء فریم می‌گیرد و شماره سطری را که فریم هم‌اکنون در حال اجرای آن است برمی‌گرداند. پیش از این، کد باید اندیس دستور بایت‌کد در حال اجرا را می‌گرفت و سپس شماره سطر متناظر با آن نشانی را جست‌وجو می‌کرد. (افزوده‌شده توسط Jeffrey Yasskin.)

  • توابع جدید: PyLong_AsLongAndOverflow() و PyLong_AsLongLongAndOverflow() یک عدد صحیح بلند پایتون را به‌صورت یک long یا long long در C تقریب می‌زنند. اگر عدد آن‌قدر بزرگ باشد که در نوع خروجی جا نشود، پرچم سرریز تنظیم می‌شود و به فراخوان‌کننده بازگردانده می‌شود. (مشارکت‌شده توسط Case Van Horsen؛ bpo-7528 و bpo-7767.)

  • تابع جدید: ناشی از بازنویسی تبدیل رشته به عدد اعشاری، تابع جدید PyOS_string_to_double() افزوده شد. توابع قدیمی PyOS_ascii_strtod() و PyOS_ascii_atof() اکنون منسوخ شده‌اند.

  • تابع جدید: PySys_SetArgvEx() مقدار sys.argv را تنظیم می‌کند و می‌تواند بسته به مقدار پارامتر updatepath، به‌صورت اختیاری sys.path را به‌روزرسانی کند تا پوشه‌ی حاوی اسکریپتی را که نامش توسط sys.argv[0] مشخص می‌شود، در بر بگیرد.

    این تابع برای بستن حفره امنیتی در برنامه‌هایی که پایتون را تعبیه می‌کنند اضافه شد. تابع قدیمی، PySys_SetArgv()، همیشه sys.path را به‌روزرسانی می‌کرد و گاهی پوشه جاری را به آن اضافه می‌کرد. این بدان معنا بود که اگر برنامه‌ای که پایتون در آن تعبیه شده را در پوشه‌ای که توسط شخص دیگری کنترل می‌شود اجرا می‌کردید، مهاجمان می‌توانستند یک ماژول اسب تروا در آن پوشه قرار دهند (مثلاً پرونده‌ای با نام os.py) که برنامه شما سپس آن را ایمپورت و اجرا می‌کرد.

    اگر نگهداری یک برنامه C/C++ که پایتون را درون خود جای می‌دهد را بر عهده دارید، بررسی کنید که آیا PySys_SetArgv() را فراخوانی می‌کنید و به دقت در نظر بگیرید که آیا برنامه باید از PySys_SetArgvEx() با تنظیم updatepath روی false استفاده کند یا خیر.

    مشکل امنیتی با شماره CVE 2008-5983 گزارش شد؛ در bpo-5753 مورد بحث قرار گرفت و توسط Antoine Pitrou رفع شد.

  • ماکروهای جدید: پرونده‌های سرآیند پایتون اکنون ماکروهای زیر را تعریف می‌کنند: Py_ISALNUM، Py_ISALPHA، Py_ISDIGIT، Py_ISLOWER، Py_ISSPACE، Py_ISUPPER، Py_ISXDIGIT، Py_TOLOWER و Py_TOUPPER. همه‌ی این توابع مشابه ماکروهای استاندارد C برای دسته‌بندی نویسه‌ها هستند، اما تنظیم locale فعلی را نادیده می‌گیرند، زیرا پایتون در چندین جا باید نویسه‌ها را به‌صورت مستقل از locale تحلیل کند. (افزوده‌شده توسط اریک اسمیت؛ bpo-5793.)

  • تابع حذف‌شده: PyEval_CallObject() اکنون فقط به‌صورت ماکرو در دسترس است. یک نسخه‌ی تابعی از آن برای حفظ سازگاری پیوند ABI نگهداری می‌شد، اما آن به سال ۱۹۹۷ برمی‌گردد؛ تا به حال قطعاً می‌توان آن را حذف کرد. (حذف توسط آنتوان پی‌ترو؛ bpo-8276.)

  • کدهای قالب جدید: توابع PyString_FromFormat()، PyString_FromFormatV() و PyErr_Format() اکنون کدهای قالب %lld و %llu را برای نمایش نوع‌های long long زبان C می‌پذیرند. (مشارکت‌شده توسط Mark Dickinson؛ bpo-7228.)

  • تعامل پیچیده بین نخ‌ها و انشعاب فرایند تغییر کرده است. پیش‌تر، ممکن بود فرایند فرزندی که توسط os.fork() ایجاد می‌شود، شکست بخورد، زیرا فرزند تنها با یک نخ در حال اجرا ایجاد می‌شود؛ همان نخی که os.fork() را اجرا می‌کند. اگر هنگام انجام انشعاب، نخ‌های دیگر قفلی مانند قفل ایمپورت پایتون را نگه داشته بودند، آن قفل در فرایند جدید همچنان به‌عنوان «نگه‌داشته‌شده» علامت‌گذاری می‌شد. اما در فرایند فرزند هیچ‌چیز هرگز آن قفل را آزاد نمی‌کرد، زیرا نخ‌های دیگر تکثیر نشده بودند و فرایند فرزند دیگر نمی‌توانست ایمپورت انجام دهد.

    پایتون 2.7 پیش از انجام os.fork() قفل ایمپورت را به دست می‌آورد و همچنین هر قفلی را که با استفاده از ماژول threading ایجاد شده باشد پاک‌سازی می‌کند. ماژول‌های توسعه‌ای C که قفل‌های داخلی دارند یا خود fork() را فراخوانی می‌کنند، از این پاک‌سازی بهره‌مند نخواهند شد.

    (توسط Thomas Wouters اصلاح شد؛ bpo-1590864.)

  • تابع Py_Finalize() اکنون تابع داخلی threading._shutdown() را فراخوانی می‌کند؛ این کار از ایجاد برخی استثناها هنگام خاموش شدن مفسر جلوگیری می‌کند. (وصله توسط Adam Olsen؛ bpo-1722344.)

  • هنگام استفاده از ساختار PyMemberDef برای تعریف ویژگی‌های یک نوع، پایتون دیگر به شما اجازه نمی‌دهد که سعی کنید ویژگی T_STRING_INPLACE را حذف یا تنظیم کنید.

  • نمادهای سراسری تعریف‌شده توسط ماژول ctypes اکنون دارای پیشوند Py یا _ctypes هستند. (پیاده‌سازی‌شده توسط Thomas Heller؛ bpo-3102.)

  • گزینه‌ی جدید پیکربندی: سوییچ --with-system-expat اجازه می‌دهد ماژول pyexpat برای استفاده از کتابخانه‌ی Expat سیستم ساخته شود. (مشارکت‌شده توسط Arfrever Frehtes Taifersar Arahesis؛ bpo-7609.)

  • گزینه جدید پیکربندی : گزینه --with-valgrind اکنون تخصیص‌دهنده pymalloc را غیرفعال می‌کند که تحلیل صحیح آن برای آشکارساز خطاهای حافظه Valgrind دشوار است. بنابراین Valgrind در تشخیص نشت حافظه و تجاوز از محدوده بهتر عمل خواهد کرد. (مشارکت‌شده توسط James Henstridge؛ bpo-2422.)

  • گزینه‌ی جدید configure: اکنون می‌توانید یک رشته‌ی خالی به --with-dbmliborder= ارائه دهید تا همه‌ی ماژول‌های مختلف DBM غیرفعال شوند. (افزوده‌شده توسط Arfrever Frehtes Taifersar Arahesis؛ bpo-6491.)

  • اسکریپت configure اکنون اشکال‌های گرد کردن ممیز شناور را در برخی تراشه‌های ۳۲ بیتی اینتل بررسی می‌کند و یک تعریف پیش‌پردازنده به نام X87_DOUBLE_ROUNDING تعریف می‌کند. در حال حاضر هیچ کدی از این تعریف استفاده نمی‌کند، اما اگر کسی بخواهد از آن استفاده کند، در دسترس است. (افزوده‌شده توسط مارک دیکنسون؛ bpo-2937.)

    configure اکنون همچنین یک متغیر Makefile به نام LDCXXSHARED را برای پشتیبانی از پیوند C++ تنظیم می‌کند. (مشارکت‌شده توسط Arfrever Frehtes Taifersar Arahesis؛ bpo-1222585.)

  • فرایند ساخت اکنون پرونده‌های لازم برای پشتیبانی از pkg-config را ایجاد می‌کند. (مشارکت از سوی Clinton Roy؛ bpo-3585.)

  • فرایند ساخت اکنون از Subversion 1.7 پشتیبانی می‌کند. (مشارکت‌شده توسط Arfrever Frehtes Taifersar Arahesis؛ bpo-6094.)

کپسول‌ها

پایتون 3.1 یک نوع داده‌ی جدید در C به نام PyCapsule برای ارائه‌ی یک C API به یک ماژول توسعه‌ای اضافه می‌کند. کپسول در اصل نگهدارنده‌ی یک اشاره‌گر void * در C است و به‌صورت یک ویژگی ماژول در دسترس قرار می‌گیرد؛ برای مثال، API ماژول socket به‌صورت socket.CAPI ارائه شده است و unicodedata نیز ucnhash_CAPI را ارائه می‌کند. سایر ماژول‌های توسعه‌ای می‌توانند ماژول را ایمپورت کنند، برای به دست آوردن شیء کپسول به دیکشنری آن دسترسی پیدا کنند و سپس اشاره‌گر void * را به دست آورند که معمولاً به آرایه‌ای از اشاره‌گرها به توابع مختلف API ماژول اشاره می‌کند.

یک نوع داده‌ی موجود از قبل برای این کار استفاده می‌شود، PyCObject، اما ایمنی نوع فراهم نمی‌کند. کد مخرب نوشته‌شده به پایتون خالص می‌تواند با گرفتن یک PyCObject از ماژول A و جایگزین کردن آن به‌نحوی به‌جای PyCObject در ماژول B، خطای قطعه‌بندی (segmentation fault) ایجاد کند. کپسول‌ها نام خود را می‌دانند و به‌دست‌آوردن اشاره‌گر مستلزم ارائه‌ی نام است:

void *vtable;

if (!PyCapsule_IsValid(capsule, "mymodule.CAPI") {
        PyErr_SetString(PyExc_ValueError, "argument type invalid");
        return NULL;
}

vtable = PyCapsule_GetPointer(capsule, "mymodule.CAPI");

به شما اطمینان داده می‌شود که vtable به هر چیزی که انتظار دارید اشاره می‌کند. اگر کپسول دیگری ارسال شده باشد، PyCapsule_IsValid() نام ناسازگار را تشخیص می‌دهد و مقدار false را برمی‌گرداند. برای اطلاعات بیشتر درباره‌ی استفاده از این اشیاء به ارائه‌ی یک C API برای ماژول توسعه‌ای مراجعه کنید.

پایتون 2.7 اکنون به‌طور داخلی از کپسول‌ها برای ارائه‌ی APIهای مختلف ماژول‌های توسعه‌ای استفاده می‌کند، اما PyCObject_AsVoidPtr() تغییر داده شد تا کپسول‌ها را مدیریت کند و سازگاری زمان کامپایل با رابط PyCObject حفظ شود. استفاده از PyCObject_AsVoidPtr() هشدار PendingDeprecationWarning را صادر خواهد کرد که به‌طور پیش‌فرض بی‌صدا است.

در پایتون 3.1 پیاده‌سازی شد و توسط لری هستینگز به نسخه 2.7 بک‌پورت شد؛ در bpo-5630 مورد بحث قرار گرفت.

تغییرات خاص پورت: ویندوز

  • ماژول msvcrt اکنون شامل چند ثابت از پرونده‌ی سرآیند crtassem.h است: CRT_ASSEMBLY_VERSION، VC_ASSEMBLY_PUBLICKEYTOKEN و LIBRARIES_ASSEMBLY_NAME_PREFIX. (ارائه شده توسط دیوید کورناپو؛ bpo-4365.)

  • ماژول _winreg برای دسترسی به رجیستری اکنون توابع CreateKeyEx() و DeleteKeyEx() را پیاده‌سازی می‌کند که نسخه‌های توسعه‌یافته‌ای از توابع پیش‌تر پشتیبانی‌شده هستند و چند آرگومان اضافی می‌گیرند. توابع DisableReflectionKey()، EnableReflectionKey() و QueryReflectionKey() نیز آزمایش و مستندسازی شدند. (پیاده‌سازی توسط Brian Curtin: bpo-7347.)

  • برای آغاز کردن نخ‌ها از API جدید _beginthreadex() استفاده می‌شود و اکنون از توابع بومی ذخیره‌سازی نخ‌محلی استفاده می‌شود. (مشارکت‌شده توسط Kristján Valur Jónsson؛ bpo-3582.)

  • تابع os.kill() اکنون در ویندوز کار می‌کند. مقدار سیگنال می‌تواند یکی از ثابت‌های CTRL_C_EVENT، CTRL_BREAK_EVENT یا هر عدد صحیح باشد. دو ثابت نخست رویدادهای فشردن کلید Control-C و Control-Break را به زیرفرایندها ارسال می‌کنند؛ هر مقدار دیگر از API TerminateProcess() استفاده خواهد کرد. (مشارکت‌شده توسط Miki Tebeka؛ bpo-1220212.)

  • تابع os.listdir() اکنون برای مسیر خالی به‌درستی شکست می‌خورد. (اصلاح‌شده توسط Hirokazu Yamamoto؛ bpo-5913.)

  • ماژول mimetypes اکنون هنگام مقداردهی اولیه، پایگاه داده MIME را از رجیستری ویندوز می‌خواند. (وصل توسط گابریل جنلینا؛ bpo-4969.)

تغییرات خاص پورت: Mac OS X

  • مسیر /Library/Python/2.7/site-packages اکنون به sys.path الحاق می‌شود تا بسته‌های افزوده‌شده میان نصب سیستمی و یک رونوشت نصب‌شده توسط کاربر از همان نسخه به اشتراک گذاشته شوند. (تغییر توسط Ronald Oussoren؛ bpo-4865.)

    تغییر یافته در نسخه‌ی 2.7.13: از نسخه‌ی 2.7.13 به بعد، این تغییر حذف شد. /Library/Python/2.7/site-packages، پوشه‌ی site-packages که توسط پایتون 2.7 سیستمیِ ارائه‌شده از سوی اپل استفاده می‌شود، دیگر برای پایتون‌های نصب‌شده توسط کاربر، مانند پایتون‌هایی که از طریق نصب‌کننده‌های python.org نصب شده‌اند، به sys.path الحاق نمی‌شود. از macOS 10.12 به بعد، اپل نحوه‌ی پیکربندی پوشه‌ی site-packages سیستمی را تغییر داد؛ این امر می‌توانست باعث شود نصب اجزای pip، مانند setuptools، شکست بخورد. بسته‌های نصب‌شده برای پایتون سیستمی دیگر با پایتون‌های نصب‌شده توسط کاربر به اشتراک گذاشته نمی‌شوند. (bpo-28440)

تغییرات خاص پورت: FreeBSD

  • ثابت SO_SETFIB در FreeBSD 7.1، که همراه با متدهای socket() یعنی getsockopt()/setsockopt() برای انتخاب جدول مسیریابی جایگزین استفاده می‌شود، اکنون در ماژول socket در دسترس است. (افزوده‌شده توسط Kyle VanderBeek؛ bpo-8235.)

سایر تغییرات و اصلاحات

  • دو اسکریپت بنچمارک، iobench و ccbench، به پوشه‌ی Tools اضافه شدند. iobench هنگام انجام عملیات گوناگون، سرعت اشیاء ورودی/خروجی پرونده‌ی توکار برگردانده‌شده توسط open() را اندازه‌گیری می‌کند، و ccbench یک بنچمارک همروندی است که می‌کوشد هنگام انجام چندین وظیفه با استفاده از تعداد متغیری از نخ‌ها، توان عملیاتی محاسبات، تأخیر تعویض نخ، و پهنای باند پردازش ورودی/خروجی را اندازه‌گیری کند.

  • اسکریپت Tools/i18n/msgfmt.py اکنون شکل‌های جمع را در پرونده‌های .po درک می‌کند. (توسط Martin von Löwis اصلاح شد؛ bpo-5464.)

  • هنگام ایمپورت کردن یک ماژول از یک پرونده‌ی .pyc یا .pyo که همتای .py آن موجود است، در صورتی که نام پرونده‌ی اصلی از اعتبار افتاده باشد، ویژگی‌های co_filename اشیاء کدی که به دست می‌آیند بازنویسی می‌شوند. این وضعیت می‌تواند رخ دهد اگر پرونده تغییر نام داده باشد، جابه‌جا شده باشد یا از طریق مسیرهای مختلف به آن دسترسی پیدا شود. (وصله توسط Ziga Seilnacht و Jean-Paul Calderone؛ bpo-1180193.)

  • اسکریپت regrtest.py اکنون سوییچ --randseed= را می‌پذیرد که یک عدد صحیح می‌گیرد؛ این عدد به‌عنوان بذر تصادفی برای گزینه‌ی -r که آزمون‌ها را به ترتیب تصادفی اجرا می‌کند، استفاده خواهد شد. گزینه‌ی -r همچنین بذر استفاده‌شده را گزارش می‌دهد (افزوده‌شده توسط Collin Winter.)

  • سوییچ دیگر regrtest.py، -j است که یک عدد صحیح می‌گیرد و مشخص می‌کند چند آزمون به‌طور موازی اجرا می‌شوند. این امکان را فراهم می‌کند که زمان اجرای کل روی ماشین‌های چند‌هسته‌ای کاهش یابد. این گزینه با چندین گزینه دیگر، از جمله سوییچ -R که به‌دلیل ایجاد زمان‌های اجرای طولانی شناخته می‌شود، سازگار است. (افزوده‌شده توسط Antoine Pitrou، bpo-6152.) این گزینه همچنین می‌تواند با سوییچ جدید -F استفاده شود که آزمون‌های انتخاب‌شده را در یک حلقه اجرا می‌کند تا زمانی که شکست بخورند. (افزوده‌شده توسط Antoine Pitrou؛ bpo-7312.)

  • هنگامی که به‌عنوان اسکریپت اجرا می‌شود، ماژول py_compile.py اکنون '-' را به‌عنوان آرگومان می‌پذیرد که فهرست نام پرونده‌هایی را که باید کامپایل شوند از ورودی استاندارد می‌خواند. (ارائه‌شده توسط Piotr Ożarowski؛ bpo-8233.)

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

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

  • تابع range() آرگومان‌های خود را به‌طور سازگارتری پردازش می‌کند؛ اکنون __int__() را روی آرگومان‌هایی که اعشاری یا عدد صحیح نیستند و به آن داده می‌شوند فراخوانی می‌کند. (توسط Alexander Belopolsky اصلاح شد؛ bpo-1533.)

  • متد format() رشته، دقت پیش‌فرض استفاده‌شده برای اعداد ممیز شناور و مختلط را از ۶ رقم اعشاری به ۱۲ تغییر داد، که با دقت استفاده‌شده توسط str() مطابقت دارد. (تغییر توسط Eric Smith؛ bpo-5920.)

  • به دلیل یک بهینه‌سازی برای دستور with، متدهای ویژه __enter__() و __exit__() باید به نوع شیء تعلق داشته باشند و نمی‌توان آن‌ها را مستقیماً به نمونه‌ی شیء الصاق کرد. این موضوع بر کلاس‌های سبک جدید (new-style) (مشتق‌شده از object) و نوع‌های توسعه‌ای C تأثیر می‌گذارد. (bpo-6101.)

  • به دلیل یک اشکال در Python 2.6، پارامتر exc_value در متدهای __exit__() اغلب نمایش رشته‌ای استثنا بود، نه یک نمونه از آن. این اشکال در 2.7 برطرف شد، بنابراین exc_value همان‌طور که انتظار می‌رود یک نمونه خواهد بود. (اصلاح‌شده توسط Florent Xicluna؛ bpo-7853.)

  • وقتی مجموعه‌ی محدودی از ویژگی‌ها با استفاده از __slots__ تنظیم شده بود، حذف یک ویژگی تنظیم‌نشده همان‌طور که انتظار می‌رفت AttributeError ایجاد نمی‌کرد. این مشکل توسط Benjamin Peterson برطرف شد؛ bpo-7604.)

در کتابخانه استاندارد:

  • عملیات روی نمونه‌های datetime که به سالی خارج از بازه پشتیبانی‌شده منجر می‌شدند، همیشه خطای OverflowError ایجاد نمی‌کردند. چنین خطاهایی اکنون با دقت بیشتری بررسی می‌شوند و از این پس استثنا ایجاد خواهد شد. (گزارش‌شده توسط Mark Leander، وصل توسط Anand B. Pillai و Alexander Belopolsky؛ bpo-7150.)

  • هنگام استفاده از نمونه‌های Decimal با متد format() یک رشته، ترازبندی پیش‌فرض قبلاً چپ‌چین بود. این مورد به راست‌چین تغییر کرده است که ممکن است خروجی برنامه‌های شما را تغییر دهد. (تغییر توسط Mark Dickinson؛ bpo-6857.)

    مقایسه‌های شامل مقدار NaN علامت‌دهنده (یا sNAN) اکنون به جای آنکه بسته به عملگر مقایسه، بی‌صدا مقداری درست یا نادرست برگردانند، سیگنال InvalidOperation را صادر می‌کنند. مقادیر NaN خاموش (یا NaN) اکنون هش‌پذیر هستند. (توسط Mark Dickinson اصلاح شد؛ bpo-7279.)

  • کتابخانه‌ی xml.etree.ElementTree هنگام خروجی گرفتن از یک دستورالعمل پردازش XML (که به شکل <?xml-stylesheet href="#style1"?> است) یا کامنت (که به شکل <!-- comment --> است)، دیگر امپرساند‌ها و براکت‌های زاویه‌ای را خنثی نمی‌کند. (وصل توسط نیل مولر؛ bpo-2746.)

  • متد readline() از اشیای StringIO اکنون هنگامی که طول منفی درخواست شود، هیچ کاری انجام نمی‌دهد؛ همان‌طور که دیگر اشیای شبه‌پرونده چنین می‌کنند. (bpo-7348).

  • ماژول syslog اکنون به‌جای مقدار پیش‌فرض قبلی 'python'، از مقدار sys.argv[0] به‌عنوان شناسه استفاده خواهد کرد. (تغییر داده‌شده توسط Sean Reifschneider؛ bpo-8451.)

  • مدیریت خطای پیش‌فرض ماژول tarfile تغییر کرده است تا دیگر خطا‌های مهلک را سرکوب نکند. سطح خطای پیش‌فرض قبلاً 0 بود، به این معنا که خطاها فقط باعث می‌شدند پیامی در گزارش اشکال‌زدایی نوشته شود، اما از آنجا که گزارش اشکال‌زدایی به‌طور پیش‌فرض فعال نیست، این خطاها نادیده می‌مانند. سطح خطای پیش‌فرض اکنون 1 است که در صورت وقوع خطا، استثنا مطرح می‌کند. (تغییر توسط Lars Gustäbel؛ bpo-7357.)

  • تابع urlsplit() در ماژول urlparse اکنون طرح‌واره‌های ناشناخته‌ی URL را به شکلی سازگار با RFC 3986 مدیریت می‌کند: اگر URL به شکل "<something>://..." باشد، متن پیش از :// به‌عنوان طرح‌واره در نظر گرفته می‌شود، حتی اگر طرح‌واره‌ای ساختگی باشد که ماژول آن را نمی‌شناسد. این تغییر ممکن است کدهایی را که برای دور زدن رفتار قدیمی نوشته‌شده بودند، از کار بیندازد. برای مثال، پایتون 2.6.4 یا 2.5 موارد زیر را برمی‌گرداند:

    >>> import urlparse
    >>> urlparse.urlsplit('invented://host/filename?query')
    ('invented', '', '//host/filename?query', '', '')
    

    پایتون 2.7 (و پایتون 2.6.5) خواهد برگرداند:

    >>> import urlparse
    >>> urlparse.urlsplit('invented://host/filename?query')
    ('invented', 'host', '/filename?query', '', '')
    

    (در واقع پایتون 2.7 خروجی کمی متفاوتی تولید می‌کند، زیرا به‌جای یک تاپل استاندارد، یک تاپل نام‌دار برمی‌گرداند.)

برای ماژول‌های توسعه‌ای C:

  • افزونه‌های C که از کدهای قالب عدد صحیح با خانواده توابع PyArg_Parse* استفاده می‌کنند، اکنون به جای تولید DeprecationWarning، استثنای TypeError ایجاد می‌کنند (bpo-5080).

  • به‌جای توابع قدیمی PyOS_ascii_strtod() و PyOS_ascii_atof() که اکنون منسوخ شده‌اند، از تابع جدید PyOS_string_to_double() استفاده کنید.

برای برنامه‌هایی که پایتون را در خود تعبیه می‌کنند:

  • تابع PySys_SetArgvEx() اضافه شد که به برنامه‌ها امکان می‌دهد حفره‌ی امنیتی ناشی از استفاده از تابع موجود PySys_SetArgv() را ببندند. بررسی کنید که آیا PySys_SetArgv() را فراخوانی می‌کنید و با دقت در نظر بگیرید که آیا برنامه باید از PySys_SetArgvEx() با تنظیم updatepath روی false استفاده کند.

ویژگی‌های جدید افزوده‌شده به نسخه‌های نگهداری پایتون 2.7

زمانی که وضعیت واقعاً ایجاب کند، ممکن است قابلیت‌های جدیدی به نسخه‌های نگهداری Python 2.7 افزوده شود. هرگونه افزودنی از این دست باید فرایند پیشنهاد بهبود پایتون را طی کند و دلایل قانع‌کننده‌ای ارائه دهد که چرا نمی‌توان به‌طور کافی با افزودن قابلیت جدید تنها به Python 3، یا با انتشار آن در شاخص بسته‌های پایتون (Python Package Index) به آن‌ها پرداخت.

علاوه بر پیشنهادهای خاص فهرست‌شده در زیر، یک معافیت کلی وجود دارد که اجازه می‌دهد هشدارهای -3 جدید در هر نسخه نگهداری پایتون 2.7 افزوده شوند.

دو متغیر محیطی جدید برای حالت اشکال‌زدایی

در حالت اشکال‌زدایی، آمار [xxx refs] به‌طور پیش‌فرض نوشته نمی‌شود و اکنون باید متغیر محیطی PYTHONSHOWREFCOUNT نیز تنظیم شود. (مشارکت‌شده توسط Victor Stinner؛ bpo-31733.)

وقتی پایتون با تعریف COUNT_ALLOC کامپایل شود، شمارنده‌های تخصیص دیگر به‌طور پیش‌فرض برون‌ریزی نمی‌شوند: اکنون باید متغیر محیطی PYTHONSHOWALLOCCOUNT نیز تنظیم شود. علاوه بر این، شمارنده‌های تخصیص اکنون به stderr برون‌ریزی می‌شوند، نه به stdout. (مشارکت‌شده توسط Victor Stinner؛ bpo-31692.)

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

PEP 434: استثنای بهبود IDLE برای همه شاخه‌ها

PEP 434 معافیتی کلی را برای تغییرات اعمال‌شده در محیط توسعه‌ی IDLE — که همراه با پایتون عرضه می‌شود — شرح می‌دهد. این معافیت به توسعه‌دهندگان IDLE امکان می‌دهد تا تجربه‌ی کاربری سازگارتری را در تمام نسخه‌های پشتیبانی‌شده‌ی پایتون 2 و 3 فراهم کنند.

برای جزئیات هرگونه تغییر در IDLE، به پرونده‌ی NEWS نسخه‌ی مورد نظر مراجعه کنید.

PEP 466: بهبودهای امنیت شبکه برای پایتون 2.7

PEP 466 شماری از پیشنهادهای بهبود امنیت شبکه را توصیف می‌کند که برای گنجاندن در نسخه‌های نگهداری پایتون 2.7 تصویب شده‌اند، و نخستین این تغییرات در نسخه‌ی پایتون 2.7.7 ظاهر شد.

ویژگی‌های مرتبط با PEP 466 که در پایتون 2.7.7 اضافه شدند:

  • hmac.compare_digest() از پایتون 3 به نسخه‌های قدیمی‌تر بک‌پورت شد تا عملیات مقایسه‌ی مقاوم در برابر حمله‌ی زمانی برای برنامه‌های پایتون 2 در دسترس قرار گیرد. (نوشته‌ی Alex Gaynor؛ bpo-21306.)

  • در نصب‌کننده‌های رسمی ویندوز که در python.org منتشر شده‌اند، OpenSSL به نسخه‌ی 1.0.1g ارتقا یافت. (با مشارکت Zachary Ware؛ bpo-21462.)

ویژگی‌های مرتبط با PEP 466 افزوده‌شده در پایتون 2.7.8:

  • hashlib.pbkdf2_hmac() از Python 3 به نسخه‌های قدیمی‌تر منتقل شد تا الگوریتم هش مناسب برای ذخیره‌سازی امن گذرواژه، به‌طور گسترده در دسترس برنامه‌های Python 2 قرار گیرد. (با مشارکت Alex Gaynor؛ bpo-21304.)

  • OpenSSL در نصب‌کننده‌های رسمی ویندوز که در python.org منتشر شده‌اند، به نسخه‌ی 1.0.1h ارتقا یافت. (مشارکت توسط Zachary Ware در bpo-21671 برای CVE 2014-0224.)

ویژگی‌های مرتبط با PEP 466 افزوده‌شده در Python 2.7.9:

  • بیشترِ ماژول ssl پایتون 3.4 به نسخه‌های قبلی بازگردانده شد . این بدان معناست که ssl اکنون از نشانگر نام سرور (Server Name Indication)، تنظیمات TLS1.x، دسترسی به مخزن گواهی‌های پلتفرم، کلاس SSLContext و قابلیت‌های دیگر پشتیبانی می‌کند. (مشارکت‌شده توسط Alex Gaynor و David Reid؛ bpo-21308.)

    برای جزئیات دقیق، به یادداشت‌های «نسخه‌ی افزوده‌شده: 2.7.9» در مستندات ماژول رجوع کنید.

  • تابع os.urandom() تغییر یافت تا به‌جای باز کردن مجدد /dev/urandom در هر فراخوانی، توصیف‌گر پرونده‌ی /dev/urandom را در نهانگاه ذخیره کند. (با مشارکت الکس گینور؛ bpo-21305.)

  • hashlib.algorithms_guaranteed و hashlib.algorithms_available از پایتون ۳ بک‌پورت شدند تا انتخاب قوی‌ترین الگوریتم هش موجود برای برنامه‌های پایتون ۲ آسان‌تر شود. (مشارکت‌شده توسط Alex Gaynor در bpo-21307)

PEP 477: بک‌پورت ensurepip (PEP 453) به پایتون 2.7

PEP 477 گنجاندن ماژول ensurepip مربوط به PEP 453 و مستندات بهبودیافته‌ای که به‌واسطه‌ی آن ممکن شد را در نسخه‌های نگهداری Python 2.7 تصویب می‌کند؛ این موارد نخستین بار در نسخه‌ی Python 2.7.9 ظاهر شدند.

بوت‌استرپینگ pip به‌صورت پیش‌فرض

ماژول جدید ensurepip (تعریف‌شده در PEP 453) سازوکاری استاندارد و چندسکویی برای بوت‌استرپینگ کردن نصب‌کننده‌ی pip در نصب‌های پایتون فراهم می‌کند. نسخه‌ی pip که همراه پایتون 2.7.9 ارائه می‌شود، pip 1.5.6 است و نسخه‌های نگهداری 2.7.x در آینده، نسخه‌ی همراه را به جدیدترین نسخه‌ی pip که هنگام ایجاد نسخه‌ی نامزد انتشار (release candidate) در دسترس است، به‌روزرسانی خواهند کرد.

به‌طور پیش‌فرض، دستورهای pip، pipX و pipX.Y در همه‌ی پلتفرم‌ها (که در آن X.Y نشان‌دهنده‌ی نسخه‌ی نصب پایتون است) همراه با بسته‌ی پایتونی pip و وابستگی‌های آن نصب می‌شوند.

برای ساخت سی‌پایتون از سورس در سیستم‌های POSIX، دستورهای make install و make altinstall به‌طور پیش‌فرض pip را بوت‌استرپ نمی‌کنند. این رفتار را می‌توان از طریق گزینه‌های configure کنترل کرد و از طریق گزینه‌های Makefile بازنویسی کرد.

در ویندوز و Mac OS X، نصب‌کننده‌های سی‌پایتون اکنون به‌طور پیش‌فرض pip را همراه با خودِ سی‌پایتون نصب می‌کنند (کاربران می‌توانند در طول فرایند نصب از نصب آن صرف‌نظر کنند). کاربران ویندوز باید تغییرات خودکار PATH را فعال کنند تا pip به‌طور پیش‌فرض از خط فرمان در دسترس باشد؛ در غیر این صورت همچنان می‌توان از طریق راه‌انداز پایتون برای ویندوز با py -m pip به آن دسترسی داشت.

همان‌طور که در PEP بحث شده است، بسته‌سازان پلتفرم می‌توانند انتخاب کنند که این دستورها را به‌طور پیش‌فرض نصب نکنند، به شرط آنکه این دستورها هنگام فراخوانی، دستورالعمل‌های روشن و ساده‌ای درباره نحوه نصب‌شان روی آن پلتفرم ارائه دهند (معمولاً با استفاده از مدیر بسته سیستم).

تغییرات مستندات

به‌عنوان بخشی از این تغییر، بخش‌های نصب ماژول‌های پایتون و توزیع ماژول‌های پایتون از مستندات، به‌طور کامل به‌عنوان اسناد کوتاه «شروع کار» و «پرسش‌های متداول» بازطراحی شده‌اند. بیشتر مستندات بسته‌بندی اکنون به Python Packaging User Guide که توسط Python Packaging Authority نگهداری می‌شود و مستندات پروژه‌های جداگانه منتقل شده است.

با این حال، از آنجا که این مهاجرت در حال حاضر هنوز کامل نشده است، نسخه‌های قدیمی آن راهنماها همچنان به صورت ساخت توسعه‌های C و C++ با setuptools و ساخت توسعه‌های C و C++ با setuptools در دسترس هستند.

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

PEP 453 -- بوت‌استرپینگ صریح pip در نصب‌های پایتون

PEP نوشته‌شده توسط Donald Stufft و Nick Coghlan و پیاده‌سازی‌شده توسط Donald Stufft، Nick Coghlan، Martin von Löwis و Ned Deily.

PEP 476: فعال‌سازی راستی‌آزمایی گواهی به‌صورت پیش‌فرض برای کلاینت‌های http کتابخانه استاندارد

PEP 476 ماژول httplib و ماژول‌هایی را که از آن استفاده می‌کنند، مانند urllib2 و xmlrpclib، به‌روزرسانی کرد تا از این پس به‌طور پیش‌فرض راستی‌آزمایی کنند که سرور گواهی‌ای ارائه می‌دهد که توسط یک مرجع صدور گواهی موجود در ذخیره‌گاه اعتماد پلتفرم (trust store) امضا شده باشد و نام میزبان آن با نام میزبان درخواست‌شده مطابقت داشته باشد؛ این امر امنیت بسیاری از برنامه‌ها را به‌طور چشمگیری بهبود می‌بخشد. این تغییر در نسخه Python 2.7.9 اعمال شد.

برنامه‌هایی که به رفتار قدیمی قبلی نیاز دارند می‌توانند یک زمینه جایگزین ارسال کنند:

import urllib2
import ssl

# This disables all verification
context = ssl._create_unverified_context()

# This allows using a specific certificate for the host, which doesn't need
# to be in the trust store
context = ssl.create_default_context(cafile="/path/to/file.crt")

urllib2.urlopen("https://invalid-cert", context=context)

PEP 493: ابزارهای مهاجرت به راستی‌آزمایی HTTPS برای پایتون 2.7

PEP 493 برای پشتیبانی از فرایند تدریجی‌ترِ ارتقای زیرساخت در محیط‌هایی که برنامه‌ها و سرویس‌هایی را در بر می‌گیرند که هنگام برقراری اتصالات HTTPS کلاینت به پردازش تاریخیِ سهل‌گیرانه‌ی گواهی‌های سرور تکیه دارند، ابزارهای مهاجرت بیشتری فراهم می‌کند. این افزوده‌ها در نسخه‌ی پایتون 2.7.12 ارائه شدند.

این ابزارها برای استفاده در مواردی در نظر گرفته شده‌اند که نمی‌توان برنامه‌ها و سرویس‌های تحت تأثیر را به‌گونه‌ای تغییر داد که هنگام برقراری اتصال، به‌طور صریح یک زمینه SSL آزادتر را ارسال کنند.

برای برنامه‌ها و سرویس‌هایی که به‌هیچ‌وجه قابل تغییر نیستند، می‌توان متغیر محیطی جدید PYTHONHTTPSVERIFY را روی 0 تنظیم کرد تا یک فرایند پایتون به‌طور کامل به رفتار سهل‌گیرانه‌ی پیش‌فرض پایتون 2.7.8 و نسخه‌های پیشین بازگردد.

برای مواردی که کد برقراری اتصال قابل تغییر نیست، اما کل برنامه قابل تغییر است، می‌توان از تابع جدید ssl._https_verify_certificates() برای تنظیم رفتار پیش‌فرض در زمان اجرا استفاده کرد.

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

برای ساده‌سازی کامپایل متقاطع (cross-compilation)، و برای اطمینان از اینکه سی‌پایتون می‌تواند بدون نیاز به نسخه‌ای از پایتون که از قبل در دسترس باشد، به‌طور قابل اطمینان کامپایل شود، سیستم ساخت مبتنی بر autotools دیگر تلاش نمی‌کند پرونده‌های تولیدشده را به‌صورت ضمنی بر اساس زمان‌های تغییر پرونده بازکامپایل کند.

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

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

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

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

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

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

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

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

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

سپاسگزاری‌ها

نویسنده مایل است از افراد زیر به‌خاطر ارائه پیشنهادها، اصلاحات و کمک در پیش‌نویس‌های مختلف این مقاله تشکر کند: Nick Coghlan، Philip Jenvey، Ryan Lovett، R. David Murray و Hugh Secker-Walker.