تازههای پایتون 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 در دسترس است.
تغییرات در فرایند توسعه¶
در حین توسعهی نسخهی 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 مراجعه کنید؛ در اینجا نمونهای آمده است:
|
دودویی. عدد را در مبنای ۲ خروجی میدهد. |
|
نویسه. عدد صحیح را پیش از چاپ به نویسهی یونیکدِ متناظر تبدیل میکند. |
|
عدد صحیح مبنای ده. عدد را در مبنای ۱۰ خروجی میدهد. |
|
قالب مبنای هشت. عدد را در مبنای ۸ خروجی میدهد. |
|
قالب مبنای شانزده. عدد را در مبنای ۱۶ خروجی میدهد و برای ارقام بزرگتر از ۹ از حروف کوچک استفاده میکند. |
|
نمادگذاری توان. عدد را بهصورت نماد علمی و با استفاده از حرف 'e' برای نشان دادن توان چاپ میکند. |
|
قالب عمومی. این قالب عدد را بهصورت یک عدد با ممیز ثابت چاپ میکند، مگر اینکه عدد بیش از حد بزرگ باشد که در این صورت به نماد توانی 'e' تغییر میکند. |
|
عدد. این همان '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 به پایان رسیده باشد، مقدار پیشفرض بازگردانده خواهد شد؛ در غیر این صورت، استثنایStopIterationraise خواهد شد. (در 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میتوان برای سفارشیسازی ظاهر آغازین صفحهی لاکپشت استفاده کرد.رشتههای مستند ماژول را میتوان با رشتههای مستند جدیدی که به زبان دیگری ترجمه شدهاند جایگزین کرد.
یک پارامتر اختیاری
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.