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

نویسنده:

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

این مقاله ویژگی‌های جدید پایتون 2.6 را که در تاریخ ۱ اکتبر ۲۰۰۸ منتشر شد، توضیح می‌دهد. برنامه زمان‌بندی انتشار در PEP 361 شرح داده شده است.

محور اصلی پایتون 2.6، آماده‌سازی مسیر مهاجرت به پایتون 3.0 است که بازطراحی اساسی این زبان به شمار می‌رود. هر جا که ممکن باشد، پایتون 2.6 قابلیت‌ها و سینتکس جدید 3.0 را در بر می‌گیرد و در عین حال با حذف نکردن قابلیت‌ها یا سینتکس قدیمی‌تر، با کد موجود سازگار باقی می‌ماند. وقتی این کار ممکن نباشد، پایتون 2.6 تلاش می‌کند هر کاری که از دستش برمی‌آید انجام دهد و با افزودن توابع سازگاری در ماژول future_builtins و سوییچ -3، درباره‌ی استفاده‌هایی که در 3.0 دیگر مورد پشتیبانی قرار نخواهند گرفت هشدار می‌دهد.

تعدادی بسته‌ی جدید مهم به کتابخانه استاندارد افزوده شده‌اند، مانند ماژول‌های multiprocessing و json، اما ویژگی‌های جدید زیادی وجود ندارد که به نحوی به پایتون 3.0 مرتبط نباشند.

پایتون 2.6 همچنین شاهد تعدادی بهبود و رفع اشکال در سراسر کد منبع است. جست‌وجویی در گزارش‌های تغییرات نشان می‌دهد که بین پایتون 2.5 و 2.6 تعداد ۲۵۹ وصل اعمال و ۶۱۲ اشکال رفع شده است. هر دو عدد احتمالاً دست‌کم گرفته شده‌اند.

این مقاله تلاش نمی‌کند مشخصات کاملی از ویژگی‌های جدید ارائه دهد، بلکه مرور کلی‌ای مناسب فراهم می‌کند. برای جزئیات کامل، باید به مستندات پایتون 2.6 مراجعه کنید. اگر می‌خواهید منطق طراحی و پیاده‌سازی را درک کنید، به PEP (پیشنهاد بهبود پایتون) مربوط به ویژگی جدید موردنظر مراجعه کنید. هر جا که ممکن باشد، «تازه‌های پایتون» به آیتم باگ/وصله هر تغییر پیوند می‌دهد.

Python 3.0

چرخه توسعه نسخه‌های 2.6 و 3.0 پایتون همگام‌سازی شد و انتشارهای آلفا و بتای هر دو نسخه در یک روز انجام می‌شد. توسعه نسخه 3.0 بر بسیاری از ویژگی‌های نسخه 2.6 تأثیر گذاشته است.

پایتون 3.0 یک بازطراحی گسترده از پایتون است که سازگاری با سری 2.x را می‌شکند. این بدان معناست که کدهای موجود پایتون برای اجرا روی پایتون 3.0 به مقداری تبدیل نیاز خواهند داشت. با این حال، همه‌ی تغییرات در 3.0 لزوماً سازگاری را نمی‌شکنند. در مواردی که قابلیت‌های جدید باعث شکستن کدهای موجود نمی‌شوند، آن‌ها به نسخه‌ی 2.6 بک‌پورت شده‌اند و در این سند در جای مناسب توضیح داده شده‌اند. برخی از قابلیت‌های برگرفته از 3.0 عبارت‌اند از:

  • متد __complex__() برای تبدیل اشیاء به عدد مختلط.

  • سینتکس جایگزین برای گرفتن استثناها: except TypeError as exc.

  • افزودن functools.reduce() به‌عنوان مترادفی برای تابع توکار reduce().

پایتون 3.0 چندین تابع توکار جدید اضافه می‌کند و معناشناسی برخی از توابع توکار موجود را تغییر می‌دهد. توابعی که در 3.0 جدید هستند، مانند bin()، صرفاً به پایتون 2.6 افزوده شده‌اند، اما توابع توکار موجود تغییر نکرده‌اند؛ در عوض، ماژول future_builtins نسخه‌هایی با معناشناسی جدید 3.0 دارد. کدی که برای سازگاری با 3.0 نوشته شده است، می‌تواند در صورت نیاز from future_builtins import hex, map را انجام دهد.

سوییچ جدید خط فرمان، -3، هشدارهایی درباره‌ی قابلیت‌هایی که در پایتون 3.0 حذف خواهند شد را فعال می‌کند. شما می‌توانید کد را با این سوییچ اجرا کنید تا ببینید برای انتقال کد به 3.0 چقدر کار لازم خواهد بود. مقدار این سوییچ برای کد پایتون به‌صورت متغیر بولی sys.py3kwarning و برای کد توسعه‌ی C به‌صورت Py_Py3kWarningFlag در دسترس است.

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

سری 3xxx از PEP‌ها، که شامل پیشنهادهایی برای پایتون 3.0 است. PEP 3000 فرایند توسعه‌ی پایتون 3.0 را توصیف می‌کند. با PEP 3100 شروع کنید که اهداف کلی پایتون 3.0 را توصیف می‌کند، و سپس PEP‌هایی را که شماره‌ی بالاتری دارند و قابلیت‌های مشخصی پیشنهاد می‌کنند، بررسی کنید.

تغییرات در فرایند توسعه

در حین توسعه‌ی نسخه‌ی 2.6، فرایند توسعه‌ی پایتون دستخوش دو تغییر مهم شد: ما از ردیاب اشکال (issue tracker) SourceForge به یک نصب سفارشی‌شده از Roundup مهاجرت کردیم و مستندات از LaTeX به reStructuredText تبدیل شد.

ردیاب اشکال جدید: Roundup

مدت‌ها بود که توسعه‌دهندگان پایتون به‌طور فزاینده‌ای از ردیاب باگ (bug tracker) SourceForge دل‌زده می‌شدند. راهکار میزبانی‌شده SourceForge اجازه سفارشی‌سازی زیادی نمی‌دهد؛ برای مثال، امکان سفارشی‌سازی چرخه حیات مسائل وجود نداشت.

بنابراین، کمیته زیرساخت بنیاد نرم‌افزار پایتون فراخوانی برای ردیاب‌های مسئله منتشر کرد و از داوطلبان خواست تا محصولات مختلفی را راه‌اندازی کنند و برخی از باگ‌ها و وصل‌ها را از SourceForge ایمپورت کنند. چهار ردیاب مختلف بررسی شدند: Jira، Launchpad، Roundup و Trac. کمیته در نهایت Jira و Roundup را به‌عنوان دو نامزد برگزید. Jira محصولی تجاری است که نمونه‌های میزبانی‌شده‌ی بدون هزینه را به پروژه‌های نرم‌افزار آزاد ارائه می‌دهد؛ Roundup پروژه‌ای متن‌باز است که برای اداره‌ی آن به داوطلبان و برای میزبانی آن به یک سرور نیاز دارد.

پس از انتشار فراخوانی برای داوطلبان، یک نصب جدید از Roundup در https://bugs.python.org راه‌اندازی شد. یک نصب از Roundup می‌تواند میزبان چندین ردیاب باشد و این سرور اکنون ردیاب‌های مسئله (issue tracker) مربوط به Jython و وب‌سایت پایتون را نیز میزبانی می‌کند. قطعاً در آینده کاربردهای دیگری نیز برای آن پیدا خواهد شد. هر جا که ممکن باشد، این ویرایش از «What's New in Python» به آیتم باگ/وصل مربوط به هر تغییر پیوند می‌دهد.

میزبانی سامانه پیگیری باگ پایتون با لطف Upfront Systems در استلنبوش، آفریقای جنوبی فراهم شده است. Martin von Löwis تلاش زیادی برای ایمپورت کردن باگ‌ها و وصل‌های موجود از SourceForge صرف کرد؛ اسکریپت‌های او برای این عملیات ایمپورت در https://svn.python.org/view/tracker/importer/ قرار دارند و ممکن است برای پروژه‌های دیگری که مایل‌اند از SourceForge به Roundup منتقل شوند، مفید باشند.

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

https://bugs.python.org

سامانه پیگیری باگ‌های پایتون.

https://bugs.jython.org:

ردیاب اشکالات Jython.

https://roundup.sourceforge.io/

دانلودها و مستندات Roundup.

https://svn.python.org/view/tracker/importer/

اسکریپت‌های تبدیل Martin von Löwis.

قالب جدید مستندسازی: reStructuredText با استفاده از Sphinx

مستندات پایتون از زمان آغاز پروژه در حدود سال ۱۹۸۹ با استفاده از LaTeX نوشته می‌شد. در دهه‌ی ۱۹۸۰ و اوایل دهه‌ی ۱۹۹۰، بیشتر مستندات برای مطالعه‌ی بعدی چاپ می‌شدند، نه به‌صورت برخط مشاهده می‌شدند. LaTeX به‌طور گسترده استفاده می‌شد، زیرا خروجی چاپی جذابی ارائه می‌داد و در عین حال پس از یادگیری قواعد پایه‌ی نشانه‌گذاری، نوشتن با آن ساده بود.

امروزه LaTeX همچنان برای نگارش آثاری که قرار است چاپ شوند استفاده می‌شود، اما چشم‌انداز ابزارهای برنامه‌نویسی تغییر کرده است. ما دیگر مقادیر انبوهی از مستندات را چاپ نمی‌کنیم؛ در عوض، آن‌ها را به‌صورت آنلاین مرور می‌کنیم و HTML به مهم‌ترین قالبی تبدیل شده است که باید از آن پشتیبانی شود. متأسفانه تبدیل LaTeX به HTML نسبتاً پیچیده است و Fred L. Drake Jr.، ویراستار دیرینه‌ی مستندات پایتون، زمان زیادی را صرف نگهداری فرایند تبدیل کرد. گاهی افراد پیشنهاد می‌کردند که مستندات به SGML و بعدها XML تبدیل شود، اما انجام یک تبدیل خوب کاری بزرگ است و هیچ‌کس هرگز زمان لازم برای به پایان رساندن این کار را اختصاص نداد.

در طول چرخه توسعه 2.6، Georg Brandl تلاش زیادی برای ساخت یک زنجیره‌ی ابزار (toolchain) جدید جهت پردازش مستندات کرد. بسته‌ی حاصل Sphinx نام دارد و از طریق https://www.sphinx-doc.org/ در دسترس است.

Sphinx بر خروجی HTML تمرکز دارد و HTML‌ای با ظاهری زیبا و مدرن تولید می‌کند؛ خروجی چاپی همچنان از طریق تبدیل به LaTeX پشتیبانی می‌شود. قالب ورودی reStructuredText است؛ سینتکس نشانه‌گذاری‌ای که از توسعه‌های سفارشی و دایرکتیوها پشتیبانی می‌کند و به‌طور رایج در کامیونیتی پایتون استفاده می‌شود.

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

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

مستندسازی پایتون

شرح می‌دهد که چگونه برای مستندات پایتون بنویسید.

Sphinx

مستندات و کد برای زنجیره ابزار Sphinx.

Docutils

پارسر و مجموعه ابزارهای زیربنایی reStructuredText.

PEP 343: دستور «with»

نسخه‌ی قبلی، پایتون 2.5، دستور «with» را به‌عنوان یک قابلیت اختیاری افزود که باید با دایرکتیو from __future__ import with_statement فعال می‌شد. در نسخه‌ی 2.6 این دستور دیگر نیازی به فعال‌سازی خاص ندارد؛ این بدان معناست که with اکنون همیشه یک کلیدواژه است. بقیه‌ی این بخش رونوشتی از بخش متناظر در سند «تازه‌های پایتون 2.5» است؛ اگر با دستور «with» در پایتون 2.5 آشنا هستید، می‌توانید از این بخش صرف‌نظر کنید.

دستور «with» کدی را شفاف‌تر می‌سازد که پیش‌تر برای اطمینان از اجرای کد پاک‌سازی، از بلوک‌های try...finally استفاده می‌کرد. در این بخش، این دستور را به شکلی که معمولاً به کار می‌رود شرح می‌دهم. در بخش بعدی، جزئیات پیاده‌سازی را بررسی می‌کنم و نشان می‌دهم که چگونه می‌توان اشیایی برای استفاده با این دستور نوشت.

دستور 'with' یک ساختار کنترل جریان است که ساختار پایه‌ی آن به صورت زیر است:

with expression [as variable]:
    with-block

عبارت ارزیابی می‌شود و باید به شیئی منجر شود که از پروتکل مدیریت زمینه پشتیبانی کند (یعنی متدهای __enter__() و __exit__() را داشته باشد).

متد __enter__() شیء پیش از اجرای with-block فراخوانی می‌شود و بنابراین می‌تواند کد راه‌اندازی را اجرا کند. این متد همچنین ممکن است مقداری را برگرداند که در صورت تعیین، به نام variable مقید می‌شود. (دقت کنید که نتیجه‌ی expression به variable منتسب نمی‌شود.)

پس از پایان اجرای بلوک with، متد __exit__() شیء فراخوانی می‌شود، حتی اگر بلوک استثنایی ایجاد کرده باشد، و بنابراین می‌تواند کد پاک‌سازی را اجرا کند.

برخی از اشیاء استاندارد پایتون اکنون از پروتکل مدیریت زمینه پشتیبانی می‌کنند و می‌توان از آن‌ها با دستور 'with' استفاده کرد. اشیاء پرونده یکی از نمونه‌های آن هستند:

with open('/etc/passwd', 'r') as f:
    for line in f:
        print line
        ... more processing code ...

پس از اجرای این دستور، شیء پرونده در f به‌طور خودکار بسته شده خواهد بود، حتی اگر حلقه‌ی for در میانه‌ی بلوک استثنایی ایجاد کند.

توجه

در این حالت، f همان شیء‌ای است که توسط open() ایجاد‌شده است، زیرا __enter__() self را برمی‌گرداند.

قفل‌ها و متغیرهای شرطی ماژول threading نیز از دستور «with» پشتیبانی می‌کنند:

lock = threading.Lock()
with lock:
    # Critical section of code
    ...

قفل پیش از اجرای بلوک گرفته می‌شود و همیشه به محض اتمام بلوک آزاد می‌شود.

تابع localcontext() در ماژول decimal ذخیره و بازیابی زمینه اعشاری فعلی را آسان می‌کند؛ زمینه‌ای که دقت مطلوب و ویژگی‌های گرد کردن برای محاسبات را در بر می‌گیرد:

from decimal import Decimal, Context, localcontext

# Displays with default precision of 28 digits
v = Decimal('578')
print v.sqrt()

with localcontext(Context(prec=16)):
    # All code in this block uses a precision of 16 digits.
    # The original context is restored on exiting the block.
    print v.sqrt()

نوشتن مدیرهای زمینه

در پس‌زمینه، دستور 'with' نسبتاً پیچیده است. اکثر افراد 'with' را فقط همراه با اشیاء موجود به کار می‌برند و نیازی به دانستن این جزئیات ندارند، بنابراین در صورت تمایل می‌توانید از خواندن ادامه‌ی این بخش صرف‌نظر کنید. نویسندگان اشیاء جدید باید جزئیات پیاده‌سازی زیربنایی را درک کنند و بهتر است به خواندن ادامه دهند.

توضیح سطح بالایی از پروتکل مدیریت زمینه چنین است:

  • عبارت ارزیابی می‌شود و باید به شیئی منجر شود که «مدیر زمینه» نامیده می‌شود. مدیر زمینه باید متدهای __enter__() و __exit__() را داشته باشد.

  • متد __enter__() مدیر زمینه فراخوانی می‌شود. مقدار بازگشتی به VAR انتساب داده می‌شود. اگر بند as VAR وجود نداشته باشد، مقدار به سادگی دور انداخته می‌شود.

  • کد درون BLOCK اجرا می‌شود.

  • اگر BLOCK استثنایی مطرح کند، متد __exit__() مدیر زمینه با سه آرگومان فراخوانی می‌شود: جزئیات استثنا (type, value, traceback، همان مقادیری که sys.exc_info() برمی‌گرداند و در صورت عدم وقوع استثنا می‌توانند None نیز باشند). مقدار بازگشتی متد کنترل می‌کند که آیا استثنا دوباره مطرح شود یا خیر: هر مقدار نادرست باعث می‌شود استثنا دوباره مطرح شود، و True منجر به سرکوب آن خواهد شد. به‌ندرت پیش می‌آید که بخواهید استثنا را سرکوب کنید، زیرا اگر چنین کنید، نویسنده‌ی کدی که حاوی دستور 'with' است هرگز متوجه نخواهد شد که مشکلی رخ داده است.

  • اگر BLOCK استثنایی ایجاد نکرده باشد، متد __exit__() همچنان فراخوانی می‌شود، اما type، value و traceback همگی None هستند.

بیایید یک مثال را بررسی کنیم. کد تفصیلی ارائه نمی‌کنم، بلکه تنها متدهای لازم برای پایگاه داده‌ای را که از تراکنش‌ها پشتیبانی می‌کند، به‌طور مختصر ترسیم می‌کنم.

(برای کسانی که با اصطلاحات پایگاه داده آشنایی ندارند: مجموعه‌ای از تغییرات پایگاه داده در قالب یک تراکنش گروه‌بندی می‌شود. تراکنش‌ها می‌توانند یا ثبت نهایی شوند، به این معنا که همه‌ی تغییرات در پایگاه داده نوشته می‌شوند، یا بازگردانی شوند، به این معنا که همه‌ی تغییرات دور ریخته می‌شوند و پایگاه داده بدون تغییر باقی می‌ماند. برای اطلاعات بیشتر به هر کتاب درسی پایگاه داده مراجعه کنید.)

فرض کنید شیئی وجود دارد که نمایانگر یک اتصال به پایگاه داده است. هدف ما این خواهد بود که به کاربر اجازه دهیم کدی مانند این بنویسد:

db_connection = DatabaseConnection()
with db_connection as cursor:
    cursor.execute('insert into ...')
    cursor.execute('delete from ...')
    # ... more operations ...

تراکنش باید در صورت اجرای بی‌نقص کدِ درون بلوک ثبت نهایی شود، یا در صورت بروز استثنا بازگردانی شود. در ادامه، رابط پایه‌ای که برای DatabaseConnection فرض می‌کنم آمده است:

class DatabaseConnection:
    # Database interface
    def cursor(self):
        "Returns a cursor object and starts a new transaction"
    def commit(self):
        "Commits current transaction"
    def rollback(self):
        "Rolls back current transaction"

متد __enter__() بسیار ساده است و تنها باید یک تراکنش جدید را آغاز کند. برای این کاربرد، شیء نشانگر حاصل نتیجه‌ی مفیدی خواهد بود، بنابراین متد آن را برمی‌گرداند. کاربر سپس می‌تواند as cursor را به دستور 'with' خود اضافه کند تا نشانگر را به یک نام متغیر مقید کند.

class DatabaseConnection:
    ...
    def __enter__(self):
        # Code to start a new transaction
        cursor = self.cursor()
        return cursor

متد __exit__() پیچیده‌ترین متد است، زیرا بیشترِ کارها باید در آن انجام شود. این متد باید بررسی کند که آیا استثنایی رخ داده است یا خیر. اگر استثنایی رخ نداده باشد، تراکنش ثبت نهایی می‌شود. در صورت وقوع استثنا، تراکنش بازگردانی می‌شود.

در کد زیر، اجرا صرفاً از انتهای تابع خارج می‌شود و مقدار پیش‌فرض None را برمی‌گرداند. None نادرست است، بنابراین استثنا به‌طور خودکار مجدداً ایجاد خواهد شد. اگر مایل بودید، می‌توانید صریح‌تر عمل کنید و یک دستور return در مکان مشخص‌شده اضافه کنید.

class DatabaseConnection:
    ...
    def __exit__(self, type, value, tb):
        if tb is None:
            # No exception, so commit
            self.commit()
        else:
            # Exception occurred, so rollback.
            self.rollback()
            # return False

ماژول contextlib

ماژول contextlib برخی توابع و یک دکوراتور را فراهم می‌کند که هنگام نوشتن اشیاء برای استفاده همراه با دستور «with» مفید هستند.

این دکوراتور @~contextlib.contextmanager نام دارد و به شما اجازه می‌دهد به‌جای تعریف یک کلاس جدید، تنها یک تابع تولیدگر بنویسید. تولیدگر باید دقیقاً یک مقدار را yield کند. کد تا yield به‌عنوان متد __enter__() اجرا خواهد شد، و مقداری که yield می‌شود، مقدار بازگشتی این متد خواهد بود که در صورت وجود، به متغیرِ بندِ as در دستور «with» مقید می‌شود. کد پس از yield در متد __exit__() اجرا خواهد شد. هر استثنایی که در بلوک ایجاد شود، توسط دستور yield ایجاد خواهد شد.

با استفاده از این دکوراتور، می‌توان مثال پایگاه داده‌ی ما از بخش قبل را به این شکل نوشت:

from contextlib import contextmanager

@contextmanager
def db_transaction(connection):
    cursor = connection.cursor()
    try:
        yield cursor
    except:
        connection.rollback()
        raise
    else:
        connection.commit()

db = DatabaseConnection()
with db_transaction(db) as cursor:
    ...

ماژول contextlib همچنین تابعی به نام nested(mgr1, mgr2, ...) دارد که تعدادی مدیر زمینه را با هم ترکیب می‌کند تا نیازی به نوشتن دستورهای 'with' تودرتو نداشته باشید. در این مثال، دستور 'with' واحد هم یک تراکنش پایگاه داده را آغاز می‌کند و هم یک قفل نخ را به دست می‌آورد:

lock = threading.Lock()
with nested (db_transaction(db), lock) as (cursor, locked):
    ...

در نهایت، تابع closing() آرگومان خود را برمی‌گرداند تا بتوان آن را به یک متغیر مقید کرد، و در پایان بلوک، متد .close() آرگومان را فراخوانی می‌کند.

import urllib, sys
from contextlib import closing

with closing(urllib.urlopen('http://www.yahoo.com')) as f:
    for line in f:
        sys.stdout.write(line)

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

PEP 343 — دستور «with»

PEP (پیشنهاد بهبود پایتون) نوشته‌شده توسط گیدو ون روسوم و نیک کافلان؛ پیاده‌سازی‌شده توسط مایک بلند، گیدو ون روسوم و نیل نورویتز. این PEP کد تولیدشده برای دستور 'with' را نشان می‌دهد که می‌تواند در یادگیری نحوه کارکرد این دستور مفید باشد.

مستندات ماژول contextlib.

PEP 366: ایمپورت‌های نسبی صریح از یک ماژول اصلی

سوییچ -m پایتون اجازه می‌دهد یک ماژول را به‌عنوان اسکریپت اجرا کنید. هنگامی که ماژولی را که درون یک بسته قرار داشت اجرا می‌کردید، ایمپورت‌های نسبی به‌درستی کار نمی‌کردند.

اصلاحیه‌ی پایتون 2.6 ویژگی module.__package__ را اضافه می‌کند. وقتی این ویژگی وجود داشته باشد، ایمپورت‌های نسبی به‌جای ویژگی __name__ نسبت به مقدار این ویژگی خواهند بود.

ایمپورت‌کننده‌های به سبک PEP 302 سپس می‌توانند در صورت نیاز __package__ را تنظیم کنند. ماژول runpy که سوئیچ -m را پیاده‌سازی می‌کند، اکنون این کار را انجام می‌دهد، بنابراین ایمپورت‌های نسبی از این پس در اسکریپت‌هایی که از داخل یک بسته اجرا می‌شوند به‌درستی کار خواهند کرد.

PEP 370: پوشه site-packages به ازای هر کاربر

وقتی پایتون را اجرا می‌کنید، مسیر جستجوی ماژول sys.path معمولاً پوشه‌ای را در بر می‌گیرد که مسیر آن به "site-packages" ختم می‌شود. این پوشه برای نگهداری بسته‌های نصب‌شده به‌صورت محلی که برای همه کاربران یک ماشین یا یک نصب سایت (site installation) خاص در دسترس هستند، در نظر گرفته شده است.

پایتون 2.6 قراردادی برای پوشه‌های site مخصوص کاربر معرفی می‌کند. این پوشه بسته به پلتفرم متفاوت است:

  • Unix و Mac OS X: ~/.local/

  • ویندوز: %APPDATA%/Python

درون این پوشه، زیرپوشه‌های خاص هر نسخه وجود خواهند داشت؛ مانند lib/python2.6/site-packages در Unix/Mac OS و Python26/site-packages در Windows.

اگر پوشه پیش‌فرض را نمی‌پسندید، می‌توانید آن را با یک متغیر محیطی تغییر دهید. PYTHONUSERBASE پوشه ریشه‌ای را برای همه نسخه‌های پایتون که از این قابلیت پشتیبانی می‌کنند تعیین می‌کند. در ویندوز، می‌توان پوشه داده‌های خاص برنامه را با تنظیم متغیر محیطی APPDATA تغییر داد. همچنین می‌توانید پرونده site.py مربوط به نصب پایتون خود را ویرایش کنید.

می‌توان این قابلیت را به‌طور کامل با اجرای پایتون به‌همراه گزینه‌ی -s یا با تنظیم متغیر محیطی PYTHONNOUSERSITE غیرفعال کرد.

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

PEP 370 - پوشه site-packages به ازای هر کاربر

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

PEP 371: بسته‌ی multiprocessing

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

ماژول multiprocessing در ابتدا شبیه‌سازی دقیقی از ماژول threading بود که به‌جای نخ‌ها از فرایندها استفاده می‌کرد. این هدف در مسیر رسیدن به پایتون 2.6 کنار گذاشته شد، اما رویکرد کلی ماژول همچنان مشابه است. کلاس بنیادی Process است که به آن یک شیء فراخوانی‌پذیر و مجموعه‌ای از آرگومان‌ها داده می‌شود. متد start() شیء فراخوانی‌پذیر را در یک زیرفرایند به اجرا درمی‌آورد، پس از آن می‌توانید متد is_alive() را برای بررسی اینکه آیا زیرفرایند هنوز در حال اجراست، و متد join() را برای انتظار تا خروج فرایند فراخوانی کنید.

در ادامه مثال ساده‌ای آورده شده است که در آن زیرفرایند یک فاکتوریل را محاسبه می‌کند. تابع انجام‌دهنده‌ی این محاسبه به‌گونه‌ای عجیب نوشته شده است که وقتی آرگومان ورودی مضربی از ۴ باشد، زمان به‌طور چشمگیری بیشتری می‌گیرد.

import time
from multiprocessing import Process, Queue


def factorial(queue, N):
    "فاکتوریل را محاسبه می‌کند."
    # If N is a multiple of 4, this function will take much longer.
    if (N % 4) == 0:
        time.sleep(.05 * N/4)

    # Calculate the result
    fact = 1L
    for i in range(1, N+1):
        fact = fact * i

    # Put the result on the queue
    queue.put(fact)

if __name__ == '__main__':
    queue = Queue()

    N = 5

    p = Process(target=factorial, args=(queue, N))
    p.start()
    p.join()

    result = queue.get()
    print 'Factorial', N, '=', result

از Queue برای انتقال نتیجه‌ی فاکتوریل استفاده می‌شود. شیء Queue در یک متغیر سراسری ذخیره می‌شود. فرایند فرزند مقدار متغیر را در زمان ایجاد فرزند استفاده خواهد کرد؛ از آنجا که این یک Queue است، والد و فرزند می‌توانند از این شیء برای برقراری ارتباط استفاده کنند. (اگر والد مقدار متغیر سراسری را تغییر دهد، مقدار فرزند تحت تأثیر قرار نمی‌گیرد، و برعکس.)

دو کلاس دیگر، Pool و Manager، رابط‌های سطح بالاتری فراهم می‌کنند. Pool تعداد ثابتی از فرایندهای کارگر را ایجاد می‌کند و سپس می‌توان درخواست‌ها را با فراخوانی apply() یا apply_async() برای افزودن یک درخواست، و map() یا map_async() برای افزودن تعدادی درخواست، میان کارگرها توزیع کرد. کد زیر از Pool برای توزیع درخواست‌ها میان ۵ فرایند کارگر و بازیابی فهرست نتایج استفاده می‌کند:

from multiprocessing import Pool

def factorial(N, dictionary):
    "Compute a factorial."
    ...
p = Pool(5)
result = p.map(factorial, range(1, 1000, 10))
for v in result:
    print v

این خروجی زیر را تولید می‌کند:

1
39916800
51090942171709440000
8222838654177922817725562880000000
33452526613163807108170062053440751665152000000000
...

دیگر رابط سطح بالا، کلاس Manager، یک فرایند سرور جداگانه ایجاد می‌کند که می‌تواند نسخه‌های اصلی ساختارهای داده پایتون را نگه دارد. سپس فرایندهای دیگر می‌توانند با استفاده از اشیاء پراکسی به این ساختارهای داده دسترسی پیدا کنند و آن‌ها را تغییر دهند. مثال زیر با فراخوانی متد dict() یک دیکشنری مشترک ایجاد می‌کند؛ سپس فرایندهای کارگر مقادیر را در دیکشنری درج می‌کنند. (قفل‌گذاری به‌طور خودکار برای شما انجام نمی‌شود، که در این مثال اهمیتی ندارد. متدهای Manager همچنین شامل Lock()، RLock() و Semaphore() برای ایجاد قفل‌های مشترک هستند.)

import time
from multiprocessing import Pool, Manager

def factorial(N, dictionary):
    "Compute a factorial."
    # Calculate the result
    fact = 1L
    for i in range(1, N+1):
        fact = fact * i

    # Store result in dictionary
    dictionary[N] = fact

if __name__ == '__main__':
    p = Pool(5)
    mgr = Manager()
    d = mgr.dict()         # Create shared dictionary

    # Run tasks using the pool
    for N in range(1, 1000, 10):
        p.apply_async(factorial, (N, d))

    # Mark pool as closed -- no more tasks can be added.
    p.close()

    # Wait for tasks to exit
    p.join()

    # Output results
    for k, v in sorted(d.items()):
        print k, v

این خروجی را تولید خواهد کرد:

1 1
11 39916800
21 51090942171709440000
31 8222838654177922817725562880000000
41 33452526613163807108170062053440751665152000000000
51 15511187532873822802242430164693032110632597200169861120000...

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

مستندات ماژول multiprocessing.

PEP 371 - افزودن بسته‌ی multiprocessing

PEP نوشته‌شده توسط Jesse Noller و Richard Oudkerk؛ پیاده‌سازی‌شده توسط Richard Oudkerk و Jesse Noller.

PEP 3101: قالب‌بندی پیشرفته‌ی رشته

در پایتون 3.0، عملگر % با متد قالب‌بندی رشته‌ی قدرتمندتر format() تکمیل می‌شود. پشتیبانی از متد str.format() به پایتون 2.6 بک‌پورت شده است.

در 2.6، هر دو رشته‌ی ۸-بیتی و یونیکد متد .format() دارند که رشته را به‌عنوان یک قالب در نظر می‌گیرد و آرگومان‌هایی را که باید قالب‌بندی شوند می‌گیرد. قالب قالب‌بندی از آکولادها ({، }) به‌عنوان نویسه‌های خاص استفاده می‌کند:

>>> # Substitute positional argument 0 into the string.
>>> "User ID: {0}".format("root")
'User ID: root'
>>> # Use the named keyword arguments
>>> "User ID: {uid}   Last seen: {last_login}".format(
...    uid="root",
...    last_login = "5 Mar 2008 07:20")
'User ID: root   Last seen: 5 Mar 2008 07:20'

می‌توان آکولادها را با دو بار نوشتن آن‌ها خنثی کرد:

>>> "Empty dict: {{}}".format()
"Empty dict: {}"

نام فیلدها می‌توانند اعداد صحیحی باشند که نشان‌دهنده‌ی آرگومان‌های جایگاهی هستند، مانند {0}، {1} و غیره، یا نام آرگومان‌های کلیدواژه‌ای باشند. همچنین می‌توانید نام فیلدهای مرکبی فراهم کنید که ویژگی‌ها را می‌خوانند یا به کلیدهای دیکشنری دسترسی می‌یابند:

>>> import sys
>>> print 'Platform: {0.platform}\nPython version: {0.version}'.format(sys)
Platform: darwin
Python version: 2.6a1+ (trunk:61261M, Mar  5 2008, 20:29:41)
[GCC 4.0.1 (Apple Computer, Inc. build 5367)]'

>>> import mimetypes
>>> 'Content-type: {0[.mp4]}'.format(mimetypes.types_map)
'Content-type: video/mp4'

توجه کنید که هنگام استفاده از نمادگذاری به سبک دیکشنری مانند [.mp4]، نیازی نیست هیچ علامت نقل‌قولی دور رشته قرار دهید؛ مقدار با استفاده از .mp4 به‌عنوان کلید جست‌وجو می‌شود. رشته‌هایی که با یک عدد آغاز می‌شوند به عدد صحیح تبدیل خواهند شد. شما نمی‌توانید عبارت‌های پیچیده‌تری را درون رشته قالب‌بندی بنویسید.

تا اینجا نشان داده‌ایم که چگونه مشخص کنیم کدام فیلد در رشته‌ی حاصل جایگزین شود. قالب‌بندی دقیقی که استفاده می‌شود نیز با افزودن یک دونقطه و سپس یک مشخص‌کننده‌ی قالب قابل کنترل است. برای مثال:

>>> # Field 0: left justify, pad to 15 characters
>>> # Field 1: right justify, pad to 6 characters
>>> fmt = '{0:15} ${1:>6}'
>>> fmt.format('Registration', 35)
'Registration    $    35'
>>> fmt.format('Tutorial', 50)
'Tutorial        $    50'
>>> fmt.format('Banquet', 125)
'Banquet         $   125'

مشخص‌کننده‌های قالب می‌توانند از طریق تودرتو کردن به فیلدهای دیگر ارجاع دهند:

>>> fmt = '{0:{1}}'
>>> width = 15
>>> fmt.format('Invoice #1234', width)
'Invoice #1234  '
>>> width = 35
>>> fmt.format('Invoice #1234', width)
'Invoice #1234                      '

می‌توان ترازبندی فیلد را درون عرض موردنظر مشخص کرد:

نویسه

اثر

< (پیش‌فرض)

چپ‌چین

>

راست‌چین

^

وسط

=

(فقط برای نوع‌های عددی) پر کردن پس از علامت.

مشخص‌کننده‌های قالب می‌توانند شامل یک نوع ارائه نیز باشند که نحوه‌ی قالب‌بندی مقدار را کنترل می‌کند. برای مثال، اعداد ممیز شناور می‌توانند به‌صورت یک عدد عمومی یا در نمادگذاری نمایی قالب‌بندی شوند:

>>> '{0:g}'.format(3.75)
'3.75'
>>> '{0:e}'.format(3.75)
'3.750000e+00'

انواع نمایش گوناگونی در دسترس هستند. برای فهرست کامل به مستندات 2.6 مراجعه کنید؛ در اینجا نمونه‌ای آمده است:

b

دودویی. عدد را در مبنای ۲ خروجی می‌دهد.

c

نویسه. عدد صحیح را پیش از چاپ به نویسه‌ی یونیکدِ متناظر تبدیل می‌کند.

d

عدد صحیح مبنای ده. عدد را در مبنای ۱۰ خروجی می‌دهد.

o

قالب مبنای هشت. عدد را در مبنای ۸ خروجی می‌دهد.

x

قالب مبنای شانزده. عدد را در مبنای ۱۶ خروجی می‌دهد و برای ارقام بزرگ‌تر از ۹ از حروف کوچک استفاده می‌کند.

e

نمادگذاری توان. عدد را به‌صورت نماد علمی و با استفاده از حرف 'e' برای نشان دادن توان چاپ می‌کند.

g

قالب عمومی. این قالب عدد را به‌صورت یک عدد با ممیز ثابت چاپ می‌کند، مگر اینکه عدد بیش از حد بزرگ باشد که در این صورت به نماد توانی 'e' تغییر می‌کند.

n

عدد. این همان 'g' (برای اعداد ممیز شناور) یا 'd' (برای اعداد صحیح) است، با این تفاوت که برای درج نویسه‌های جداکننده‌ی مناسب عدد، از تنظیمات locale جاری استفاده می‌کند.

%

درصد. عدد را در ۱۰۰ ضرب می‌کند و در قالب ثابت ('f') نمایش می‌دهد و به دنبال آن علامت درصد می‌آید.

کلاس‌ها و نوع‌ها می‌توانند برای کنترل نحوه‌ی قالب‌بندی خود، متد __format__() را تعریف کنند. این متد یک آرگومان واحد دریافت می‌کند، مشخص‌کننده‌ی قالب:

def __format__(self, format_spec):
    if isinstance(format_spec, unicode):
        return unicode(str(self))
    else:
        return str(self)

همچنین یک تابع توکار format() وجود دارد که یک مقدار منفرد را قالب‌بندی می‌کند. این تابع متد __format__() نوع را با مشخص‌کننده‌ی ارائه‌شده فراخوانی می‌کند:

>>> format(75.6564, '.2f')
'75.66'

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

سینتکس رشته قالب

مستندات مرجع برای فیلدهای قالب‌بندی.

PEP 3101 - قالب‌بندی پیشرفته‌ی رشته

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

PEP 3105: print به‌عنوان یک تابع

دستور print در پایتون 3.0 به تابع print() تبدیل می‌شود. تبدیل print() به تابع، این امکان را فراهم می‌کند که بتوان تابع را با نوشتن def print(...) یا ایمپورت کردن تابع جدیدی از جای دیگری جایگزین کرد.

پایتون 2.6 یک ایمپورت __future__ دارد که print را به‌عنوان سینتکس زبان حذف می‌کند و به شما اجازه می‌دهد به‌جای آن از شکل تابعی استفاده کنید. برای مثال:

>>> from __future__ import print_function
>>> print('# of entries', len(dictionary), file=sys.stderr)

امضای تابع جدید به این صورت است:

def print(*args, sep=' ', end='\n', file=None)

پارامترها عبارتند از:

  • args: آرگومان‌های جایگاهی که مقادیر آن‌ها چاپ می‌شوند.

  • sep: جداکننده، که بین آرگومان‌ها چاپ می‌شود.

  • end: متن پایانی که پس از خروجی‌دادن همه‌ی آرگومان‌ها چاپ خواهد شد.

  • file: شیء پرونده‌ای که خروجی به آن فرستاده می‌شود.

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

PEP 3105 - تبدیل print به یک تابع

PEP نوشته‌شده توسط Georg Brandl.

PEP 3110: تغییرات در مدیریت استثناها

یکی از خطاهایی که برنامه‌نویسان پایتون گاهی مرتکب می‌شوند، نوشتن کد زیر است:

try:
    ...
except TypeError, ValueError:  # Wrong!
    ...

نویسنده احتمالاً سعی دارد هم استثنای TypeError و هم استثنای ValueError را بگیرد، اما این کد در واقع کاری متفاوت انجام می‌دهد: استثنای TypeError را می‌گیرد و شیء استثنای حاصل را به نام محلی "ValueError" مقید می‌کند. استثنای ValueError اصلاً گرفته نخواهد شد. کد صحیح یک تاپل از استثناها را مشخص می‌کند:

try:
    ...
except (TypeError, ValueError):
    ...

این خطا به این دلیل رخ می‌دهد که استفاده از ویرگول در اینجا مبهم است: آیا نشان‌دهنده‌ی دو گره‌ی متفاوت در درخت تجزیه است، یا یک گره‌ی تکی که یک تاپل است؟

پایتون 3.0 با جایگزین کردن ویرگول با واژه‌ی «as»، این موضوع را بدون ابهام می‌کند. برای گرفتن یک استثنا و ذخیره کردن شیء استثنا در متغیر exc، باید بنویسید:

try:
    ...
except TypeError as exc:
    ...

پایتون 3.0 فقط از استفاده‌ی «as» پشتیبانی خواهد کرد و بنابراین مثال اول را به‌عنوان گرفتن دو استثنای متفاوت تفسیر می‌کند. پایتون 2.6 هم از ویرگول و هم از «as» پشتیبانی می‌کند، در نتیجه کدهای موجود همچنان کار خواهند کرد. بنابراین پیشنهاد می‌کنیم هنگام نوشتن کد جدید پایتون که فقط با 2.6 اجرا خواهد شد، از «as» استفاده کنید.

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

PEP 3110 - گرفتن استثناها در Python 3000

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

PEP 3112: مقادیر لفظی بایت

پایتون 3.0 یونیکد را به عنوان نوع رشته‌ی بنیادی زبان می‌پذیرد و مقادیر لفظی ۸-بیتی را به گونه‌ای متفاوت نشان می‌دهد، یا به صورت b'string' یا با استفاده از سازنده‌ی bytes. برای سازگاری با آینده، پایتون 2.6 کلاس bytes را به عنوان مترادفی برای نوع str اضافه می‌کند و همچنین از نماد b'' پشتیبانی می‌کند.

کلاس str در 2.6 با نوع bytes در 3.0 از جهات مختلفی متفاوت است؛ مهم‌تر از همه، سازنده به‌کلی متفاوت است. در 3.0، bytes([65, 66, 67]) طولی برابر با ۳ عنصر دارد و بایت‌های نمایانگر ABC را در بر می‌گیرد؛ در 2.6، bytes([65, 66, 67]) رشته‌ی ۱۲ بایتی را برمی‌گرداند که نمایانگر str() فهرست است.

کاربرد اصلی bytes در نسخه 2.6، نوشتن آزمون‌های نوع شیء مانند isinstance(x, bytes) خواهد بود. این کار به مبدل 2to3 کمک خواهد کرد؛ مبدلی که نمی‌تواند تشخیص دهد کد 2.x قصد دارد رشته‌ها حاوی نویسه‌ها باشند یا بایت‌های ۸ بیتی؛ اکنون می‌توانید از bytes یا str برای نمایش دقیق منظور خود استفاده کنید و کد حاصل در پایتون 3.0 نیز درست خواهد بود.

یک ایمپورت __future__ نیز وجود دارد که باعث می‌شود تمام مقادیر لفظی رشته به رشته‌های یونیکد تبدیل شوند. این بدان معناست که می‌توان از دنباله‌های خنثی‌سازی \u برای گنجاندن نویسه‌های یونیکد استفاده کرد:

from __future__ import unicode_literals

s = ('\u751f\u3080\u304e\u3000\u751f\u3054'
     '\u3081\u3000\u751f\u305f\u307e\u3054')

print len(s)               # 12 Unicode characters

در سطح C، پایتون 3.0 نام نوع رشته‌ی هشت‌بیتی موجود را که در پایتون 2.x PyStringObject نامیده می‌شود، به PyBytesObject تغییر خواهد داد. پایتون 2.6 از #define استفاده می‌کند تا از به‌کارگیری نام‌های PyBytesObject()، PyBytes_Check()، PyBytes_FromStringAndSize() و تمام توابع و ماکروهای دیگری که با رشته‌ها به کار می‌روند پشتیبانی کند.

نمونه‌های نوع bytes درست مانند رشته‌ها تغییرناپذیر هستند. نوع جدید bytearray یک دنباله تغییرپذیر از بایت‌ها را ذخیره می‌کند:

>>> bytearray([65, 66, 67])
bytearray(b'ABC')
>>> b = bytearray(u'\u21ef\u3244', 'utf-8')
>>> b
bytearray(b'\xe2\x87\xaf\xe3\x89\x84')
>>> b[0] = '\xe3'
>>> b
bytearray(b'\xe3\x87\xaf\xe3\x89\x84')
>>> unicode(str(b), 'utf-8')
u'\u31ef \u3244'

آرایه‌های بایت از بیشتر متدهای نوع‌های رشته‌ای پشتیبانی می‌کنند، مانند startswith()/endswith() و find()/rfind()، و همچنین از برخی متدهای فهرست‌ها، مانند append()، pop() و reverse().

>>> b = bytearray('ABC')
>>> b.append('d')
>>> b.append(ord('e'))
>>> b
bytearray(b'ABCde')

همچنین یک API متناظر برای C وجود دارد که شامل PyByteArray_FromObject()، PyByteArray_FromStringAndSize() و توابع مختلف دیگری است.

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

PEP 3112 - مقادیر لفظی بایت در پایتون ۳۰۰۰

PEP توسط Jason Orendorff نوشته شده است؛ Christian Heimes آن را به نسخه 2.6 بک‌پورت کرده است.

PEP 3116: کتابخانه جدید ورودی/خروجی

شیءهای پرونده‌ی توکار پایتون از تعدادی متد پشتیبانی می‌کنند، اما شیءهای شبه‌پرونده لزوماً از همه‌ی آن‌ها پشتیبانی نمی‌کنند. شیءهایی که پرونده‌ها را تقلید می‌کنند معمولاً از read() و write() پشتیبانی می‌کنند، اما ممکن است مثلاً از readline() پشتیبانی نکنند. پایتون 3.0 یک کتابخانه‌ی ورودی/خروجی لایه‌ای را در ماژول io معرفی می‌کند که قابلیت‌های بافر کردن و پردازش متن را از عملیات بنیادی خواندن و نوشتن جدا می‌کند.

سه سطح از کلاس‌های پایه انتزاعی وجود دارد که توسط ماژول io ارائه شده‌اند:

  • کلاس RawIOBase عملیات ورودی/خروجی خام را تعریف می‌کند: read()، readinto()، write()، seek()، tell()، truncate() و close(). بیشتر متدهای این کلاس اغلب به یک فراخوانی سیستمی واحد نگاشت می‌شوند. همچنین متدهای readable()، writable() و seekable() برای تعیین اینکه یک شیء معین چه عملیات‌هایی را اجازه می‌دهد وجود دارند.

    پایتون 3.0 پیاده‌سازی‌های عینی از این کلاس برای پرونده‌ها و سوکت‌ها دارد، اما پایتون 2.6 اشیاء پرونده و سوکت خود را به این شکل بازساختاردهی نکرده است.

  • BufferedIOBase یک کلاس پایه انتزاعی است که برای کاهش تعداد فراخوانی‌های سیستمی مورد استفاده، داده‌ها را در حافظه بافر می‌کند و پردازش ورودی/خروجی را کارآمدتر می‌سازد. این کلاس از تمام متدهای RawIOBase پشتیبانی می‌کند و ویژگی raw را اضافه می‌کند که شیء خام زیرین را نگه می‌دارد.

    پنج کلاس عینی این کلاس پایه انتزاعی را پیاده‌سازی می‌کنند. BufferedWriter و BufferedReader برای اشیایی هستند که از کاربرد فقط‌نوشتنی یا فقط‌خواندنی پشتیبانی می‌کنند و متد seek() را برای دسترسی تصادفی دارند. اشیای BufferedRandom از دسترسی خواندن و نوشتن روی همان جریان زیرین پشتیبانی می‌کنند، و BufferedRWPair برای اشیایی مانند TTY‌ها است که هر دو عملیات خواندن و نوشتن را روی جریان‌های داده‌ی غیرمتصل دارند. کلاس BytesIO از خواندن، نوشتن و مکان‌یابی روی یک بافر در حافظه پشتیبانی می‌کند.

  • TextIOBase: توابعی برای خواندن و نوشتن رشته‌ها فراهم می‌کند (به یاد داشته باشید که رشته‌ها در پایتون 3.0 یونیکد خواهند بود) و از سطرهای جدید همگانی پشتیبانی می‌کند. TextIOBase متد readline() را تعریف می‌کند و پیمایش بر روی اشیاء را پشتیبانی می‌کند.

    دو پیاده‌سازی عینی وجود دارد. TextIOWrapper یک شیء ورودی/خروجی بافر‌شده را دربر می‌گیرد، از تمام متدهای ورودی/خروجی متنی پشتیبانی می‌کند و ویژگی buffer را برای دسترسی به شیء زیرین می‌افزاید. StringIO به سادگی همه چیز را در حافظه بافر می‌کند و هرگز چیزی را روی دیسک نمی‌نویسد.

    (در پایتون 2.6، io.StringIO به‌صورت خالص در پایتون پیاده‌سازی شده است، در نتیجه بسیار کند است. بنابراین فعلاً باید به ماژول موجود StringIO یا cStringIO پایبند بمانید. در مقطعی، ماژول io پایتون 3.0 برای افزایش سرعت به C بازنویسی خواهد شد و شاید پیاده‌سازی C به نسخه‌های 2.x بک‌پورت شود.)

در پایتون 2.6، پیاده‌سازی‌های زیربنایی بازساختاردهی نشده‌اند تا بر پایه‌ی کلاس‌های ماژول io ساخته شوند. این ماژول ارائه می‌شود تا نوشتن کدی که با 3.0 سازگار رو به جلو باشد، آسان‌تر شود، و تا توسعه‌دهندگان از زحمت نوشتن پیاده‌سازی‌های خودشان برای بافرینگ و ورودی/خروجی متنی بی‌نیاز شوند.

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

PEP 3116 - ورودی/خروجی جدید

PEP را Daniel Stutzbach، Mike Verdone و Guido van Rossum نوشته‌اند. کد را Guido van Rossum، Georg Brandl، Walter Doerwald، Jeremy Hylton، Martin von Löwis، Tony Lownds و دیگران نوشته‌اند.

PEP 3118: پروتکل بافر بازنگری‌شده

پروتکل بافر یک API در سطح C است که به نوع‌های پایتون اجازه می‌دهد اشاره‌گرهایی به درون بازنمایی‌های درونی خود را مبادله کنند. برای مثال، می‌توان یک پرونده نگاشت‌شده در حافظه را به‌عنوان بافری از نویسه‌ها در نظر گرفت، و این امر به ماژول دیگری مانند re اجازه می‌دهد با پرونده‌های نگاشت‌شده در حافظه همچون رشته‌ای از نویسه‌ها برای جستجو رفتار کند.

کاربران اصلی پروتکل بافر، بسته‌های پردازش عددی مانند NumPy هستند که نمایش داخلی آرایه‌ها را در دسترس قرار می‌دهند تا فراخوانندگان به‌جای عبور از یک API کندتر بتوانند داده‌ها را مستقیماً در آرایه بنویسند. این PEP (پیشنهاد بهبود پایتون) پروتکل بافر را با توجه به تجربه‌های به‌دست‌آمده از توسعه NumPy به‌روزرسانی می‌کند و تعدادی قابلیت جدید مانند نشان‌دادن شکل آرایه یا قفل‌کردن ناحیه‌ای از حافظه به آن می‌افزاید.

مهم‌ترین تابع جدید API زبان C، PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags) است که یک شیء و مجموعه‌ای از پرچم‌ها را می‌گیرد و ساختار Py_buffer را با اطلاعاتی درباره‌ی نمایش حافظه‌ی شیء پر می‌کند. اشیاء می‌توانند از این عملیات برای قفل کردن حافظه در جای خود استفاده کنند، در حالی که ممکن است فراخوان‌کننده‌ی بیرونی در حال تغییر محتویات باشد؛ بنابراین PyBuffer_Release(Py_buffer *view) متناظری وجود دارد که نشان می‌دهد کار فراخوان‌کننده‌ی بیرونی تمام شده است.

آرگومان flags در PyObject_GetBuffer() محدودیت‌هایی را بر حافظه‌ی برگردانده‌شده تعیین می‌کند. چند نمونه عبارت‌اند از:

  • PyBUF_WRITABLE نشان می‌دهد که حافظه باید قابل نوشتن باشد.

  • PyBUF_LOCK یک قفل فقط‌خواندنی یا انحصاری روی حافظه را درخواست می‌کند.

  • PyBUF_C_CONTIGUOUS و PyBUF_F_CONTIGUOUS چیدمان آرایه‌ی پیوسته از نوع C (بُعد آخر با بیشترین سرعت تغییر می‌کند) یا پیوسته از نوع Fortran (بُعد اول با بیشترین سرعت تغییر می‌کند) را درخواست می‌کنند.

دو کد آرگومان جدید برای PyArg_ParseTuple()، یعنی s* و z*، برای یک پارامتر اشیاء بافر قفل‌شده برمی‌گردانند.

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

PEP 3118 - بازنگری پروتکل بافر

PEP نوشته‌شده توسط Travis Oliphant و Carl Banks؛ پیاده‌سازی‌شده توسط Travis Oliphant.

PEP 3119: کلاس‌های پایه انتزاعی

برخی از زبان‌های شیءگرا مانند جاوا از رابط‌ها پشتیبانی می‌کنند؛ رابط‌هایی که اعلام می‌کنند یک کلاس مجموعه‌ای مشخص از متدها دارد یا از یک پروتکل دسترسی مشخص پشتیبانی می‌کند. کلاس‌های پایه انتزاعی (یا ABCها) قابلیتی معادل برای پایتون هستند. پشتیبانی از ABC از یک ماژول abc که فراکلاسی به نام ABCMeta را در بر می‌گیرد، برخورد ویژه‌ی این فراکلاس توسط توابع توکار isinstance() و issubclass()، و مجموعه‌ای از ABCهای بنیادی که به نظر توسعه‌دهندگان پایتون به‌طور گسترده مفید خواهند بود، تشکیل شده است. نسخه‌های آینده‌ی پایتون احتمالاً ABCهای بیشتری اضافه خواهند کرد.

فرض کنید کلاس خاصی دارید و می‌خواهید بدانید آیا از دسترسی به سبک دیکشنری پشتیبانی می‌کند یا خیر. با این حال، عبارت «به سبک دیکشنری» مبهم است. احتمالاً منظور این است که دسترسی به آیتم‌ها با obj[1] کار می‌کند. آیا به این معناست که تنظیم آیتم‌ها با obj[2] = value کار می‌کند؟ یا اینکه شیء متدهای keys()، values() و items() خواهد داشت؟ در مورد گونه‌های پیمایشی مانند iterkeys() چه؟ copy() و update() چه؟ پیمایش روی شیء با iter() چه؟

ماژول collections در پایتون 2.6 شامل تعدادی کلاس پایه انتزاعی مختلف است که نمایانگر این تمایز‌ها هستند. Iterable نشان می‌دهد که یک کلاس __iter__() را تعریف می‌کند، و Container به این معناست که کلاس متد __contains__() را تعریف می‌کند و بنابراین از عبارت‌های x in y پشتیبانی می‌کند. رابط پایه دیکشنری، شامل گرفتن آیتم‌ها، تنظیم آیتم‌ها و keys()، values() و items()، توسط کلاس پایه انتزاعی MutableMapping تعریف می‌شود.

می‌توانید کلاس‌های خودتان را از یک کلاس پایه انتزاعی خاص مشتق بگیرید تا نشان دهید که از رابط آن کلاس پایه انتزاعی پشتیبانی می‌کنند:

import collections

class Storage(collections.MutableMapping):
    ...

به‌عنوان جایگزین، می‌توانید کلاس را بدون ارث بردن از کلاس پایه انتزاعی مورد نظر بنویسید و در عوض، با فراخوانی متد register() آن، کلاس را ثبت کنید:

import collections

class Storage:
    ...

collections.MutableMapping.register(Storage)

برای کلاس‌هایی که خودتان می‌نویسید، مشتق‌شدن از کلاس پایه انتزاعی احتمالاً روشن‌تر است. متد register() زمانی مفید است که کلاس پایه انتزاعی جدیدی نوشته باشید که بتواند یک نوع یا کلاس موجود را توصیف کند، یا بخواهید اعلام کنید که کلاسی از شخص ثالث، یک کلاس پایه انتزاعی را پیاده‌سازی می‌کند. برای مثال، اگر کلاس پایه انتزاعی PrintableType را تعریف کرده باشید، انجام این کار مجاز است:

# Register Python's types
PrintableType.register(int)
PrintableType.register(float)
PrintableType.register(str)

کلاس‌ها باید از معناشناسی مشخص‌شده توسط یک کلاس پایه انتزاعی پیروی کنند، اما پایتون نمی‌تواند این موضوع را بررسی کند؛ این بر عهده‌ی نویسنده‌ی کلاس است که الزامات کلاس پایه انتزاعی را درک کند و کد را مطابق با آن پیاده‌سازی کند.

برای بررسی اینکه آیا یک شیء از یک رابط خاص پشتیبانی می‌کند، اکنون می‌توانید بنویسید:

def func(d):
    if not isinstance(d, collections.MutableMapping):
        raise ValueError("Mapping object expected, not %r" % d)

احساس نکنید که اکنون باید مانند مثال بالا شروع به نوشتن بررسی‌های فراوانی کنید. پایتون سنت نیرومندی در نوع‌دهی اردکی دارد؛ سنتی که در آن هرگز بررسی صریح نوع انجام نمی‌شود و کد صرفاً متدهای یک شیء را فراخوانی می‌کند، به این اعتماد که آن متدها وجود دارند و در صورت نبودن آن‌ها استثنا ایجاد می‌کند. در بررسی کلاس‌های پایه انتزاعی سنجیده عمل کنید و تنها در جایی که کاملاً ضروری است این کار را انجام دهید.

می‌توانید با استفاده از abc.ABCMeta به‌عنوان فراکلاس در تعریف کلاس، کلاس‌های پایه انتزاعی خودتان را بنویسید:

from abc import ABCMeta, abstractmethod

class Drawable():
    __metaclass__ = ABCMeta

    @abstractmethod
    def draw(self, x, y, scale=1.0):
        pass

    def draw_doubled(self, x, y):
        self.draw(x, y, scale=2.0)


class Square(Drawable):
    def draw(self, x, y, scale):
        ...

در کلاس پایه انتزاعی Drawable بالا، متد draw_doubled() شیء را با دو برابر اندازه‌اش ترسیم می‌کند و می‌تواند بر اساس دیگر متدهای توصیف‌شده در Drawable پیاده‌سازی شود. بنابراین، کلاس‌هایی که این کلاس پایه انتزاعی را پیاده‌سازی می‌کنند، نیازی ندارند پیاده‌سازی خود را برای draw_doubled() ارائه کنند، هرچند می‌توانند این کار را انجام دهند. با این حال، پیاده‌سازی draw() ضروری است؛ کلاس پایه انتزاعی نمی‌تواند پیاده‌سازی عام مفیدی ارائه دهد.

می‌توانید دکوراتور @~abc.abstractmethod را روی متدهایی مانند draw() که باید پیاده‌سازی شوند اعمال کنید؛ پایتون سپس برای کلاس‌هایی که متد را تعریف نمی‌کنند، استثنایی ایجاد می‌کند. توجه داشته باشید که این استثنا تنها زمانی ایجاد می‌شود که واقعاً سعی کنید نمونه‌ای از یک زیرکلاس فاقد آن متد بسازید:

>>> class Circle(Drawable):
...     pass
...
>>> c = Circle()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class Circle with abstract methods draw
>>>

می‌توان ویژگی‌های داده انتزاعی را با استفاده از دکوراتور @abstractproperty اعلان کرد:

from abc import abstractproperty
...

@abstractproperty
def readonly(self):
   return self._x

سپس زیرکلاس‌ها باید یک پراپرتی readonly تعریف کنند.

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

PEP 3119 - معرفی کلاس‌های پایه انتزاعی

PEP (پیشنهاد بهبود پایتون) توسط Guido van Rossum و Talin نوشته شد. پیاده‌سازی آن توسط Guido van Rossum انجام شد. Benjamin Aranguren آن را با همکاری Alex Martelli به نسخه 2.6 بک‌پورت کرد.

PEP 3127: پشتیبانی و سینتکس مقادیر لفظی عدد صحیح

پایتون 3.0 سینتکس مقادیر لفظی اعداد صحیح هشت‌گانی (مبنای ۸) را تغییر می‌دهد و به جای صفر آغازین، آن‌ها را با پیشوند "0o" یا "0O" مشخص می‌کند؛ همچنین پشتیبانی از مقادیر لفظی اعداد صحیح دودویی (مبنای ۲) را می‌افزاید که با پیشوند "0b" یا "0B" مشخص می‌شوند.

پایتون 2.6 پشتیبانی از صفر ابتدایی به‌عنوان نشان‌دهنده‌ی عدد مبنای هشت را حذف نمی‌کند، اما پشتیبانی از "0o" و "0b" را نیز می‌افزاید:

>>> 0o21, 2*8 + 1
(17, 17)
>>> 0b101111
47

تابع توکار oct() همچنان اعدادی را برمی‌گرداند که با یک صفر ابتدایی پیشوند گرفته‌اند، و تابع توکار جدید bin() نمایش دودویی یک عدد را برمی‌گرداند:

>>> oct(42)
'052'
>>> future_builtins.oct(42)
'0o52'
>>> bin(173)
'0b10101101'

توابع توکار int() و long() اکنون پیشوندهای "0o" و "0b" را می‌پذیرند، هنگامی که مبنای ۸ یا مبنای ۲ درخواست شده باشد، یا هنگامی که آرگومان base صفر باشد (که نشان می‌دهد مبنای استفاده‌شده باید از رشته تعیین شود):

>>> int ('0o52', 0)
42
>>> int('1101', 2)
13
>>> int('0b1101', 2)
13
>>> int('0b1101', 0)
13

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

PEP 3127 - پشتیبانی و سینتکس مقادیر لفظی عدد صحیح

این PEP توسط Patrick Maupin نوشته شده و توسط Eric Smith به نسخه 2.6 بک‌پورت شده است.

PEP 3129: دکوراتورهای کلاس

دکوراتورها از توابع به کلاس‌ها گسترش یافته‌اند. اکنون نوشتنِ زیر مجاز است:

@foo
@bar
class A:
  pass

این معادل است با:

class A:
  pass

A = foo(bar(A))

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

PEP 3129 - دکوراتورهای کلاس

PEP (پیشنهاد بهبود پایتون) نوشته‌شده توسط کالین وینتر.

PEP 3141: سلسله‌مراتب نوع برای اعداد

پایتون 3.0 چندین کلاس پایه انتزاعی برای نوع‌های عددی می‌افزاید که از برج عددی (numeric tower) در Scheme الهام گرفته‌اند. این کلاس‌ها به‌عنوان ماژول numbers به نسخه 2.6 بک‌پورت شدند.

کلی‌ترین کلاس پایه انتزاعی، Number است. این کلاس به‌هیچ‌وجه عملیاتی تعریف نمی‌کند و تنها به این منظور وجود دارد که بتوان با انجام isinstance(obj, Number) بررسی کرد که آیا یک شیء عدد است یا خیر.

Complex زیرکلاسی از Number است. بر روی اعداد مختلط می‌توان عملیات‌های پایه‌ی جمع، تفریق، ضرب، تقسیم و توان‌رسانی را انجام داد و می‌توانید بخش‌های حقیقی و موهومی را بازیابی کنید و مزدوج یک عدد را به دست آورید. نوع مختلط توکار پایتون پیاده‌سازی‌ای از Complex است.

کلاس Real نیز از Complex مشتق می‌شود و عملیاتی را می‌افزاید که تنها روی اعداد حقیقی کار می‌کنند: floor()، trunc()، گرد کردن، گرفتن باقی‌مانده به پیمانه‌ی N، تقسیم کف و مقایسه‌ها.

اعداد Rational از Real مشتق می‌شوند، ویژگی‌های numerator و denominator را دارند و می‌توان آن‌ها را به عدد اعشاری تبدیل کرد. پایتون 2.6 یک کلاس ساده‌ی عدد گویا، یعنی Fraction، در ماژول fractions اضافه می‌کند. (نام این کلاس به‌جای Rational، Fraction انتخاب شده است تا از تداخل نام با numbers.Rational جلوگیری شود.)

اعداد Integral از Rational برگرفته می‌شوند و می‌توان آن‌ها را با << و >> به چپ و راست شیفت داد، با استفاده از عملیات بیتی مانند & و | ترکیب کرد، و از آن‌ها به‌عنوان اندیس‌های آرایه و مرزهای اسلایس استفاده کرد.

در پایتون 3.0، این PEP توابع توکار موجود round()، math.floor() و math.ceil() را کمی بازتعریف می‌کند و تابع جدیدی به نام math.trunc() می‌افزاید که به پایتون 2.6 بک‌پورت شده است. math.trunc() به سمت صفر گرد می‌کند و نزدیک‌ترین Integral را که بین آرگومان تابع و صفر قرار دارد، برمی‌گرداند.

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

PEP 3141 - سلسله‌مراتب نوع برای اعداد

PEP (پیشنهاد بهبود پایتون) نوشته‌شده توسط جفری یاسکین.

برج عددی (numerical tower) Scheme، از راهنمای Guile.

نوع‌های داده‌ی عددی Scheme از مشخصات R5RS Scheme.

ماژول fractions

برای تکمیل سلسله‌مراتب نوع‌های عددی، ماژول fractions یک کلاس اعداد گویا فراهم می‌کند. اعداد گویا مقادیر خود را در قالب صورت و مخرجی که کسری را تشکیل می‌دهند ذخیره می‌کنند و می‌توانند اعدادی مانند 2/3 را که اعداد ممیز شناور تنها می‌توانند تقریبشان بزنند، دقیقاً بازنمایی کنند.

سازنده‌ی Fraction دو مقدار Integral را می‌گیرد که صورت و مخرج کسر حاصل خواهند بود.

>>> from fractions import Fraction
>>> a = Fraction(2, 3)
>>> b = Fraction(2, 5)
>>> float(a), float(b)
(0.66666666666666663, 0.40000000000000002)
>>> a+b
Fraction(16, 15)
>>> a/b
Fraction(5, 3)

برای تبدیل اعداد ممیز شناور به اعداد گویا، نوع float اکنون متد as_integer_ratio() را دارد که صورت و مخرج کسری را برمی‌گرداند که مقدار آن به همان مقدار ممیز شناور ارزیابی می‌شود:

>>> (2.5) .as_integer_ratio()
(5, 2)
>>> (3.1415) .as_integer_ratio()
(7074029114692207L, 2251799813685248L)
>>> (1./3) .as_integer_ratio()
(6004799503160661L, 18014398509481984L)

توجه داشته باشید که مقادیری که تنها می‌توان آن‌ها را با اعداد ممیز شناور تقریب کرد، مانند 1./3، به عدد مورد تقریب ساده نمی‌شوند؛ کسر تلاش می‌کند دقیقاً با مقدار ممیز شناور مطابقت کند.

ماژول fractions بر پایه‌ی پیاده‌سازی Sjoerd Mullender است که مدت‌ها در پوشه‌ی Demo/classes/ پایتون قرار داشت. این پیاده‌سازی توسط Jeffrey Yasskin به‌طور قابل‌توجهی به‌روزرسانی شد.

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

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

  • پوشه‌ها و آرشیوهای zip که حاوی پرونده‌ی __main__.py هستند، اکنون می‌توانند مستقیماً با ارسال نامشان به مفسر اجرا شوند. پوشه یا آرشیو zip به‌طور خودکار به‌عنوان اولین ورودی در sys.path درج می‌شود. (پیشنهاد و وصل اولیه توسط Andy Chu، که سپس توسط Phillip J. Eby و Nick Coghlan بازنگری شد؛ bpo-1739468.)

  • تابع hasattr() تمام خطاها را می‌گرفت و نادیده می‌گرفت، با این فرض که آن‌ها به این معنا بودند که متد __getattr__() به‌نحوی شکست می‌خورد و بنابراین مقدار بازگشتی hasattr() False خواهد بود. اما این منطق نباید به KeyboardInterrupt و SystemExit اعمال شود؛ پایتون 2.6 دیگر چنین استثناهایی را هنگامی که hasattr() با آن‌ها روبه‌رو می‌شود، دور نمی‌ریزد. (توسط Benjamin Peterson اصلاح شد؛ bpo-2196.)

  • هنگام فراخوانی یک تابع با استفاده از سینتکس ** برای ارائه‌ی آرگومان‌های کلیدواژه‌ای، دیگر لازم نیست از یک دیکشنری پایتون استفاده کنید؛ اکنون هر نگاشتی کار خواهد کرد:

    >>> def f(**kw):
    ...    print sorted(kw)
    ...
    >>> ud=UserDict.UserDict()
    >>> ud['a'] = 1
    >>> ud['b'] = 'string'
    >>> f(**ud)
    ['a', 'b']
    

    (مشارکت‌شده توسط Alexander Belopolsky؛ bpo-1686487.)

    همچنین ارائه‌دادن آرگومان‌های کلیدواژه‌ای پس از آرگومان *args در فراخوانی تابع، مجاز شده است.

    >>> def f(*args, **kw):
    ...     print args, kw
    ...
    >>> f(1,2,3, *(4,5,6), keyword=13)
    (1, 2, 3, 4, 5, 6) {'keyword': 13}
    

    پیش‌تر این یک خطای سینتکس محسوب می‌شد. (با مشارکت Amaury Forgeot d'Arc؛ bpo-3473.)

  • یک تابع توکار جدید، next(iterator, [default])، آیتم بعدی را از پیمایش‌گر مشخص‌شده برمی‌گرداند. اگر آرگومان default ارائه شود، در صورتی که iterator به پایان رسیده باشد، مقدار پیش‌فرض بازگردانده خواهد شد؛ در غیر این صورت، استثنای StopIteration raise خواهد شد. (در bpo-2719 بک‌پورت شده است.)

  • تاپل‌ها اکنون متدهای index() و count() دارند که با متدهای index() و count() نوع فهرست منطبق هستند:

    >>> t = (0,1,2,3,4,0,1,2)
    >>> t.index(3)
    3
    >>> t.count(0)
    2
    

    (مشارکت‌شده توسط Raymond Hettinger)

  • نوع‌های توکار اکنون پشتیبانی بهتری از سینتکس اسلایس‌دهی توسعه‌یافته دارند و ترکیب‌های مختلفی از (start, stop, step) را می‌پذیرند. پیش از این، این پشتیبانی ناقص بود و برخی حالت‌های خاص کار نمی‌کردند. (پیاده‌سازی‌شده توسط Thomas Wouters.)

  • پراپرتی‌ها اکنون سه دکوراتور دارند، @~property.getter، @~property.setter و @~property.deleter، که دکوراتورهایی هستند و میان‌برهای مفیدی برای افزودن تابع getter، setter یا deleter به یک پراپرتی موجود فراهم می‌کنند. شما آن‌ها را به این صورت استفاده می‌کنید:

    class C(object):
        @property
        def x(self):
            return self._x
    
        @x.setter
        def x(self, value):
            self._x = value
    
        @x.deleter
        def x(self):
            del self._x
    
    class D(C):
        @C.x.getter
        def x(self):
            return self._x * 2
    
        @x.setter
        def x(self, value):
            self._x = value / 2
    
  • چندین متد از نوع‌های توکار مجموعه اکنون چندین شیء پیمایش‌پذیر را می‌پذیرند: intersection()، intersection_update()، union()، update()، difference() و difference_update().

    >>> s=set('1234567890')
    >>> s.intersection('abc123', 'cdf246')  # Intersection between all inputs
    set(['2'])
    >>> s.difference('246', '789')
    set(['1', '0', '3', '5'])
    

    (مشارکت توسط Raymond Hettinger.)

  • قابلیت‌های ممیز شناور بسیاری اضافه شدند. تابع float() اکنون رشته‌ی nan را به یک مقدار «عدد نیست» (Not A Number) مطابق IEEE 754، و +inf و -inf را به بی‌نهایت مثبت یا منفی تبدیل می‌کند. این قابلیت روی هر پلتفرمی با معناشناسی IEEE 754 کار می‌کند. (مشارکت‌کرده توسط کریستین هایمز؛ bpo-1635.)

    سایر توابع در ماژول math، یعنی isinf() و isnan()، در صورتی که آرگومان ممیز شناور آن‌ها بی‌نهایت یا NaN باشد، مقدار true را برمی‌گردانند. (bpo-1640)

    توابع تبدیل برای تبدیل اعداد ممیز شناور به رشته‌های مبنای شانزده افزوده شدند (bpo-3008). این توابع اعداد اعشاری را به نمایش رشته‌ای و بالعکس تبدیل می‌کنند، بدون آنکه خطاهای گرد کردن ناشی از تبدیل بین دهدهی و دودویی ایجاد شود. اعداد اعشاری متد hex() دارند که یک نمایش رشته‌ای برمی‌گرداند، و متد float.fromhex() یک رشته را دوباره به عدد تبدیل می‌کند:

    >>> a = 3.75
    >>> a.hex()
    '0x1.e000000000000p+1'
    >>> float.fromhex('0x1.e000000000000p+1')
    3.75
    >>> b=1./3
    >>> b.hex()
    '0x1.5555555555555p-2'
    
  • یک ظرافت عددی: هنگام ایجاد یک عدد مختلط از دو عدد اعشاری روی سیستم‌هایی که از صفرهای علامت‌دار (-0 و +0) پشتیبانی می‌کنند، سازنده‌ی complex() اکنون علامت صفر را حفظ می‌کند. (اصلاح‌شده توسط Mark T. Dickinson؛ bpo-1507.)

  • کلاس‌هایی که متد __hash__() را از یک کلاس والد به ارث می‌برند، می‌توانند __hash__ = None را تنظیم کنند تا نشان دهند که کلاس هش‌پذیر نیست. این کار باعث می‌شود hash(obj) یک TypeError ایجاد کند و کلاس به‌عنوان پیاده‌کننده‌ی کلاس پایه انتزاعی Hashable نشان داده نخواهد شد.

    شما باید این کار را زمانی انجام دهید که متد __cmp__() یا __eq__() را تعریف کرده باشید که اشیاء را بر اساس مقدارشان و نه بر اساس هویت مقایسه می‌کند. همه‌ی اشیاء یک متد هش پیش‌فرض دارند که از id(obj) به‌عنوان مقدار هش استفاده می‌کند. هیچ راه تمیزی برای حذف متد __hash__() به ارث رسیده از کلاس والد وجود ندارد، بنابراین انتساب None به‌عنوان یک بازنویسی پیاده‌سازی شد. در سطح C، ماژول‌های توسعه‌ای می‌توانند tp_hash را روی PyObject_HashNotImplemented() تنظیم کنند. (برطرف شده توسط Nick Coghlan و Amaury Forgeot d'Arc؛ bpo-2235.)

  • استثنای GeneratorExit اکنون به جای Exception، زیرکلاسِ BaseException است. این بدان معناست که هندلر استثنایی که except Exception: می‌نویسد، ناخواسته GeneratorExit را نمی‌گیرد. (ارائه‌شده توسط چاد آستین؛ bpo-1537.)

  • اشیاء تولیدگر اکنون ویژگی gi_code را دارند که به شیء کد اصلیِ زیربنای تولیدگر ارجاع می‌کند. (مشارکت‌شده توسط Collin Winter؛ bpo-1473257.)

  • تابع توکار compile() اکنون علاوه بر پارامترهای جایگاهی، آرگومان‌های کلیدواژه‌ای را نیز می‌پذیرد. (با مشارکت Thomas Wouters؛ bpo-1444529.)

  • سازنده‌ی complex() اکنون رشته‌های حاوی اعداد مختلط داخل پرانتز را می‌پذیرد، به این معنا که complex(repr(cplx)) اکنون مقادیر را به‌طور رفت‌وبرگشتی (round-trip) حفظ می‌کند. برای مثال، complex('(3+4j)') اکنون مقدار (3+4j) را برمی‌گرداند. (bpo-1491866)

  • متد translate() رشته اکنون None را به‌عنوان پارامتر جدول ترجمه می‌پذیرد که همچون تبدیل همانی در نظر گرفته می‌شود. این امر انجام عملیاتی را که تنها نویسه‌ها را حذف می‌کنند، آسان‌تر می‌سازد. (مشارکت‌شده توسط Bengt Richter و پیاده‌سازی‌شده توسط Raymond Hettinger؛ bpo-1193128.)

  • تابع توکار dir() اکنون وجود متد __dir__() را روی اشیایی که دریافت می‌کند بررسی می‌کند. این متد باید فهرستی از رشته‌ها را برگرداند که نام ویژگی‌های معتبر شیء را در بر دارند و به شیء اجازه می‌دهد مقداری را که dir() تولید می‌کند کنترل کند. اشیایی که متدهای __getattr__() یا __getattribute__() دارند، می‌توانند از این برای اعلام شبه‌ویژگی‌هایی که پشتیبانی خواهند کرد استفاده کنند. (bpo-1591665)

  • اشیاء متد نمونه ویژگی‌های جدیدی برای شیء و تابعی که متد را تشکیل می‌دهند دارند؛ مترادف جدید برای im_self برابر __self__ است و im_func نیز به‌صورت __func__ در دسترس است. نام‌های قدیمی هنوز در Python 2.6 پشتیبانی می‌شوند، اما در 3.0 حذف شده‌اند.

  • تغییری مبهم: وقتی از تابع locals() درون دستور class استفاده می‌کنید، دیکشنری حاصل دیگر متغیرهای آزاد را برنمی‌گرداند. (متغیرهای آزاد، در این حالت، متغیرهایی هستند که در دستور class به آن‌ها ارجاع داده می‌شود اما ویژگی‌های کلاس نیستند.)

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

  • ماژول warnings در C بازنویسی شده است. این امر امکان فراخوانی هشدارها از پارسر را فراهم می‌کند و ممکن است راه‌اندازی مفسر را نیز سریع‌تر سازد. (با مشارکت Neal Norwitz و Brett Cannon؛ bpo-1631171.)

  • اشیاء نوع اکنون نهانگاهی از متدها دارند که می‌تواند کار لازم برای یافتن پیاده‌سازی متد درست برای یک کلاس خاص را کاهش دهد؛ پس از ذخیره‌شدن در نهانگاه، مفسر برای تشخیص متد درست جهت فراخوانی نیازی به پیمایش کلاس‌های پایه ندارد. در صورت تغییر یک کلاس پایه یا خودِ کلاس، نهانگاه پاک می‌شود؛ بنابراین نهانگاه حتی در برابر ماهیت پویای پایتون نیز باید درست باقی بماند. (بهینه‌سازی اصلی توسط Armin Rigo پیاده‌سازی شده و برای پایتون 2.6 توسط Kevin Jacobs به‌روزرسانی شده است؛ bpo-1700288.)

    به‌طور پیش‌فرض، این تغییر فقط بر نوع‌هایی اعمال می‌شود که همراه با هسته پایتون عرضه می‌شوند. ماژول‌های توسعه‌ای لزوماً با این نهانگاه سازگار نیستند، بنابراین برای فعال‌سازی نهانگاه متد باید به‌طور صریح Py_TPFLAGS_HAVE_VERSION_TAG را به فیلد tp_flags ماژول اضافه کنند. (برای سازگاری با نهانگاه متد، کد ماژول توسعه‌ای نباید مستقیماً به عضو tp_dict هیچ‌یک از نوع‌هایی که پیاده‌سازی می‌کند دسترسی پیدا کند و آن را تغییر دهد. بیشتر ماژول‌ها این کار را انجام نمی‌دهند، اما تشخیص این موضوع برای مفسر پایتون غیرممکن است. برای بحثی در این باره، bpo-1878 را ببینید.)

  • فراخوانی توابعی که از آرگومان‌های کلیدواژه‌ای استفاده می‌کنند، با انجام یک مقایسه سریع اشاره‌گر، به‌طور چشمگیری سریع‌تر می‌شوند و معمولاً زمان یک مقایسه کامل رشته را ذخیره می‌کنند. (ارائه‌شده توسط Raymond Hettinger، پس از پیاده‌سازی اولیه‌ای از سوی Antoine Pitrou؛ bpo-1819.)

  • تمامی توابع ماژول struct به لطف کارهای انجام‌شده در اسپرینت Need For Speed به زبان C بازنویسی شده‌اند. (مشارکت‌شده توسط Raymond Hettinger.)

  • برخی از نوع‌های توکار استاندارد اکنون بیتی را در شیءهای نوع خود تنظیم می‌کنند. این کار بررسی اینکه آیا یک شیء زیرکلاسِ یکی از این نوع‌هاست را سریع‌تر می‌کند. (مشارکت توسط Neal Norwitz.)

  • رشته‌های یونیکد اکنون برای تشخیص فضای سفید و شکست خط از کد سریع‌تری استفاده می‌کنند؛ این امر متد split() را حدود ۲۵٪ و splitlines() را ۳۵٪ سریع‌تر می‌کند. (مشارکت‌شده توسط آنتوان پی‌ترو.) مصرف حافظه با استفاده از pymalloc برای داده‌های رشته‌ی یونیکد کاهش یافته است.

  • دستور with اکنون متد __exit__() را روی پشته ذخیره می‌کند که باعث افزایش کوچکی در سرعت می‌شود. (پیاده‌سازی‌شده توسط Jeffrey Yasskin.)

  • برای کاهش مصرف حافظه، زباله‌روب اکنون هنگام زباله‌روبی بالاترین نسل اشیاء، فهرست‌های آزاد (free list) داخلی را خالی می‌کند. این کار ممکن است حافظه را زودتر به سیستم‌عامل بازگرداند.

تغییرات مفسر

دو گزینه‌ی خط فرمان برای استفاده توسط پیاده‌سازی‌های دیگر پایتون رزرو شده‌اند. سوییچ -J برای استفاده توسط Jython برای گزینه‌های خاص Jython، مانند سوییچ‌هایی که به JVM زیرین پاس داده می‌شوند، رزرو شده است. گزینه‌ی -X برای گزینه‌های خاص یک پیاده‌سازی معین از پایتون مانند سی‌پایتون، Jython یا IronPython رزرو شده است. اگر هر یک از این دو گزینه با پایتون 2.6 استفاده شود، مفسر گزارش می‌دهد که این گزینه در حال حاضر استفاده نمی‌شود.

اکنون می‌توان با ارسال سوییچ -B به مفسر پایتون، یا با تنظیم متغیر محیطی PYTHONDONTWRITEBYTECODE پیش از اجرای مفسر، از نوشتن پرونده‌های .pyc یا .pyo توسط پایتون جلوگیری کرد. این تنظیم به‌صورت متغیر sys.dont_write_bytecode برای برنامه‌های پایتون در دسترس است و کد پایتون می‌تواند با تغییر مقدار آن، رفتار مفسر را تغییر دهد. (مشارکت‌شده توسط نیل نورویتز و گئورگ برندل.)

کدگذاری استفاده‌شده برای ورودی استاندارد، خروجی و خطای استاندارد را می‌توان با تنظیم متغیر محیطی PYTHONIOENCODING پیش از اجرای مفسر مشخص کرد. مقدار آن باید رشته‌ای به شکل <encoding> یا <encoding>:<errorhandler> باشد. بخش کدگذاری نام کدگذاری را مشخص می‌کند، برای مثال utf-8 یا latin-1؛ بخش اختیاری هندلر خطا مشخص می‌کند که با نویسه‌هایی که کدگذاری قادر به مدیریت آن‌ها نیست چه باید کرد، و باید یکی از "error"، "ignore" یا "replace" باشد. (با مشارکت Martin von Löwis.)

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

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

  • ماژول‌های asyncore و asynchat بار دیگر به‌طور فعال نگهداری می‌شوند و تعدادی وصل و رفع اشکال روی آن‌ها اعمال شد. (نگهداری‌شده توسط Josiah Carlson؛ برای یکی از وصل‌ها به bpo-1736190 مراجعه کنید.)

  • ماژول bsddb نیز نگهدارنده‌ی جدیدی به نام Jesús Cea Avión دارد و این بسته اکنون به‌صورت یک بسته‌ی مستقل در دسترس است. صفحه‌ی وب این بسته www.jcea.es/programacion/pybsddb.htm است. برنامه این است که این بسته در پایتون 3.0 از کتابخانه‌ی استاندارد حذف شود، زیرا نسخه‌های آن بسیار بیشتر از پایتون منتشر می‌شوند.

    ماژول bsddb.dbshelve اکنون از بالاترین پروتکل پیکل‌سازی موجود استفاده می‌کند، به‌جای اینکه خود را به پروتکل ۱ محدود کند. (ارائه‌شده توسط W. Barnes.)

  • ماژول cgi اکنون متغیرها را از رشته پرس‌وجو (query string) یک درخواست HTTP POST می‌خواند. این امر باعث می‌شود بتوان از اکشن‌های فرم با URL‌هایی مانند «/cgi-bin/add.py?category=1» که شامل رشته‌های پرس‌وجو هستند استفاده کرد. (با مشارکت Alexandre Fiori و Nubis؛ bpo-1817.)

    توابع parse_qs() و parse_qsl() از ماژول cgi به ماژول urlparse منتقل شده‌اند. نسخه‌هایی که هنوز در ماژول cgi در دسترس هستند، در 2.6 پیام‌های PendingDeprecationWarning ایجاد خواهند کرد (bpo-600362).

  • ماژول cmath با مشارکت Mark Dickinson و Christian Heimes دستخوش بازنگری گسترده‌ای شد. پنج تابع جدید افزوده شد:

    • polar() یک عدد مختلط را به فرم قطبی تبدیل می‌کند و مدول و آرگومان عدد مختلط را برمی‌گرداند.

    • rect() عکس این کار را انجام می‌دهد و یک جفت مدولوس (modulus) و آرگومان را دوباره به عدد مختلط متناظر تبدیل می‌کند.

    • phase() آرگومان (که زاویه نیز نامیده می‌شود) یک عدد مختلط را برمی‌گرداند.

    • isnan() در صورتی که بخش حقیقی یا موهومی آرگومان آن NaN باشد، True برمی‌گرداند.

    • isinf() در صورتی که هر یک از بخش حقیقی یا موهومی آرگومان آن بی‌نهایت باشد، مقدار True را برمی‌گرداند.

    این بازنگری‌ها همچنین صحت عددی ماژول cmath را بهبود بخشیدند. برای همه‌ی توابع، بخش‌های حقیقی و موهومی نتایج، هرگاه ممکن باشد، تا حد چند واحد کمترین دقت (ulps) دقیق هستند. برای جزئیات به bpo-1381 مراجعه کنید. اسلایس‌های شاخه‌ی asinh()، atanh() و atan() نیز اصلاح شده‌اند.

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

    در پلتفرم‌های IEEE 754، ماژول cmath اکنون مقادیر ویژه‌ی IEEE 754 و استثناهای ممیز شناور را به شکلی سازگار با پیوست «G» استاندارد C99 مدیریت می‌کند.

  • یک نوع داده‌ی جدید در ماژول collections: namedtuple(typename, fieldnames) یک تابع کارخانه‌ای است که زیرکلاس‌هایی از تاپل استاندارد می‌سازد که فیلدهای آن‌ها با نام و همچنین با اندیس قابل دسترسی هستند. برای نمونه:

    >>> var_type = collections.namedtuple('variable',
    ...             'id name type size')
    >>> # Names are separated by spaces or commas.
    >>> # 'id, name, type, size' would also work.
    >>> var_type._fields
    ('id', 'name', 'type', 'size')
    
    >>> var = var_type(1, 'frequency', 'int', 4)
    >>> print var[0], var.id    # Equivalent
    1 1
    >>> print var[2], var.type  # Equivalent
    int int
    >>> var._asdict()
    {'size': 4, 'type': 'int', 'id': 1, 'name': 'frequency'}
    >>> v2 = var._replace(name='amplitude')
    >>> v2
    variable(id=1, name='amplitude', type='int', size=4)
    

    چندین جای کتابخانه استاندارد که تاپل برمی‌گرداندند، به‌گونه‌ای تغییر کرده‌اند که نمونه‌های namedtuple() را برگردانند. برای مثال، متد decimal.Decimal.as_tuple() اکنون یک تاپل نام‌دار با فیلد‌های sign، digits و exponent برمی‌گرداند.

    (مشارکت توسط Raymond Hettinger.)

  • تغییر دیگر در ماژول collections این است که نوع deque اکنون از پارامتر اختیاری maxlen پشتیبانی می‌کند؛ در صورت ارائه، اندازه‌ی صف دوطرفه به حداکثر maxlen آیتم محدود خواهد شد. افزودن آیتم‌های بیشتر به صف دوطرفه‌ی پُر باعث می‌شود آیتم‌های قدیمی دور ریخته شوند.

    >>> from collections import deque
    >>> dq=deque(maxlen=3)
    >>> dq
    deque([], maxlen=3)
    >>> dq.append(1); dq.append(2); dq.append(3)
    >>> dq
    deque([1, 2, 3], maxlen=3)
    >>> dq.append(4)
    >>> dq
    deque([2, 3, 4], maxlen=3)
    

    (مشارکت توسط Raymond Hettinger.)

  • اشیاء Morsel ماژول Cookie اکنون از ویژگی httponly پشتیبانی می‌کنند. در برخی مرورگرها، کوکی‌هایی که این ویژگی در آن‌ها تنظیم‌شده باشد، توسط کد JavaScript قابل دسترسی یا دستکاری نیستند. (مشارکت‌شده توسط Arvin Schnell؛ bpo-1638033.)

  • متد جدید پنجره در ماژول curses، chgat()، ویژگی‌های نمایش تعداد مشخصی نویسه را در یک سطر تغییر می‌دهد. (مشارکت‌شده توسط Fabian Kreutz.)

    # Boldface text starting at y=0,x=21
    # and affecting the rest of the line.
    stdscr.chgat(0, 21, curses.A_BOLD)
    

    کلاس Textbox در ماژول curses.textpad اکنون ویرایش در حالت درج (insert) و همچنین در حالت بازنویسی (overwrite) را پشتیبانی می‌کند. حالت درج با فراهم کردن مقداری درست برای پارامتر insert_mode هنگام ایجاد نمونه‌ی Textbox فعال می‌شود.

  • متدهای strftime() ماژول datetime اکنون از کد قالب‌بندی %f پشتیبانی می‌کنند که به تعداد میکروثانیه‌های موجود در شیء بسط می‌یابد و از سمت چپ تا شش رقم پرشده با صفر است. (مشارکت از Skip Montanaro؛ bpo-1158.)

  • ماژول decimal به نسخه‌ی 1.66 از مشخصات عمومی ده‌دهی به‌روزرسانی شد. قابلیت‌های جدید شامل برخی متدها برای برخی توابع ریاضی پایه مانند exp() و log10() است:

    >>> Decimal(1).exp()
    Decimal("2.718281828459045235360287471")
    >>> Decimal("2.7182818").ln()
    Decimal("0.9999999895305022877376682436")
    >>> Decimal(1000).log10()
    Decimal("3")
    

    متد as_tuple() از اشیاء Decimal اکنون یک تاپل نام‌دار با فیلدهای sign، digits و exponent برمی‌گرداند.

    (پیاده‌سازی توسط Facundo Batista و Mark Dickinson. پشتیبانی از تاپل نام‌دار توسط Raymond Hettinger اضافه شد.)

  • کلاس SequenceMatcher ماژول difflib اکنون تاپل‌های نام‌داری را که نشان‌دهنده‌ی تطبیق‌ها هستند، همراه با ویژگی‌های a، b و size برمی‌گرداند. (مشارکت از Raymond Hettinger.)

  • یک پارامتر اختیاری timeout که مهلت زمانی بر حسب ثانیه را مشخص می‌کند، به سازنده‌ی کلاس ftplib.FTP و متد connect() افزوده شد. (افزوده‌شده توسط Facundo Batista.) همچنین، متدهای storbinary() و storlines() کلاس FTP اکنون یک پارامتر اختیاری callback می‌گیرند که پس از ارسال داده‌ها، با هر بلوک از داده‌ها فراخوانی می‌شود. (مشارکت‌شده توسط Phil Schwartz؛ bpo-1221598.)

  • تابع توکار reduce() در ماژول functools نیز موجود است. در پایتون 3.0، این تابع توکار حذف شده است و reduce() تنها از طریق ماژول functools در دسترس است؛ در حال حاضر هیچ برنامه‌ای برای حذف این تابع توکار در سری 2.x وجود ندارد. (پچ‌شده توسط کریستین هایمز؛ bpo-1739906.)

  • در صورت امکان، ماژول getpass اکنون از /dev/tty برای چاپ پیام اعلان و خواندن رمز عبور استفاده می‌کند و در صورت عدم امکان، به خطای استاندارد و ورودی استاندارد بازمی‌گردد. اگر رمز عبور ممکن است در پایانه بازتاب داده شود، پیش از نمایش اعلان یک هشدار چاپ می‌شود. (مشارکت‌شده توسط Gregory P. Smith.)

  • تابع glob.glob() اکنون می‌تواند نام‌های پرونده‌ی یونیکدی را برگرداند، اگر از یک مسیر یونیکدی استفاده شده باشد و نام‌های پرونده‌ی یونیکدی درون پوشه تطبیق داده شوند. (bpo-1001604)

  • تابع جدیدی در ماژول heapq، merge(iter1, iter2, ...)، هر تعداد پیمایش‌پذیر که داده‌ها را به ترتیب مرتب‌شده برمی‌گردانند را می‌پذیرد و تولیدگر جدیدی برمی‌گرداند که محتویات همه‌ی پیمایش‌گرها را نیز به ترتیب مرتب‌شده برمی‌گرداند. برای مثال:

    >>> list(heapq.merge([1, 3, 5, 9], [2, 8, 16]))
    [1, 2, 3, 5, 8, 9, 16]
    

    تابع جدید دیگر، heappushpop(heap, item)، item را به heap می‌افزاید، سپس کوچک‌ترین آیتم را حذف می‌کند و بازمی‌گرداند. این کار از فراخوانی heappush() و سپس heappop() کارآمدتر است.

    heapq اکنون به‌گونه‌ای پیاده‌سازی شده است که فقط از مقایسه‌ی «کوچک‌تر» استفاده کند، به‌جای مقایسه‌ی «کوچک‌تر یا مساوی» که پیش‌تر از آن استفاده می‌کرد. این کار باعث می‌شود نحوه‌ی استفاده‌ی heapq از یک نوع با متد list.sort() مطابقت داشته باشد. (مشارکت‌شده توسط Raymond Hettinger.)

  • پارامتر اختیاری timeout که مهلت زمانی را بر حسب ثانیه مشخص می‌کند، به سازنده‌های کلاس httplib.HTTPConnection و HTTPSConnection افزوده شد. (افزوده‌شده توسط Facundo Batista.)

  • بیشتر توابع ماژول inspect، مانند getmoduleinfo() و getargs()، اکنون تاپل‌های نام‌دار برمی‌گردانند. علاوه بر رفتار مانند تاپل، به عناصر مقدار بازگشتی می‌توان به‌عنوان ویژگی نیز دسترسی داشت. (مشارکت‌شده توسط Raymond Hettinger.)

    برخی از توابع جدید این ماژول عبارت‌اند از isgenerator()، isgeneratorfunction() و isabstract().

  • ماژول itertools چندین تابع جدید به دست آورد.

    izip_longest(iter1, iter2, ...[, fillvalue]) از هر یک از عناصر تاپل می‌سازد؛ اگر برخی از پیمایش‌پذیرها کوتاه‌تر از بقیه باشند، مقادیر گمشده به fillvalue تنظیم می‌شوند. برای مثال:

    >>> tuple(itertools.izip_longest([1,2,3], [1,2,3,4,5]))
    ((1, 1), (2, 2), (3, 3), (None, 4), (None, 5))
    

    product(iter1, iter2, ..., [repeat=N]) حاصل‌ضرب دکارتی پیمایش‌پذیرهای داده‌شده را برمی‌گرداند، مجموعه‌ای از تاپل‌ها که هر ترکیب ممکن از عناصر برگردانده‌شده از هر پیمایش‌پذیر را در بر می‌گیرد.

    >>> list(itertools.product([1,2,3], [4,5,6]))
    [(1, 4), (1, 5), (1, 6),
     (2, 4), (2, 5), (2, 6),
     (3, 4), (3, 5), (3, 6)]
    

    آرگومان کلیدواژه‌ای اختیاری repeat برای گرفتن حاصل‌ضرب یک پیمایش‌پذیر یا مجموعه‌ای از پیمایش‌پذیرها با خودشان، به تعداد N بار تکرارشده، استفاده می‌شود. با تنها یک آرگومان پیمایش‌پذیر، تاپل‌های N عضوی برگردانده می‌شوند:

    >>> list(itertools.product([1,2], repeat=3))
    [(1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2),
     (2, 1, 1), (2, 1, 2), (2, 2, 1), (2, 2, 2)]
    

    با دو پیمایش‌پذیر، تاپل‌هایی به طول 2N برگردانده می‌شوند.

    >>> list(itertools.product([1,2], [3,4], repeat=2))
    [(1, 3, 1, 3), (1, 3, 1, 4), (1, 3, 2, 3), (1, 3, 2, 4),
     (1, 4, 1, 3), (1, 4, 1, 4), (1, 4, 2, 3), (1, 4, 2, 4),
     (2, 3, 1, 3), (2, 3, 1, 4), (2, 3, 2, 3), (2, 3, 2, 4),
     (2, 4, 1, 3), (2, 4, 1, 4), (2, 4, 2, 3), (2, 4, 2, 4)]
    

    combinations(iterable, r) زیردنباله‌هایی به طول r از عناصر iterable را برمی‌گرداند.

    >>> list(itertools.combinations('123', 2))
    [('1', '2'), ('1', '3'), ('2', '3')]
    >>> list(itertools.combinations('123', 3))
    [('1', '2', '3')]
    >>> list(itertools.combinations('1234', 3))
    [('1', '2', '3'), ('1', '2', '4'),
     ('1', '3', '4'), ('2', '3', '4')]
    

    permutations(iter[, r]) تمام جایگشت‌های به طول r از عناصر شیء پیمایش‌پذیر را برمی‌گرداند. اگر r مشخص نشده باشد، پیش‌فرض آن تعداد عناصر تولید‌شده توسط شیء پیمایش‌پذیر خواهد بود.

    >>> list(itertools.permutations([1,2,3,4], 2))
    [(1, 2), (1, 3), (1, 4),
     (2, 1), (2, 3), (2, 4),
     (3, 1), (3, 2), (3, 4),
     (4, 1), (4, 2), (4, 3)]
    

    itertools.chain(*iterables) تابعی موجود در itertools است که در پایتون 2.6 سازنده‌ی جدیدی به آن افزوده شد. itertools.chain.from_iterable(iterable) یک پیمایش‌پذیر واحد می‌گیرد که باید پیمایش‌پذیرهای دیگری را برگرداند. سپس chain() تمام عناصر پیمایش‌پذیر اول را برمی‌گرداند، آنگاه تمام عناصر پیمایش‌پذیر دوم و به همین ترتیب.

    >>> list(itertools.chain.from_iterable([[1,2,3], [4,5,6]]))
    [1, 2, 3, 4, 5, 6]
    

    (همه با مشارکت Raymond Hettinger.)

  • کلاس FileHandler در ماژول logging و زیرکلاس‌های آن یعنی WatchedFileHandler، RotatingFileHandler و TimedRotatingFileHandler اکنون دارای پارامتر اختیاری delay در سازنده‌های خود هستند. اگر delay درست باشد، باز شدن پرونده گزارش تا انجام اولین فراخوانی emit() به تعویق می‌افتد. (ارائه‌شده توسط Vinay Sajip.)

    کلاس TimedRotatingFileHandler نیز دارای پارامتر سازنده‌ی utc است. اگر این آرگومان درست باشد، از زمان UTC در تعیین اینکه نیمه‌شب چه زمانی رخ می‌دهد و در تولید نام پرونده‌ها استفاده خواهد شد؛ در غیر این صورت، از زمان محلی استفاده خواهد شد.

  • چندین تابع جدید به ماژول math اضافه شدند:

    • isinf() و isnan() به ترتیب تعیین می‌کنند که آیا یک عدد اعشاری داده‌شده، بی‌نهایت (مثبت یا منفی) است یا NaN (عدد نیست).

    • copysign() بیت علامت یک عدد IEEE 754 را کپی می‌کند و قدر مطلق x را همراه با بیت علامت y بازمی‌گرداند. برای مثال، math.copysign(1, -0.0) مقدار -1.0 را بازمی‌گرداند. (مشارکت‌شده توسط کریستین هایمز.)

    • factorial() فاکتوریل یک عدد را محاسبه می‌کند. (مشارکت Raymond Hettinger؛ bpo-2138.)

    • fsum() جریان اعداد یک پیمایش‌پذیر را با هم جمع می‌کند و با استفاده از مجموع‌های جزئی، مراقب است که دقتی از دست نرود. (مشارکت: Jean Brouwers، Raymond Hettinger و Mark Dickinson؛ bpo-2819.)

    • acosh()، asinh() و atanh() توابع هذلولی معکوس را محاسبه می‌کنند.

    • تابع log1p() لگاریتم طبیعی 1+x (با مبنای e) را برمی‌گرداند.

    • trunc() یک عدد را به سمت صفر گرد می‌کند و نزدیک‌ترین Integral را که بین آرگومان تابع و صفر قرار دارد برمی‌گرداند. این تابع به عنوان بخشی از بک‌پورت سلسله‌مراتب نوع برای اعداد PEP 3141 اضافه شد.

  • ماژول math بهبود یافته است تا رفتار سازگارتری روی پلتفرم‌های مختلف ارائه دهد، به‌ویژه در زمینه‌ی مدیریت استثناهای ممیز شناور و مقادیر ویژه‌ی IEEE 754.

    تا جای ممکن، این ماژول توصیه‌های استاندارد C99 درباره‌ی مقادیر خاص 754 را دنبال می‌کند. برای مثال، sqrt(-1.) اکنون باید در تقریباً همه‌ی پلتفرم‌ها ValueError ایجاد کند، در حالی که sqrt(float('NaN')) باید در همه‌ی پلتفرم‌های IEEE 754 یک NaN را بازگرداند. در مواردی که ضمیمه‌ی «F» استاندارد C99 علامت‌دهی «تقسیم بر صفر» یا «نامعتبر» را توصیه می‌کند، پایتون ValueError ایجاد خواهد کرد. در مواردی که ضمیمه‌ی «F» استاندارد C99 علامت‌دهی «سرریز» را توصیه می‌کند، پایتون OverflowError ایجاد خواهد کرد. (به bpo-711019 و bpo-1640 مراجعه کنید.)

    (با مشارکت کریستین هایمز و مارک دیکنسون.)

  • اشیاء mmap اکنون متد rfind() را دارند که جستجوی زیررشته را از انتهای رشته آغاز کرده و به سمت عقب انجام می‌دهد. متد find() نیز پارامتری end به دست آورده است که اندیسی را برای توقف جستجو مشخص می‌کند. (مشارکت: John Lenton.)

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

    >>> # Equivalent to lambda s: s.replace('old', 'new')
    >>> replacer = operator.methodcaller('replace', 'old', 'new')
    >>> replacer('old wine in old bottles')
    'new wine in new bottles'
    

    (مشارکت‌شده توسط Georg Brandl، پس از پیشنهادی از Gregory Petrosyan.)

    تابع attrgetter() اکنون نام‌های نقطه‌دار را می‌پذیرد و جست‌وجوهای ویژگی مربوطه را انجام می‌دهد:

    >>> inst_name = operator.attrgetter(
    ...        '__class__.__name__')
    >>> inst_name('')
    'str'
    >>> inst_name(help)
    '_Helper'
    

    (مشارکت‌شده توسط Georg Brandl، پس از پیشنهادی از Barry Warsaw.)

  • ماژول os اکنون چندین فراخوانی سیستمی جدید را پوشش می‌دهد. fchmod(fd, mode) و fchown(fd, uid, gid) حالت و مالکیت یک پرونده‌ی بازشده را تغییر می‌دهند، و lchmod(path, mode) حالت یک پیوند نمادین را تغییر می‌دهد. (با مشارکت Georg Brandl و Christian Heimes.)

    chflags() و lchflags() پوششی برای فراخوانی‌های سیستمی متناظر هستند (هر جا که در دسترس باشند) و پرچم‌های تنظیم‌شده روی یک پرونده را تغییر می‌دهند. ثابت‌های مربوط به مقادیر پرچم در ماژول stat تعریف شده‌اند؛ برخی از مقادیر ممکن عبارت‌اند از UF_IMMUTABLE برای نشان دادن اینکه پرونده نباید تغییر کند و UF_APPEND برای نشان دادن اینکه داده‌ها فقط می‌توانند به انتهای پرونده افزوده شوند. (مشارکت‌شده توسط M. Levinson.)

    تابع os.closerange(low, high) به‌طور کارآمد تمام توصیف‌گرهای پرونده از low تا high را می‌بندد، هرگونه خطا را نادیده می‌گیرد و خودِ high را شامل نمی‌شود. این تابع اکنون توسط ماژول subprocess برای سریع‌تر کردن راه‌اندازی فرایندها استفاده می‌شود. (مشارکت‌شده توسط Georg Brandl؛ bpo-1663329.)

  • متد clear() شیء os.environ اکنون علاوه بر پاک کردن کلیدهای شیء، تنظیم متغیرهای محیطی را نیز با استفاده از os.unsetenv() لغو می‌کند. (مشارکت‌شده توسط Martin Horcicka؛ bpo-1181.)

  • تابع os.walk() اکنون پارامتری به نام followlinks دارد. اگر روی True تنظیم شود، پیوندهای نمادینی را که به پوشه‌ها اشاره می‌کنند دنبال می‌کند و از محتوای آن پوشه‌ها بازدید می‌کند. برای سازگاری با گذشته، مقدار پیش‌فرض این پارامتر false است. توجه داشته باشید که اگر پیوند نمادینی به یک پوشه والد اشاره کند، این تابع ممکن است دچار بازگشتی بی‌نهایت شود. (bpo-1273829)

  • در ماژول os.path، تابع splitext() تغییر کرده است تا دیگر بر اساس نویسه‌های نقطه‌ی ابتدایی تقسیم انجام ندهد. این تغییر هنگام انجام عملیات روی پرونده‌های نقطه‌ای (dot-files) یونیکس، نتایج بهتری تولید می‌کند. برای مثال، os.path.splitext('.ipython') اکنون ('.ipython', '') را به جای ('', '.ipython') برمی‌گرداند. (bpo-1115886)

    تابع جدیدی، os.path.relpath(path, start='.')، یک مسیر نسبی از مسیر start (در صورت ارائه شدن) یا از پوشه‌ی کاری فعلی به مسیر مقصد path برمی‌گرداند. (مشارکت‌شده توسط ریچارد باران؛ bpo-1339796.)

    در ویندوز، os.path.expandvars() اکنون متغیرهای محیطی داده‌شده به شکل «%var%» را بسط می‌دهد و «~user» به مسیر پوشه‌ی خانگی کاربر بسط داده می‌شود. (مشارکت از Josiah Carlson؛ bpo-957650.)

  • اشکال‌زدای پایتون که ماژول pdb فراهم می‌کند، دستور جدیدی به دست آورد: دستور "run" برنامه‌ی پایتونِ در حال اشکال‌زدایی را از نو اجرا می‌کند و می‌تواند به‌صورت اختیاری آرگومان‌های خط فرمان جدیدی برای برنامه بگیرد. (مشارکت: Rocky Bernstein؛ bpo-1393667.)

  • تابع pdb.post_mortem() که برای آغاز اشکال‌زدایی یک ردگیری پشته به کار می‌رود، اکنون اگر هیچ ردگیری پشته‌ای ارائه نشده باشد، از ردگیری پشته‌ای که sys.exc_info() بازمی‌گرداند استفاده خواهد کرد. (مشارکت Facundo Batista؛ bpo-1106316.)

  • ماژول pickletools اکنون تابع optimize() را دارد که رشته‌ای حاوی یک پیکل را می‌گیرد، برخی آپ‌کد‌های استفاده‌نشده را حذف می‌کند و پیکل کوتاه‌تری که همان ساختار داده را در بر دارد برمی‌گرداند. (ارائه‌شده توسط Raymond Hettinger.)

  • تابعی با نام get_data() به ماژول pkgutil اضافه شد که محتویات پرونده‌های منبعِ همراه با یک بسته‌ی نصب‌شده‌ی پایتون را برمی‌گرداند. برای مثال:

    >>> import pkgutil
    >>> print pkgutil.get_data('test', 'exception_hierarchy.txt')
    BaseException
     +-- SystemExit
     +-- KeyboardInterrupt
     +-- GeneratorExit
     +-- Exception
          +-- StopIteration
          +-- StandardError
     ...
    

    (مشارکت Paul Moore؛ bpo-2439.)

  • اشیاء Parser ماژول pyexpat اکنون اجازه می‌دهند ویژگی buffer_size آن‌ها برای تغییر اندازه‌ی بافر مورد استفاده برای نگه‌داشتن داده‌های نویسه تنظیم شود. (مشارکت‌شده توسط Achim Gaedke؛ bpo-1137.)

  • ماژول queue اکنون گونه‌هایی از صف ارائه می‌دهد که ورودی‌ها را با ترتیب‌های متفاوت بازیابی می‌کنند. کلاس PriorityQueue آیتم‌های در صف را در یک هیپ ذخیره می‌کند و آن‌ها را به ترتیب اولویت بازیابی می‌کند، و LifoQueue تازه‌ترین ورودی‌های افزوده‌شده را نخست بازیابی می‌کند؛ یعنی مانند یک پشته رفتار می‌کند. (مشارکت‌شده توسط Raymond Hettinger.)

  • اشیاء Random ماژول random اکنون می‌توانند روی یک سیستم ۳۲ بیتی پیکل شوند و روی یک سیستم ۶۴ بیتی پیکل‌گشایی شوند، و بالعکس. متأسفانه، این تغییر همچنین به این معناست که اشیاء Random پایتون 2.6 نمی‌توانند به‌درستی روی نسخه‌های قدیمی‌تر پایتون پیکل‌گشایی شوند. (مشارکت توسط Shawn Ligocki؛ bpo-1727780.)

    تابع جدید triangular(low, high, mode) اعداد تصادفی را مطابق با توزیع مثلثی برمی‌گرداند. مقادیر بازگردانده‌شده بین low و high قرار دارند، بدون احتساب خودِ high، و mode پرتکرارترین مقدار در توزیع است. (مشارکت‌شده توسط Wladmir van der Laan و Raymond Hettinger؛ bpo-1681432.)

  • جستجوهای طولانی عبارت باقاعده که توسط ماژول re انجام می‌شوند، بررسی خواهند کرد که آیا سیگنالی رسیده است؛ بنابراین جستجوهای زمان‌بر اکنون می‌توانند قطع شوند. (با مشارکت Josh Hoyt و Ralf Schmitt؛ bpo-846388.)

    ماژول عبارت باقاعده با کامپایل کردن بایت‌کدهایی برای یک ماشین مجازی کوچکِ مخصوص عبارت باقاعده پیاده‌سازی شده است. کد غیرقابل اعتماد می‌توانست مستقیماً رشته‌های بدخواه از بایت‌کد ایجاد کند و باعث فروپاشی شود، بنابراین پایتون 2.6 شامل یک راستی‌آزمای بایت‌کد عبارت باقاعده است. (مشارکت‌شده توسط گیدو ون روسوم از کارهایش برای Google App Engine؛ bpo-3487.)

  • متد complete() ماژول rlcompleter اکنون استثناهایی را که هنگام ارزیابی یک نام ایجاد می‌شوند نادیده می‌گیرد. (توسط Lorenz Quack اصلاح شد؛ bpo-2250.)

  • نمونه‌های scheduler در ماژول sched اکنون یک ویژگی فقط‌خواندنی queue دارند که محتویات صف زمان‌بند را به‌صورت فهرستی از تاپل‌های نام‌دار با فیلدهای (time, priority, action, argument) برمی‌گرداند. (مشارکت Raymond Hettinger؛ bpo-1861.)

  • ماژول select اکنون توابع پوششی برای فراخوانی‌های سیستمی epoll() لینوکس و kqueue() BSD دارد. متد modify() به اشیاء poll موجود اضافه شد؛ pollobj.modify(fd, eventmask) یک توصیف‌گر پرونده یا شیء پرونده و یک نقاب رویداد می‌گیرد و نقاب رویداد ثبت‌شده برای آن پرونده را تغییر می‌دهد. (مشارکت‌شده توسط Christian Heimes؛ bpo-1657.)

  • تابع shutil.copytree() اکنون یک آرگومان اختیاری ignore دارد که یک شیء فراخوانی‌پذیر می‌گیرد. این فراخوانی‌پذیر، مسیر هر پوشه و فهرستی از محتویات آن پوشه را دریافت می‌کند و فهرستی از نام‌هایی که نادیده گرفته می‌شوند و کپی نمی‌شوند را برمی‌گرداند.

    ماژول shutil همچنین تابع ignore_patterns() را برای استفاده با این پارامتر جدید فراهم می‌کند. تابع ignore_patterns() تعداد دلخواهی از الگوهای به سبک glob را می‌گیرد و یک فراخوانی‌پذیر برمی‌گرداند که هر پرونده و پوشه‌ای را که با هر یک از این الگوها تطبیق یابد، نادیده می‌گیرد. مثال زیر یک درخت پوشه را کپی می‌کند، اما از کپی کردن هم پوشه‌های .svn و هم پرونده‌های پشتیبان Emacs که نام‌هایشان با '~' پایان می‌یابد، صرف‌نظر می‌کند:

    shutil.copytree('Doc/library', '/tmp/library',
                    ignore=shutil.ignore_patterns('*~', '.svn'))
    

    (مشارکت‌شده توسط طارک زیاده؛ bpo-2663.)

  • یکپارچه‌سازی مدیریت سیگنال با حلقه‌های رویداد مربوط به مدیریت GUI، مانند حلقه‌هایی که Tkinter یا GTk+ به کار می‌برند، مدت‌هاست که یک مشکل بوده است؛ بیشتر نرم‌افزارها در نهایت به پایش روی می‌آورند و هر کسری از ثانیه بیدار می‌شوند تا بررسی کنند که آیا رویدادهای GUI رخ داده‌اند یا خیر. ماژول signal اکنون می‌تواند این کار را کارآمدتر کند. فراخوانی signal.set_wakeup_fd(fd) یک توصیف‌گر پرونده را برای استفاده تنظیم می‌کند؛ هنگامی که سیگنالی دریافت شود، یک بایت به آن توصیف‌گر پرونده نوشته می‌شود. همچنین یک تابع در سطح C به نام PySignal_SetWakeupFd() برای تنظیم توصیف‌گر وجود دارد.

    حلقه‌های رویداد از این استفاده می‌کنند به این صورت که با باز کردن یک پایپ، دو توصیف‌گر ایجاد می‌کنند؛ یکی برای خواندن و دیگری برای نوشتن. توصیف‌گر نوشتنی به set_wakeup_fd() پاس داده می‌شود و توصیف‌گر خواندنی به فهرست توصیف‌گرهایی که حلقه رویداد از طریق select() یا poll() پایش می‌کند، افزوده می‌شود. با دریافت یک سیگنال، یک بایت نوشته می‌شود و حلقه رویداد اصلی بیدار می‌شود و از این رو نیازی به پایش نخواهد بود.

    (ارائه‌شده توسط Adam Olsen؛ bpo-1583.)

    تابع siginterrupt() اکنون از طریق کد پایتون در دسترس است و اجازه می‌دهد تعیین کنید که آیا سیگنال‌ها می‌توانند فراخوانی‌های سیستمی را قطع کنند یا خیر. (مشارکت از Ralf Schmitt.)

    توابع setitimer() و getitimer() نیز افزوده شده‌اند (در جایی که در دسترس هستند). setitimer() امکان تنظیم تایمرهای بازه‌ای را فراهم می‌کند؛ تایمرهایی که پس از یک زمان مشخص، باعث می‌شوند سیگنالی به فرایند تحویل داده شود. این زمان مشخص می‌تواند بر حسب زمان واقعی (wall-clock)، زمان مصرف‌شده‌ی فرایند، یا زمان ترکیبی فرایند+سیستم اندازه‌گیری شود. (مشارکت‌شده توسط Guilherme Polo؛ bpo-2240.)

  • ماژول smtplib اکنون به لطف افزودن کلاس SMTP_SSL از SMTP روی SSL پشتیبانی می‌کند. این کلاس از رابطی یکسان با کلاس موجود SMTP پشتیبانی می‌کند. (مشارکت Monty Taylor.) سازنده‌های هر دو کلاس همچنین دارای یک پارامتر اختیاری timeout هستند که مهلت زمانی تلاش اولیه برای اتصال را بر حسب ثانیه مشخص می‌کند. (مشارکت Facundo Batista.)

    پیاده‌سازی پروتکل LMTP (RFC 2033) نیز به ماژول افزوده شد. LMTP به جای SMTP هنگام انتقال ایمیل میان عامل‌هایی که صف ایمیل را مدیریت نمی‌کنند، به کار می‌رود. (LMTP توسط Leif Hedstrom پیاده‌سازی شد؛ bpo-957003.)

    smtplib.SMTP.starttls() اکنون با RFC 3207 مطابقت دارد و هر اطلاعاتی را که از سرور به دست آمده باشد و از خودِ مذاکره‌ی TLS به دست نیامده باشد، فراموش می‌کند. (وصله توسط Bill Fenner ارائه شد؛ bpo-829951.)

  • ماژول socket اکنون از TIPC (https://tipc.sourceforge.net/) پشتیبانی می‌کند؛ پروتکلی با کارایی بالا و غیرمبتنی بر IP که برای استفاده در محیط‌های خوشه‌ای طراحی شده است. نشانی‌های TIPC تاپل‌های چهارتایی یا پنج‌تایی هستند. (ارائه‌شده توسط Alberto Bertogli؛ bpo-1646.)

    تابع جدید create_connection() یک آدرس را می‌گیرد و با استفاده از یک مقدار مهلت زمانی اختیاری به آن متصل می‌شود و شیء سوکت متصل‌شده را برمی‌گرداند. این تابع همچنین نوع آدرس را جست‌وجو می‌کند و بسته به مناسب بودن، با استفاده از IPv4 یا IPv6 به آن متصل می‌شود. تغییر کدتان برای استفاده از create_connection() به‌جای socket(socket.AF_INET, ...) ممکن است تمام کاری باشد که برای کار کردن کدتان با IPv6 لازم است.

  • کلاس‌های پایه در ماژول SocketServer اکنون از فراخوانی متد handle_timeout() پس از گذشت بازه‌ی بی‌فعالیتی که توسط ویژگی timeout سرور مشخص می‌شود، پشتیبانی می‌کنند. (با مشارکت مایکل پومرنینگ.) متد serve_forever() اکنون یک بازه‌ی پایش اختیاری بر حسب ثانیه می‌پذیرد که تعیین می‌کند سرور هر چند وقت یک‌بار درخواست خاموش‌شدن را بررسی می‌کند. (با مشارکت پدرو ورنک و جفری یاسکین؛ bpo-742598، bpo-1193577.)

  • ماژول sqlite3، که توسط Gerhard Häring نگهداری می‌شود، از نسخه 2.3.2 در پایتون 2.5 به نسخه 2.4.1 به‌روزرسانی شده است.

  • ماژول struct اکنون از نوع _Bool در C99 با استفاده از نویسه‌ی قالب '?' پشتیبانی می‌کند. (مشارکت: David Remahl.)

  • اشیاء Popen ارائه‌شده توسط ماژول subprocess اکنون دارای متدهای terminate()، kill() و send_signal() هستند. در ویندوز، send_signal() تنها از سیگنال SIGTERM پشتیبانی می‌کند و همه‌ی این متدها نام مستعار تابع TerminateProcess() در Win32 API هستند. (مشارکت توسط Christian Heimes.)

  • متغیر جدید float_info در ماژول sys یک شیء است که اطلاعاتی برگرفته از پرونده‌ی float.h درباره‌ی پشتیبانی پلتفرم از ممیز شناور را در بر دارد. ویژگی‌های این شیء شامل mant_dig (تعداد ارقام در مانتیس)، epsilon (کوچک‌ترین تفاوت بین 1.0 و مقدار بزرگ‌تر قابل نمایش بعدی) و چند مورد دیگر است. (ارائه‌شده توسط Christian Heimes؛ bpo-1534.)

    متغیر جدید دیگری، dont_write_bytecode، کنترل می‌کند که آیا پایتون هنگام ایمپورت کردن یک ماژول، پرونده‌های .pyc یا .pyo را می‌نویسد یا نه. اگر این متغیر درست باشد، پرونده‌های کامپایل‌شده نوشته نمی‌شوند. مقدار این متغیر در ابتدا در زمان راه‌اندازی، با فراهم کردن سوییچ -B برای مفسر پایتون، یا با تنظیم متغیر محیطی PYTHONDONTWRITEBYTECODE پیش از اجرای مفسر، تعیین می‌شود. کد پایتون می‌تواند بعداً مقدار این متغیر را تغییر دهد تا کنترل کند که آیا پرونده‌های بایت‌کد نوشته می‌شوند یا نه. (مشارکت‌شده توسط Neal Norwitz و Georg Brandl.)

    اطلاعات مربوط به آرگومان‌های خط فرمان ارائه‌شده به مفسر پایتون، از طریق خواندن ویژگی‌های یک تاپل نام‌دار که به‌صورت sys.flags در دسترس است، به دست می‌آید. برای مثال، ویژگی verbose در صورتی درست است که پایتون در حالت پرگویی (verbose) اجرا شده باشد، debug در حالت اشکال‌زدایی درست است، و غیره. همه‌ی این ویژگی‌ها فقط‌خواندنی هستند. (مشارکت‌شده توسط کریستین هایمز.)

    تابع جدید getsizeof() یک شیء پایتون را دریافت می‌کند و میزان حافظه‌ی استفاده‌شده توسط شیء را بر حسب بایت برمی‌گرداند. اشیاء توکار نتایج درست برمی‌گردانند؛ افزونه‌های شخص ثالث ممکن است چنین نباشند، اما می‌توانند متدی با نام __sizeof__() تعریف کنند تا اندازه‌ی شیء را برگردانند. (ارائه‌شده توسط Robert Schuppenies؛ bpo-2898.)

    اکنون می‌توان توابع پروفایل‌گیر و ردگیری فعلی را با فراخوانی sys.getprofile() و sys.gettrace() تعیین کرد. (ارائه‌شده توسط Georg Brandl؛ bpo-1648.)

  • ماژول tarfile اکنون علاوه بر قالب‌های POSIX.1-1988 (ustar) و GNU tar که از پیش پشتیبانی می‌شدند، از پرونده‌های tar با قالب POSIX.1-2001 (pax) نیز پشتیبانی می‌کند. قالب پیش‌فرض، GNU tar است؛ برای باز کردن یک پرونده با قالبی متفاوت، پارامتر format را مشخص کنید:

    tar = tarfile.open("output.tar", "w",
                       format=tarfile.PAX_FORMAT)
    

    پارامترهای جدید encoding و errors یک کدگذاری و یک طرح‌واره‌ی مدیریت خطا را برای تبدیل نویسه‌ها مشخص می‌کنند. 'strict'، 'ignore' و 'replace' سه روش استانداردی هستند که پایتون می‌تواند خطاها را با آن‌ها مدیریت کند؛ 'utf-8' یک مقدار ویژه است که نویسه‌های نامعتبر را با بازنمایی UTF-8 آن‌ها جایگزین می‌کند. (تبدیل نویسه‌ها به این دلیل رخ می‌دهد که قالب PAX از نام‌های پرونده‌ی یونیکدی پشتیبانی می‌کند و کدگذاری پیش‌فرض آن UTF-8 است.)

    متد tarfile.TarFile.add() اکنون آرگومان exclude را می‌پذیرد که تابعی است و می‌توان از آن برای مستثنا کردن برخی نام‌های پرونده از یک آرشیو استفاده کرد. این تابع باید یک نام پرونده بگیرد و اگر پرونده باید مستثنا شود، مقدار درست و اگر باید در آرشیو قرار بگیرد، مقدار نادرست را برگرداند. این تابع هم بر نامی که در ابتدا به add() داده شده است و هم بر نام پرونده‌های موجود در پوشه‌هایی که به‌صورت بازگشتی افزوده می‌شوند اعمال می‌شود.

    (تمام تغییرات توسط Lars Gustäbel انجام شده است).

  • یک پارامتر اختیاری timeout به سازنده‌ی کلاس telnetlib.Telnet اضافه شد که مهلت زمانی را بر حسب ثانیه مشخص می‌کند. (افزوده‌شده توسط Facundo Batista.)

  • کلاس tempfile.NamedTemporaryFile معمولاً پرونده موقتی را که ایجاد کرده است، هنگام بسته شدن حذف می‌کند. اکنون می‌توان این رفتار را با ارسال delete=False به سازنده تغییر داد. (ارائه‌شده توسط Damien Miller؛ bpo-1537850.)

    کلاس جدید SpooledTemporaryFile مانند یک پرونده موقت رفتار می‌کند، اما داده‌های خود را تا زمانی که از حداکثر اندازه فراتر نرود در حافظه ذخیره می‌کند. با رسیدن به آن حد، محتویات در یک پرونده موقت روی دیسک نوشته می‌شوند. (ارائه شده توسط Dustin J. Mitchell.)

    کلاس‌های NamedTemporaryFile و SpooledTemporaryFile هر دو به‌عنوان مدیر زمینه کار می‌کنند، بنابراین می‌توانید بنویسید with tempfile.NamedTemporaryFile() as tmp: .... (ارائه‌شده توسط Alexander Belopolsky؛ bpo-2021.)

  • ماژول test.test_support تعدادی مدیر زمینه مفید برای نوشتن آزمون‌ها به دست آورد. EnvironmentVarGuard() یک مدیر زمینه است که متغیرهای محیطی را به‌طور موقت تغییر می‌دهد و آن‌ها را به‌طور خودکار به مقادیر قبلی‌شان بازمی‌گرداند.

    مدیر زمینه دیگری، TransientResource، می‌تواند فراخوانی منابعی را که ممکن است در دسترس باشند یا نباشند در بر بگیرد؛ این مدیر زمینه فهرست مشخصی از استثناها را می‌گیرد و نادیده می‌گیرد. برای مثال، یک آزمون شبکه ممکن است هنگام اتصال به یک وب‌سایت خارجی، خطاهای خاصی را نادیده بگیرد:

    with test_support.TransientResource(IOError,
                                    errno=errno.ETIMEDOUT):
        f = urllib.urlopen('https://sf.net')
        ...
    

    در نهایت، check_warnings() پالایه‌های هشدار ماژول warnings را بازنشانی می‌کند و شیئی را برمی‌گرداند که تمام پیام‌های هشدارِ فعال‌شده را ثبت خواهد کرد (bpo-3781):

    with test_support.check_warnings() as wrec:
        warnings.simplefilter("always")
        # ... code that triggers a warning ...
        assert str(wrec.message) == "function is outdated"
        assert len(wrec.warnings) == 1, "Multiple warnings raised"
    

    (مشارکت از طرف برت کانون.)

  • ماژول textwrap اکنون می‌تواند با مشخص کردن drop_whitespace=False به عنوان آرگومان، فضای سفید موجود در ابتدا و انتهای سطرهای تازه ایجادشده را حفظ کند:

    >>> S = """This  sentence  has a bunch   of
    ...   extra   whitespace."""
    >>> print textwrap.fill(S, width=15)
    This  sentence
    has a bunch
    of    extra
    whitespace.
    >>> print textwrap.fill(S, drop_whitespace=False, width=15)
    This  sentence
      has a bunch
       of    extra
       whitespace.
    >>>
    

    (مشارکت‌شده توسط Dwayne Bailey؛ bpo-1581073.)

  • API ماژول threading در حال تغییر است تا به‌جای متدهای setDaemon() و isDaemon() از ویژگی‌هایی مانند daemon استفاده کند، و برخی متدها برای استفاده از زیرخط به‌جای کمل‌کیس (camel-case) تغییر نام داده‌اند؛ برای مثال، متد activeCount() به active_count() تغییر نام داده است. هر دو نسخه‌ی 2.6 و 3.0 این ماژول، همان ویژگی‌ها و متدهای تغییر نام داده‌شده را پشتیبانی می‌کنند، اما متدهای قدیمی را حذف نمی‌کنند. هیچ تاریخی برای منسوخ‌شدن APIهای قدیمی در پایتون 3.x تعیین نشده است؛ APIهای قدیمی در هیچ نسخه‌ی 2.x حذف نخواهند شد. (انجام‌شده توسط چندین نفر، که برجسته‌ترین آن‌ها بنجامین پترسون است.)

    اشیاء Thread ماژول threading ویژگی ident را به دست آوردند که شناسه‌ی نخ — یک عدد صحیح ناصفر — را برمی‌گرداند. (با مشارکت Gregory P. Smith؛ bpo-2871.)

  • ماژول timeit اکنون علاوه بر رشته‌ها، فراخوانی‌پذیرها را نیز برای دستوری که زمان‌سنجی می‌شود و برای کد راه‌اندازی می‌پذیرد. دو تابع کمکی برای ایجاد نمونه‌های Timer اضافه شد: repeat(stmt, setup, time, repeat, number) و timeit(stmt, setup, time, number) یک نمونه ایجاد می‌کنند و متد مربوطه را فراخوانی می‌کنند. (ارائه‌شده توسط اریک دمین؛ bpo-1533909.)

  • ماژول tkinter اکنون فهرست‌ها و تاپل‌ها را برای گزینه‌ها می‌پذیرد و پیش از ارسال مقدار حاصل به Tcl/Tk، عناصر را با فاصله از یکدیگر جدا می‌کند. (با مشارکت Guilherme Polo؛ bpo-2906.)

  • ماژول turtle برای گرافیک لاک‌پشتی، به‌طور چشمگیری توسط گرگور لینگل بهبود یافت. قابلیت‌های جدید در این ماژول عبارت‌اند از:

    • انیمیشن بهتر برای حرکت و چرخش لاک‌پشت.

    • کنترل حرکت لاک‌پشت با استفاده از متدهای جدید delay()، tracer() و speed().

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

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

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

    • از یک پرونده turtle.cfg می‌توان برای سفارشی‌سازی ظاهر آغازین صفحه‌ی لاک‌پشت استفاده کرد.

    • رشته‌های مستند ماژول را می‌توان با رشته‌های مستند جدیدی که به زبان دیگری ترجمه شده‌اند جایگزین کرد.

    (bpo-1513695)

  • یک پارامتر اختیاری timeout به تابع urllib.urlopen و سازنده‌ی کلاس urllib.ftpwrapper و همچنین به تابع urllib2.urlopen اضافه شد. این پارامتر یک مهلت زمانی بر حسب ثانیه را مشخص می‌کند. برای مثال:

    >>> u = urllib2.urlopen("http://slow.example.com",
                            timeout=3)
    Traceback (most recent call last):
      ...
    urllib2.URLError: <urlopen error timed out>
    >>>
    

    (افزوده‌شده توسط Facundo Batista.)

  • پایگاه داده یونیکد فراهم‌شده توسط ماژول unicodedata به نسخه 5.1.0 به‌روزرسانی شده است. (به‌روزرسانی توسط Martin von Löwis؛ bpo-3811.)

  • توابع formatwarning() و showwarning() ماژول warnings آرگومان اختیاری line دریافت کردند که می‌توان از آن برای فراهم کردن سطر کد منبع استفاده کرد. (به عنوان بخشی از bpo-1631171 اضافه شد که در آن بخشی از ماژول warnings با کد C بازپیاده‌سازی شد.)

    تابع جدیدی، catch_warnings()، مدیر زمینه‌ای است که برای اهداف آزمون در نظر گرفته شده و به شما اجازه می‌دهد فیلترهای هشدار را به‌طور موقت تغییر دهید و سپس مقادیر اصلی‌شان را بازگردانید (bpo-3781).

  • اکنون می‌توان با ارسال False به‌عنوان پارامتر سازنده‌ی bind_and_activate، مانع از آن شد که کلاس‌های SimpleXMLRPCServer و DocXMLRPCServer در XML-RPC بلافاصله سوکتشان را باز کنند و به آن مقید شوند. از این امکان می‌توان برای تغییر ویژگی allow_reuse_address نمونه، پیش از فراخوانی متدهای server_bind() و server_activate() به‌منظور باز کردن سوکت و آغاز گوش دادن به اتصال‌ها استفاده کرد. (مشارکت‌کرده: Peter Parente؛ bpo-1599845.)

    SimpleXMLRPCServer همچنین دارای ویژگی _send_traceback_header است؛ اگر مقدار آن true باشد، استثنا و ردگیری پشته‌ی قالب‌بندی‌شده به‌عنوان سرآیند‌های HTTP «X-Exception» و «X-Traceback» برگردانده می‌شوند. این قابلیت تنها برای اهداف اشکال‌زدایی است و نباید در سرور‌های عملیاتی استفاده شود، زیرا ردگیری‌های پشته ممکن است گذرواژه‌ها یا سایر اطلاعات حساس را فاش کنند. (ارائه‌شده توسط Alan McIntyre به‌عنوان بخشی از پروژه‌اش برای برنامه‌ی Google Summer of Code 2007.)

  • ماژول xmlrpclib دیگر به‌طور خودکار datetime.date و datetime.time را به نوع xmlrpclib.DateTime تبدیل نمی‌کند؛ معناشناسی این تبدیل لزوماً برای همه‌ی برنامه‌ها صحیح نبود. کدی که از xmlrpclib استفاده می‌کند، باید نمونه‌های date و time را تبدیل کند. (bpo-1330538) این کد همچنین می‌تواند تاریخ‌های پیش از ۱۹۰۰ (با مشارکت Ralf Schmitt؛ bpo-2014) و اعداد صحیح ۶۴ بیتی که در پاسخ‌های XML-RPC با استفاده از <i8> بازنمایی می‌شوند (با مشارکت Riku Lindblad؛ bpo-2985) را مدیریت کند.

  • کلاس ZipFile در ماژول zipfile اکنون متدهای extract() و extractall() را دارد که یک پرونده‌ی واحد یا همه‌ی پرونده‌های آرشیو را در پوشه‌ی جاری یا در پوشه‌ی مشخص‌شده واگشایی می‌کنند:

    z = zipfile.ZipFile('python-251.zip')
    
    # Unpack a single file, writing it relative
    # to the /tmp directory.
    z.extract('Python/sysmodule.c', '/tmp')
    
    # Unpack all the files in the archive.
    z.extractall()
    

    (مشارکت‌شده توسط Alan McIntyre؛ bpo-467924.)

    متدهای open()، read() و extract() اکنون می‌توانند یا نام پرونده یا شیء ZipInfo را بپذیرند. این زمانی مفید است که یک آرشیو به‌طور تصادفی حاوی نام پرونده‌ی تکراری باشد. (ارائه‌شده توسط Graham Horler؛ bpo-1775025.)

    در نهایت، zipfile اکنون از استفاده از نام‌های پرونده‌ی یونیکد برای پرونده‌های بایگانی‌شده پشتیبانی می‌کند. (مشارکت از Alexey Borzenkov؛ bpo-1734346.)

ماژول ast

ماژول ast بازنمایی درخت سینتکس انتزاعی از کد پایتون را ارائه می‌دهد و Armin Ronacher مجموعه‌ای از توابع کمکی را مشارکت داده است که انواع گوناگونی از کارهای رایج را انجام می‌دهند. این توابع برای بسته‌های قالب‌سازی HTML، تحلیلگرهای کد و ابزارهای مشابهی که کد پایتون را پردازش می‌کنند مفید خواهند بود.

تابع parse() یک عبارت را دریافت می‌کند و یک AST برمی‌گرداند. تابع dump() نمایشی از یک درخت را خروجی می‌دهد که برای اشکال‌زدایی مناسب است:

import ast

t = ast.parse("""
d = {}
for i in 'abcdefghijklm':
    d[i + i] = ord(i) - ord('a') + 1
print d
""")
print ast.dump(t)

این یک درخت تودرتوی عمیق را خروجی می‌دهد:

Module(body=[
  Assign(targets=[
    Name(id='d', ctx=Store())
   ], value=Dict(keys=[], values=[]))
  For(target=Name(id='i', ctx=Store()),
      iter=Str(s='abcdefghijklm'), body=[
    Assign(targets=[
      Subscript(value=
        Name(id='d', ctx=Load()),
          slice=
          Index(value=
            BinOp(left=Name(id='i', ctx=Load()), op=Add(),
             right=Name(id='i', ctx=Load()))), ctx=Store())
     ], value=
     BinOp(left=
      BinOp(left=
       Call(func=
        Name(id='ord', ctx=Load()), args=[
          Name(id='i', ctx=Load())
         ], keywords=[], starargs=None, kwargs=None),
       op=Sub(), right=Call(func=
        Name(id='ord', ctx=Load()), args=[
          Str(s='a')
         ], keywords=[], starargs=None, kwargs=None)),
       op=Add(), right=Num(n=1)))
    ], orelse=[])
   Print(dest=None, values=[
     Name(id='d', ctx=Load())
   ], nl=True)
 ])

متد literal_eval() یک رشته یا درخت سینتکس انتزاعی (AST) را که بیانگر یک عبارت لفظی است دریافت می‌کند، آن را تجزیه و ارزیابی می‌کند و مقدار حاصل را برمی‌گرداند. عبارت لفظی عبارتی در پایتون است که فقط شامل رشته‌ها، اعداد، دیکشنری‌ها و غیره است، اما هیچ دستور یا فراخوانی تابعی ندارد. اگر نیاز به ارزیابی یک عبارت دارید اما نمی‌توانید خطر امنیتی استفاده از فراخوانی eval() را بپذیرید، literal_eval() آن را به‌طور ایمن مدیریت می‌کند:

>>> literal = '("a", "b", {2:4, 3:8, 1:2})'
>>> print ast.literal_eval(literal)
('a', 'b', {1: 2, 2: 4, 3: 8})
>>> print ast.literal_eval('"a" + "b"')
Traceback (most recent call last):
  ...
ValueError: malformed string

این ماژول همچنین شامل کلاس‌های NodeVisitor و NodeTransformer برای پیمایش و تغییر دادن AST، و توابعی برای تبدیل‌های رایج مانند تغییر شماره سطرها است.

ماژول future_builtins

پایتون 3.0 تغییرات زیادی در مجموعه توابع توکار ایجاد می‌کند و بیشتر این تغییرات را نمی‌توان در سری پایتون 2.x اعمال کرد، زیرا سازگاری را از بین می‌برند. ماژول future_builtins نسخه‌هایی از این توابع توکار را فراهم می‌کند که هنگام نوشتن کد سازگار با 3.0 می‌توان آن‌ها را ایمپورت کرد.

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

  • ascii(obj): معادل repr() است. در پایتون 3.0، repr() یک رشته یونیکد را خواهد برگرداند، در حالی که ascii() یک رشته بایتی اسکی خالص را خواهد برگرداند.

  • filter(predicate, iterable)، map(func, iterable1, ...): نسخه‌های 3.0 پیمایش‌گر برمی‌گردانند، برخلاف توکارهای 2.x که فهرست برمی‌گردانند.

  • hex(value) و oct(value): به‌جای فراخوانی متدهای __hex__() یا __oct__()، این نسخه‌ها متد __index__() را فراخوانی کرده و نتیجه را به مبنای شانزده یا مبنای هشت تبدیل می‌کنند. oct() برای نتیجه‌ی خود از نماد جدید 0o استفاده می‌کند.

ماژول json: نمادگذاری شیء جاوااسکریپت

ماژول جدید json از کدگذاری و کدگشایی نوع‌های پایتون در JSON (Javascript Object Notation) پشتیبانی می‌کند. JSON یک قالب تبادل سبک‌وزن است که اغلب در برنامه‌های کاربردی وب استفاده می‌شود. برای اطلاعات بیشتر درباره‌ی JSON، به http://www.json.org مراجعه کنید.

json از کدگشایی و کدگذاری بیشتر نوع‌های توکار پایتون پشتیبانی می‌کند. مثال زیر یک دیکشنری را کدگذاری و کدگشایی می‌کند:

>>> import json
>>> data = {"spam": "foo", "parrot": 42}
>>> in_json = json.dumps(data) # Encode the data
>>> in_json
'{"parrot": 42, "spam": "foo"}'
>>> json.loads(in_json) # Decode into a Python object
{"spam": "foo", "parrot": 42}

همچنین می‌توانید کدگشاها و کدگذارهای خودتان را برای پشتیبانی از نوع‌های بیشتر بنویسید. چاپ زیبا (pretty-printing) رشته‌های JSON نیز پشتیبانی می‌شود.

json (که در اصل با نام simplejson شناخته می‌شد) توسط Bob Ippolito نوشته شده است.

ماژول plistlib: پارسر فهرست ویژگی (Property-List)

قالب .plist معمولاً در Mac OS X برای ذخیره‌سازی نوع‌های داده‌ی پایه (اعداد، رشته‌ها، فهرست‌ها و دیکشنری‌ها) از طریق سریال‌سازی آن‌ها به قالبی مبتنی بر XML استفاده می‌شود. این قالب شبیه به سریال‌سازی نوع‌های داده در XML-RPC است.

با وجود آنکه این قالب عمدتاً روی Mac OS X استفاده می‌شود، هیچ چیز مخصوص مک در آن نیست و پیاده‌سازی پایتون آن روی هر پلتفرمی که پایتون از آن پشتیبانی می‌کند کار می‌کند؛ بنابراین ماژول plistlib به کتابخانه استاندارد ارتقا یافته است.

استفاده از ماژول ساده است:

import sys
import plistlib
import datetime as dt

# Create data structure
data_struct = dict(lastAccessed=dt.datetime.now(),
                   version=1,
                   categories=('Personal','Shared','Private'))

# Create string containing XML.
plist_str = plistlib.writePlistToString(data_struct)
new_struct = plistlib.readPlistFromString(plist_str)
print data_struct
print new_struct

# Write data structure to a file and read it back.
plistlib.writePlist(data_struct, '/tmp/customizations.plist')
new_struct = plistlib.readPlist('/tmp/customizations.plist')

# read/writePlist accepts file-like objects as well as paths.
plistlib.writePlist(data_struct, sys.stdout)

بهبودهای ctypes

توماس هلر به نگهداری و بهبود ماژول ctypes ادامه داد.

ماژول ctypes اکنون از نوع داده‌ی c_bool پشتیبانی می‌کند که نماینده‌ی نوع bool در C99 است. (با مشارکت David Remahl؛ bpo-1649190.)

نوع‌های رشته، بافر و آرایه‌ی ctypes پشتیبانی بهبودیافته‌ای از سینتکس اسلایس‌بندی توسعه‌یافته دارند، که در آن ترکیب‌های گوناگونی از (start, stop, step) ارائه می‌شوند. (پیاده‌سازی‌شده توسط Thomas Wouters.)

همه‌ی نوع‌های داده‌ی ctypes اکنون از متدهای from_buffer() و from_buffer_copy() پشتیبانی می‌کنند که یک نمونه‌ی ctypes بر اساس یک شیء بافر ارائه‌شده ایجاد می‌کنند. from_buffer_copy() محتویات شیء را کپی می‌کند، در حالی که from_buffer() همان ناحیه‌ی حافظه را به اشتراک می‌گذارد.

قرارداد فراخوانی جدیدی به ctypes می‌گوید که متغیرهای errno یا Win32 LastError را در ابتدای هر فراخوانی پوشش‌داده‌شده پاک کند. (پیاده‌سازی‌شده توسط Thomas Heller؛ bpo-1798.)

اکنون می‌توانید متغیر errno یونیکس را پس از فراخوانی یک تابع بازیابی کنید. هنگام ایجاد یک تابع پوششی، می‌توانید use_errno=True را به‌عنوان پارامتر کلیدواژه‌ای به تابع DLL ارائه دهید و سپس متدهای در سطح ماژول set_errno() و get_errno() را برای تنظیم و بازیابی مقدار خطا فراخوانی کنید.

متغیر LastError در Win32 به‌طور مشابه توسط توابع DLL، OleDLL() و WinDLL() پشتیبانی می‌شود. شما use_last_error=True را به‌عنوان یک پارامتر کلیدواژه‌ای ارائه می‌دهید و سپس متدهای سطح ماژول set_last_error() و get_last_error() را فراخوانی می‌کنید.

تابع byref() که برای بازیابی اشاره‌گر به یک نمونه‌ی ctypes استفاده می‌شود، اکنون پارامتر اختیاری offset را دارد که تعداد بایتی است که به اشاره‌گر بازگردانده‌شده افزوده می‌شود.

پشتیبانی بهبود‌یافته از SSL

بیل جانسن با افزودن ماژول جدید ssl که بر فراز کتابخانه‌ی OpenSSL ساخته شده است، بهبودهای گسترده‌ای در پشتیبانی پایتون 2.6 از لایه‌ی سوکت‌های امن (SSL) ایجاد کرد. این ماژول جدید کنترل بیشتری بر پروتکل مذاکره‌شده و گواهی‌های X.509 استفاده‌شده فراهم می‌کند و پشتیبانی بهتری برای نوشتن سرورهای SSL (برخلاف کلاینت‌ها) در پایتون دارد. پشتیبانی موجود SSL در ماژول socket حذف نشده و همچنان کار می‌کند، هرچند در پایتون 3.0 حذف خواهد شد.

برای استفاده از ماژول جدید، ابتدا باید یک اتصال TCP را به روش معمول ایجاد کنید و سپس آن را به تابع ssl.wrap_socket() پاس دهید. می‌توان مشخص کرد که آیا گواهی مورد نیاز است یا خیر، و اطلاعات گواهی را با فراخوانی متد getpeercert() به دست آورد.

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

مستندات ماژول ssl.

منسوخ‌شدگی‌ها و حذف‌ها

  • استثناهای رشته‌ای حذف شده‌اند. تلاش برای استفاده از آن‌ها باعث ایجاد یک TypeError می‌شود.

  • تغییرات در رابط Exception که توسط PEP 352 مقرر شده‌اند، همچنان اعمال می‌شوند. در نسخه‌ی 2.6، ویژگی message به نفع ویژگی args منسوخ می‌شود.

  • (حالت هشدار 3.0) پایتون 3.0 کتابخانه استانداردی بازسازمان‌دهی‌شده خواهد داشت که بسیاری از ماژول‌های قدیمی را حذف و نام برخی دیگر را تغییر خواهد داد. پایتون 2.6 که در حالت هشدار 3.0 اجرا می‌شود، هنگامی که این ماژول‌ها ایمپورت می‌شوند درباره آن‌ها هشدار خواهد داد.

    فهرست ماژول‌های منسوخ عبارت است از: audiodev، bgenlocations، buildtools، bundlebuilder، Canvas، compiler، dircache، dl، fpformat، gensuitemodule، ihooks، imageop، imgfile، linuxaudiodev، mhlib، mimetools، multifile، new، pure، statvfs، sunaudiodev، test.testall و toaiff.

  • ماژول gopherlib حذف شده است.

  • ماژول MimeWriter و ماژول mimify منسوخ شده‌اند؛ به جای آن‌ها از بسته‌ی email استفاده کنید.

  • ماژول md5 منسوخ شده است؛ به جای آن از ماژول hashlib استفاده کنید.

  • ماژول posixfile منسوخ شده است؛ fcntl.lockf() قفل‌گذاری بهتری فراهم می‌کند.

  • ماژول popen2 منسوخ شده است؛ از ماژول subprocess استفاده کنید.

  • ماژول rgbimg حذف شده است.

  • ماژول sets منسوخ شده است؛ بهتر است از نوع‌های توکار set و frozenset استفاده کنید.

  • ماژول sha منسوخ شده است؛ به جای آن از ماژول hashlib استفاده کنید.

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

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

  • اکنون پایتون باید با کامپایلرهای C89 کامپایل شود (پس از ۱۹ سال!). این بدان معناست که درخت کد منبع پایتون پیاده‌سازی‌های خودش را برای memmove() و strerror() که در کتابخانه استاندارد C89 قرار دارند، حذف کرده است.

  • می‌توان Python 2.6 را با Microsoft Visual Studio 2008 (نسخه 9.0) ساخت و این کامپایلر پیش‌فرض جدید است. برای پرونده‌های ساخت به پوشه‌ی PCbuild مراجعه کنید. (پیاده‌سازی‌شده توسط Christian Heimes.)

  • در Mac OS X، پایتون 2.6 می‌تواند به‌صورت یک ساخت‌ همگانی چهارتایی (4-way universal build) کامپایل شود. اسکریپت configure می‌تواند سوییچ --with-universal-archs=[32-bit|64-bit|all] را بپذیرد که کنترل می‌کند دودویی‌ها برای معماری‌های ۳۲بیتی (x86، PowerPC)، ۶۴بیتی (x86-64 و PPC-64) یا هر دو ساخته شوند. (با مشارکت Ronald Oussoren.)

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

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

    اگر برنامه‌ای به زبان C/C++ را نگهداری می‌کنید که پایتون را در خود تعبیه کرده است، بررسی کنید که آیا PySys_SetArgv() را فراخوانی می‌کنید و با دقت در نظر بگیرید که آیا برنامه باید از PySys_SetArgvEx() با updatepath تنظیم‌شده روی false استفاده کند. توجه داشته باشید که استفاده از این تابع، سازگاری با نسخه‌های 2.6.5 و قدیمی‌تر پایتون را از بین می‌برد؛ اگر ناچارید به کار با نسخه‌های قدیمی‌تر ادامه دهید، می‌توانید فراخوانی PySys_SetArgv() را دست‌نخورده بگذارید و پس از آن PyRun_SimpleString("sys.path.pop(0)\n") را فراخوانی کنید تا اولین جزء sys.path دور انداخته شود.

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

  • ماژول BerkeleyDB اکنون یک شیء API زبان C دارد که به‌صورت bsddb.db.api در دسترس است. این شیء را می‌توان توسط سایر ماژول‌های توسعه‌ای C که می‌خواهند از ماژول bsddb برای مقاصد خود استفاده کنند، به کار برد. (مشارکت‌شده توسط Duncan Grisby.)

  • رابط بافر جدید، که پیش‌تر در بخش PEP 3118 شرح داده شد، PyObject_GetBuffer() و PyBuffer_Release() و همچنین چند تابع دیگر را اضافه می‌کند.

  • استفاده‌ی پایتون از کتابخانه‌ی stdio زبان C اکنون نخ‌ایمن است، یا دست‌کم به اندازه‌ی کتابخانه‌ی زیرین نخ‌ایمن است. یک اشکال بالقوه‌ی دیرینه در صورتی رخ می‌داد که یک نخ شیء پرونده‌ای را می‌بست، در حالی که نخ دیگری در حال خواندن از آن شیء یا نوشتن در آن بود. در نسخه‌ی 2.6 اشیاء پرونده دارای شمارش ارجاع هستند که توسط توابع PyFile_IncUseCount() و PyFile_DecUseCount() تغییر داده می‌شود. اشیاء پرونده نمی‌توانند بسته شوند مگر آنکه شمارش ارجاع آن‌ها صفر باشد. PyFile_IncUseCount() باید در حالی که قفل مفسر سراسری هنوز در اختیار است، پیش از انجام عملیات ورودی/خروجی با استفاده از اشاره‌گر FILE * فراخوانی شود، و PyFile_DecUseCount() باید بلافاصله پس از به‌دست آوردن مجدد قفل مفسر سراسری فراخوانی شود. (با مشارکت Antoine Pitrou و Gregory P. Smith.)

  • ایمپورت کردن ماژول‌ها به‌طور همزمان در دو نخ مختلف دیگر باعث بن‌بست نمی‌شود؛ اکنون استثنای ImportError ایجاد می‌کند. یک تابع API جدید، PyImport_ImportModuleNoBlock()، ابتدا ماژول را در sys.modules جست‌وجو می‌کند و سپس پس از به دست آوردن قفل ایمپورت، تلاش می‌کند آن را ایمپورت کند. اگر قفل ایمپورت در اختیار نخ دیگری باشد، استثنای ImportError ایجاد می‌شود. (مشارکت‌شده توسط Christian Heimes.)

  • چندین تابع اطلاعات مربوط به پشتیبانی پلتفرم از ممیز شناور را برمی‌گردانند. PyFloat_GetMax() بزرگ‌ترین مقدار ممیز شناور قابل‌نمایش را برمی‌گرداند و PyFloat_GetMin() کوچک‌ترین مقدار مثبت را برمی‌گرداند. PyFloat_GetInfo() شیئی حاوی اطلاعات بیشتری از پرونده‌ی float.h برمی‌گرداند، مانند "mant_dig" (تعداد ارقام مانتيس)، "epsilon" (کوچک‌ترین تفاوت میان 1.0 و مقدار بزرگ‌تر قابل‌نمایش بعدی) و چندین مورد دیگر. (ارائه‌شده توسط کریستین هایمز؛ bpo-1534.)

  • توابع و متدهای C که از PyComplex_AsCComplex() استفاده می‌کنند، اکنون آرگومان‌هایی را که متد __complex__() دارند می‌پذیرند. به‌طور خاص، توابع ماژول cmath اکنون اشیایی را که این متد را دارند می‌پذیرند. این یک بک‌پورت از تغییری در پایتون 3.0 است. (مشارکت‌شده توسط Mark Dickinson؛ bpo-1675423.)

  • API زبان C پایتون اکنون شامل دو تابع برای مقایسه‌ی رشته‌ها بدون حساسیت به بزرگی و کوچکی حروف است: PyOS_stricmp(char*, char*) و PyOS_strnicmp(char*, char*, Py_ssize_t). (مشارکت‌شده توسط Christian Heimes؛ bpo-1635.)

  • بسیاری از ماژول‌های توسعه‌ای C ماکروی کوچک خود را برای افزودن اعداد صحیح و رشته‌ها به دیکشنری ماژول در تابع init* تعریف می‌کنند. پایتون 2.6 سرانجام ماکروهای استانداردی برای افزودن مقادیر به یک ماژول تعریف می‌کند، PyModule_AddStringMacro و PyModule_AddIntMacro(). (مشارکت‌شده توسط کریستین هایمز.)

  • برخی ماکروها در هر دو نسخه‌ی 3.0 و 2.6 تغییر نام داده شدند تا روشن‌تر شود که آن‌ها ماکرو هستند، نه تابع. Py_Size() به Py_SIZE() تغییر نام یافت، Py_Type() به Py_TYPE() و Py_Refcnt() به Py_REFCNT(). ماکروهای با حروف بزرگ و کوچک ترکیبی هنوز در پایتون 2.6 برای سازگاری با نسخه‌های قبلی در دسترس هستند. (bpo-1629)

  • Distutils اکنون توسعه‌های C که می‌سازد را هنگام اجرا روی نسخه‌ی اشکال‌زدایی پایتون، در پوشه‌ای متفاوت قرار می‌دهد. (مشارکت از Collin Winter؛ bpo-1530959.)

  • چندین نوع داده پایه، مانند اعداد صحیح و رشته‌ها، فهرست‌های آزاد (free list) داخلی از اشیایی که می‌توان دوباره از آن‌ها استفاده کرد نگه می‌دارند. ساختارهای داده این فهرست‌های آزاد اکنون از یک قرارداد نام‌گذاری پیروی می‌کنند: متغیر همیشه free_list نام دارد، شمارنده همیشه numfree نام دارد، و ماکروی Py<typename>_MAXFREELIST همیشه تعریف می‌شود.

  • یک هدف جدید Makefile با نام «make patchcheck» درخت منبع پایتون را برای ایجاد وصله آماده می‌کند: این هدف فضای سفید انتهایی را در همه‌ی پرونده‌های .py که تغییر کرده‌اند اصلاح می‌کند، بررسی می‌کند که آیا مستندات تغییر کرده‌اند یا خیر، و گزارش می‌دهد که آیا پرونده‌های Misc/ACKS و Misc/NEWS به‌روزرسانی شده‌اند یا خیر. (مشارکت توسط Brett Cannon.)

    هدف جدید دیگر، «make profile-opt»، یک پرونده دودویی پایتون را با استفاده از بهینه‌سازی هدایت‌شده با پروفایل (profile-guided optimization) در GCC کامپایل می‌کند. این هدف، پایتون را با فعال بودن پروفایل‌گیری کامپایل می‌کند، مجموعه آزمون‌ها را برای به‌دست آوردن مجموعه‌ای از نتایج پروفایل‌گیری اجرا می‌کند و سپس با استفاده از این نتایج، برای بهینه‌سازی کامپایل می‌کند. (مشارکت: Gregory P. Smith.)

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

  • پشتیبانی از ویندوز 95، 98، ME و NT4 حذف شده است. پایتون 2.6 حداقل به ویندوز 2000 SP4 نیاز دارد.

  • کامپایلر پیش‌فرض جدید در ویندوز، Visual Studio 2008 (نسخه‌ی 9.0) است. پوشه‌های ساخت Visual Studio 2003 (نسخه‌ی 7.1) و 2005 (نسخه‌ی 8.0) به پوشه‌ی PC/ منتقل شدند. پوشه‌ی جدید PCbuild از کامپایل متقاطع برای X64، ساخت‌های اشکال‌زدایی و بهینه‌سازی هدایت‌شده با پروفایل (PGO) پشتیبانی می‌کند. ساخت‌های PGO تقریباً ۱۰٪ سریع‌تر از ساخت‌های عادی هستند. (مشارکت Christian Heimes با کمک Amaury Forgeot d'Arc و Martin von Löwis.)

  • ماژول msvcrt اکنون از هر دو گونه‌ی معمولی و پهن‌نویسه‌ی API ورودی/خروجی کنسول پشتیبانی می‌کند. تابع getwch() یک کلید فشرده‌شده را می‌خواند و یک مقدار یونیکد برمی‌گرداند، همان‌طور که تابع getwche() نیز همین کار را انجام می‌دهد. تابع putwch() یک نویسه‌ی یونیکد را می‌گیرد و آن را در کنسول می‌نویسد. (مشارکت‌شده توسط کریستین هایمز.)

  • os.path.expandvars() اکنون متغیرهای محیطی به شکل "%var%" را بسط می‌دهد، و "~user" به مسیر پوشه‌ی خانه‌ی کاربر بسط داده می‌شود. (مشارکت‌شده توسط Josiah Carlson؛ bpo-957650.)

  • شیءهای سوکتِ ماژول socket اکنون متد ioctl() را دارند که رابطی محدود به رابط سیستمی WSAIoctl() فراهم می‌کند.

  • ماژول _winreg اکنون تابعی به نام ExpandEnvironmentStrings() دارد که ارجاع‌های متغیرهای محیطی مانند %NAME% را در رشته‌ی ورودی بسط می‌دهد. اشیاء دسته‌ای که این ماژول ارائه می‌کند اکنون از پروتکل زمینه پشتیبانی می‌کنند، بنابراین می‌توان از آن‌ها در دستورهای with استفاده کرد. (مشارکت: Christian Heimes.)

    _winreg همچنین پشتیبانی بهتری برای سیستم‌های x64 دارد و توابع DisableReflectionKey()، EnableReflectionKey() و QueryReflectionKey() را ارائه می‌دهد که بازتاب رجیستری را برای فرایندهای ۳۲بیتی در حال اجرا بر روی سیستم‌های ۶۴بیتی فعال و غیرفعال می‌کنند. (bpo-1753245)

  • شیء Record ماژول msilib متدهای GetInteger() و GetString() را دریافت کرد که مقادیر فیلدها را به‌صورت عدد صحیح یا رشته برمی‌گردانند. (مشارکت توسط Floris Bruynooghe؛ bpo-2125.)

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

  • هنگام کامپایل کردن یک نسخه‌ی چارچوبی از پایتون، اکنون می‌توانید نام چارچوب مورد استفاده را با ارائه‌ی گزینه‌ی --with-framework-name= به اسکریپت configure مشخص کنید.

  • ماژول macfs حذف شده است. این امر به نوبه خود مستلزم حذف تابع macostools.touched() بود، زیرا این تابع به ماژول macfs وابسته بود. (bpo-1490190)

  • بسیاری از ماژول‌های دیگر Mac OS منسوخ شده‌اند و در پایتون 3.0 حذف خواهند شد: _builtinSuites، aepack، aetools، aetypes، applesingle، appletrawmain، appletrunner، argvemulator، Audio_mac، autoGIL، Carbon، cfmfile، CodeWarrior، ColorPicker، EasyDialogs، Explorer، Finder، FrameWork، findertools، ic، icglue، icopen، macerrors، MacOS، macfs، macostools، macresource، MiniAEFrame، Nav، Netscape، OSATerminology، pimp، PixMapWrapper، StdSuites، SystemEvents، Terminal و terminalcommand.

تغییرات مختص پورت: IRIX

تعدادی از ماژول‌های قدیمی مخصوص IRIX منسوخ شده‌اند و در پایتون 3.0 حذف خواهند شد: al و AL، cd، cddb، cdplayer، CL و cl، DEVICE، ERRNO، FILE، FL و fl، flp، fm، GET، GLWS، GL و gl، IN، IOCTL، jpeg، panelparser، readcd، SV و sv، torgb، videoreader و WAIT.

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

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

  • کلاس‌هایی که قرار نیست هش‌پذیر باشند، باید __hash__ = None را در تعریف خود قرار دهند تا این موضوع را نشان دهند.

  • استثناهای رشته‌ای حذف شده‌اند. تلاش برای استفاده از آن‌ها باعث ایجاد یک TypeError می‌شود.

  • متد __init__() از collections.deque اکنون پیش از افزودن عناصر از شیء پیمایش‌پذیر، هر محتوای موجود در صف دوطرفه را پاک می‌کند. این تغییر باعث می‌شود رفتار آن با list.__init__() مطابقت داشته باشد.

  • object.__init__() پیش‌تر آرگومان‌های دلخواه و آرگومان‌های کلیدواژه‌ای را می‌پذیرفت و آن‌ها را نادیده می‌گرفت. در پایتون 2.6، این دیگر مجاز نیست و منجر به TypeError خواهد شد. این بر متدهای __init__() که در نهایت متد متناظر را روی object فراخوانی می‌کنند (احتمالاً از طریق استفاده از super()) تأثیر می‌گذارد. برای بحث درباره‌ی این موضوع، bpo-1683368 را ببینید.

  • سازنده‌ی Decimal اکنون هنگامی که رشته‌ای به آن داده شود، فضای سفید ابتدایی و انتهایی را می‌پذیرد. پیش‌تر، این سازنده استثنای InvalidOperation را ایجاد می‌کرد. از سوی دیگر، متد create_decimal() از اشیاء Context اکنون به‌طور صریح فضای سفید اضافی را نمی‌پذیرد و استثنای ConversionSyntax را ایجاد می‌کند.

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

  • C API: توابع PyImport_Import() و PyImport_ImportModule() اکنون به‌طور پیش‌فرض ایمپورت مطلق انجام می‌دهند، نه ایمپورت نسبی. این موضوع بر توسعه‌های C که ماژول‌های دیگر را ایمپورت می‌کنند تأثیر خواهد گذاشت.

  • API زبان C: نوع‌های داده‌ی توسعه‌ای که نباید هش‌پذیر باشند، باید جایگاه tp_hash خود را به PyObject_HashNotImplemented() تعریف کنند.

  • استثنای socket.error در ماژول socket اکنون از IOError ارث‌بری می‌کند. پیش‌تر این استثنا زیرکلاس StandardError نبود، اما اکنون از طریق IOError هست. (پیاده‌سازی‌شده توسط Gregory P. Smith؛ bpo-1706815.)

  • ماژول xmlrpclib دیگر به‌طور خودکار datetime.date و datetime.time را به نوع xmlrpclib.DateTime تبدیل نمی‌کند؛ معناشناسی این تبدیل لزوماً برای همه‌ی برنامه‌ها صحیح نبود. کدی که از xmlrpclib استفاده می‌کند باید نمونه‌های date و time را تبدیل کند. (bpo-1330538)

  • (حالت هشدار 3.0) کلاس Exception اکنون هنگام دسترسی از طریق اسلایس یا اندیس، هشدار می‌دهد؛ اینکه Exception مانند یک تاپل رفتار کند، در حال حذف تدریجی است.

  • (حالت هشدار 3.0) مقایسه‌های نابرابری بین دو دیکشنری یا دو شیء که متدهای مقایسه را پیاده‌سازی نکرده‌اند، به‌عنوان هشدار گزارش می‌شوند. dict1 == dict2 همچنان کار می‌کند، اما dict1 < dict2 در حال حذف تدریجی است.

    مقایسه‌های بین سلول‌ها — که جزئیات پیاده‌سازی قواعد محدوده‌بندی پایتون به شمار می‌روند — نیز باعث ایجاد هشدار می‌شوند، زیرا چنین مقایسه‌هایی در 3.0 به‌طور کامل ممنوع هستند.

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

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

قدردانی‌ها

نویسنده می‌خواهد از افراد زیر برای ارائه‌ی پیشنهادها، اصلاحات و کمک در پیش‌نویس‌های گوناگون این مقاله تشکر کند: Georg Brandl، Steve Brown، Nick Coghlan، Ralph Corderoy، Jim Jewett، Kent Johnson، Chris Lambacher، Martin Michlmayr، Antoine Pitrou و Brian Warner.