تازههای پایتون 2.7¶
- نویسنده:
A.M. Kuchling (amk at amk.ca)
این مقاله ویژگیهای جدید در پایتون 2.7 را توضیح میدهد. پایتون 2.7 در ۳ ژوئیه ۲۰۱۰ منتشر شد.
پردازش اعداد به روشهای بسیاری بهبود یافته است، هم برای اعداد ممیز شناور و هم برای کلاس Decimal. افزودنیهای مفیدی به کتابخانه استاندارد اضافه شدهاند، مانند ماژول unittest که بهطور چشمگیری ارتقا یافته است، ماژول argparse برای پارس کردن گزینههای خط فرمان، کلاسهای سودمند OrderedDict و Counter در ماژول collections، و بسیاری از بهبودهای دیگر.
پایتون 2.7 قرار است آخرین نسخه از سری 2.x باشد، بنابراین تلاش کردیم آن را به نسخهای خوب برای بلندمدت تبدیل کنیم. برای کمک به انتقال به پایتون 3، چندین ویژگی جدید از سری پایتون 3.x در 2.7 گنجانده شدهاند.
این مقاله تلاش نمیکند مشخصات کاملی از ویژگیهای جدید ارائه دهد، بلکه در عوض مروری مناسب فراهم میآورد. برای جزئیات کامل، باید به مستندات پایتون 2.7 در https://docs.python.org مراجعه کنید. اگر میخواهید منطق طراحی و پیادهسازی را درک کنید، به PEP (پیشنهاد بهبود پایتون) مربوط به ویژگی جدید خاصی، یا به مورد در https://bugs.python.org که در آن تغییری بحث شده است، مراجعه کنید. هر زمان که ممکن باشد، «تازههای پایتون» برای هر تغییر به آیتم باگ/وصل پیوند میدهد.
آیندهی Python 2.x¶
پایتون 2.7 آخرین نسخهی اصلی در سری 2.x است، زیرا نگهدارندگان پایتون تمرکز تلاشهای توسعهی ویژگیهای جدید خود را به سری پایتون 3.x منتقل کردهاند. این بدان معناست که اگرچه رفع اشکالات برای پایتون 2 همچنان ادامه دارد و این نسخه برای ساختهشدن صحیح روی سختافزارهای جدید و نسخههای سیستمعاملهای پشتیبانیشده بهروزرسانی میشود، هیچ نسخهی جدیدی با ویژگیهای کامل برای زبان یا کتابخانه استاندارد منتشر نخواهد شد.
با این حال، اگرچه زیرمجموعهی مشترک بزرگی میان Python 2.7 و Python 3 وجود دارد و بسیاری از تغییرات درگیر در مهاجرت به آن زیرمجموعهی مشترک، یا مستقیماً به Python 3، را میتوان بهصورت ایمن خودکار کرد، برخی تغییرات دیگر (بهویژه آنهایی که با مدیریت یونیکد مرتبطاند) ممکن است برای مهاجرت مؤثر به بررسی دقیق و ترجیحاً بدنههای مقاوم آزمون رگرسیون خودکار نیاز داشته باشند.
این بدان معناست که پایتون 2.7 برای مدت طولانی در جای خود باقی خواهد ماند و پلتفرم پایهای پایدار و پشتیبانیشده برای سیستمهای عملیاتی که هنوز به پایتون 3 منتقل نشدهاند، فراهم خواهد کرد. کل چرخهی حیات مورد انتظار سری پایتون 2.7 در PEP 373 بهتفصیل شرح داده شده است.
برخی از پیامدهای کلیدی اهمیت بلندمدت 2.7 عبارتاند از:
همانطور که در بالا ذکر شد، نسخهی 2.7 در مقایسه با نسخههای قبلی 2.x، دورهی نگهداری بسیار طولانیتری دارد. در حال حاضر انتظار میرود پایتون 2.7 حداقل تا سال ۲۰۲۰ (۱۰ سال پس از انتشار اولیهی آن، در مقایسه با دورهی پشتیبانی معمولتر ۱۸--۲۴ ماه) از سوی تیم توسعهی هسته پشتیبانی شود (با دریافت بهروزرسانیهای امنیتی و رفع سایر اشکالها).
همانطور که کتابخانه استاندارد پایتون 2.7 قدیمی میشود، استفاده مؤثر از شاخص بستههای پایتون (Python Package Index)، چه بهطور مستقیم و چه از طریق یک بازتوزیعکننده (redistributor)، برای کاربران پایتون 2 اهمیت بیشتری پیدا میکند. علاوه بر تنوع گستردهای از بستههای شخص ثالث برای وظایف مختلف، بستههای موجود شامل بکپورتهایی از ماژولها و قابلیتهای جدید کتابخانه استاندارد پایتون 3 که با پایتون 2 سازگار هستند، و همچنین ابزارها و کتابخانههای مختلفی است که میتوانند مهاجرت به پایتون 3 را آسانتر کنند. راهنمای کاربری بستهبندی پایتون راهنماییهایی دربارهی دانلود و نصب نرمافزار از شاخص بستههای پایتون ارائه میدهد.
در حالی که رویکرد ترجیحی برای بهبود پایتون 2 اکنون انتشار بستههای جدید در فهرست بستههای پایتون (Python Package Index) است، این رویکرد لزوماً در همه موارد کارساز نیست، بهویژه موارد مربوط به امنیت شبکه. در مواردی استثنایی که نمیتوان با انتشار بستههای جدید یا بهروزرسانیشده در PyPI بهطور کافی از پس آنها برآمد، میتوان از فرایند پیشنهاد بهبود پایتون (PEP) برای استدلال در حمایت از افزودن قابلیتهای جدید مستقیماً به کتابخانه استاندارد پایتون 2 استفاده کرد. هرگونه افزودنی از این دست، و نسخههای نگهداری که در آنها افزوده شدهاند، در بخش ویژگیهای جدید افزودهشده به نسخههای نگهداری پایتون 2.7 که در ادامه آمده است، ذکر خواهند شد.
برای پروژههایی که مایل به مهاجرت از پایتون 2 به پایتون 3 هستند، یا برای توسعهدهندگان کتابخانهها و چارچوبها که میخواهند از کاربران هر دو نسخهی پایتون 2 و پایتون 3 پشتیبانی کنند، ابزارها و راهنماهای گوناگونی در دسترس است که به تصمیمگیری دربارهی رویکردی مناسب و مدیریت برخی از جزئیات فنی مربوط کمک میکنند. نقطهی شروع پیشنهادی، راهنمای عملی چگونه کد پایتون 2 را به پایتون 3 منتقل کنیم است.
تغییرات در مدیریت هشدارهای منسوخشدگی¶
برای پایتون 2.7، تصمیمی سیاستی گرفته شد تا هشدارهایی که تنها برای توسعهدهندگان اهمیت دارند بهطور پیشفرض خاموش شوند. اکنون DeprecationWarning و زیرکلاسهای آن، مگر آنکه خلاف آن درخواست شود، نادیده گرفته میشوند؛ این امر مانع از آن میشود که کاربران هشدارهایی را که توسط یک برنامه ایجاد شدهاند ببینند. این تغییر در شاخهای که به پایتون 3.2 تبدیل شد نیز اعمال شد. (در stdlib-sig بحث شد و در bpo-7319 انجام شد.)
در نسخههای پیشین، پیامهای DeprecationWarning بهصورت پیشفرض فعال بودند و به توسعهدهندگان پایتون نشان روشنی میدادند که کدشان ممکن است در نسخهی اصلی (major) آیندهی پایتون در کجا بشکند.
با این حال، شمار کاربران برنامههای مبتنی بر پایتون که مستقیماً در توسعهی این برنامهها نقشی ندارند، روزبهروز بیشتر میشود. پیامهای DeprecationWarning برای چنین کاربرانی بیربط است؛ این پیامها باعث میشوند کاربران دربارهی برنامهای که در واقع بهدرستی کار میکند نگران شوند و بار پاسخگویی به این نگرانیها را بر دوش توسعهدهندگان برنامه میگذارند.
میتوانید نمایش پیامهای DeprecationWarning را با اجرای پایتون بههمراه سوییچ -Wdefault (شکل کوتاه: -Wd)، یا با تنظیم متغیر محیطی PYTHONWARNINGS روی "default" (یا "d") پیش از اجرای پایتون، دوباره فعال کنید. کد پایتون نیز میتواند آنها را با فراخوانی warnings.simplefilter('default') دوباره فعال کند.
ماژول unittest همچنین هنگام اجرای آزمونها، هشدارهای منسوخشدن را بهطور خودکار دوباره فعال میکند.
قابلیتهای Python 3.1¶
درست همانطور که پایتون 2.6 ویژگیهایی از پایتون 3.0 را در بر گرفت، نسخه 2.7 نیز برخی از ویژگیهای جدید پایتون 3.1 را در بر میگیرد. سری 2.x همچنان ابزارهایی برای مهاجرت به سری 3.x ارائه میدهد.
فهرست ناقصی از قابلیتهای 3.1 که به نسخه 2.7 بکپورت شدهاند:
سینتکس مقادیر لفظی مجموعه (
{1,2,3}یک مجموعه تغییرپذیر است).درک دیکشنری و درک مجموعه (
{i: i*2 for i in range(3)}).چندین مدیر زمینه در یک دستور
with.نسخهی جدید کتابخانهی
ioکه برای کارایی بیشتر به زبان C بازنویسی شده است.نوع دیکشنری مرتب که در PEP 372: افزودن دیکشنری مرتب به collections توصیف شده است.
مشخصکنندهی قالب جدید
","که در PEP 378: مشخصکننده قالب برای جداکننده هزارگان توضیح داده شده است.شیء
memoryview.زیرمجموعهی کوچکی از ماژول
importlib، که در ادامه توصیف شده است.repr()برای عدد اعشاریxدر بسیاری از موارد کوتاهتر است: اکنون بر پایهی کوتاهترین رشتهی مبنای دهای است که تضمین میشود با گرد کردن، بهxبازگردد. مانند نسخههای پیشین پایتون، تضمین شده است کهfloat(repr(x))مقدارxرا بازیابی میکند.تبدیل عدد ممیز شناور به رشته و رشته به عدد ممیز شناور بهدرستی گرد میشود. تابع
round()نیز اکنون بهدرستی گرد میکند.نوع
PyCapsule، که برای فراهم کردن یک API زبان C برای ماژولهای توسعهای استفاده میشود.تابع
PyLong_AsLongAndOverflow()در API زبان C.
سایر هشدارهای جدید حالت Python3 عبارتاند از:
operator.isCallable()وoperator.sequenceIncludes()که در 3.x پشتیبانی نمیشوند، اکنون هشدار ایجاد میکنند.سوییچ
-3اکنون بهطور خودکار سوییچ-Qwarnرا فعال میکند که هشدارهایی دربارهی استفاده از تقسیم کلاسیک روی اعداد صحیح و اعداد صحیح بلند ایجاد میکند.
PEP 372: افزودن دیکشنری مرتب به collections¶
دیکشنریهای معمولی پایتون، جفتهای کلید/مقدار را به ترتیب دلخواه پیمایش میکنند. طی سالها، تعدادی از نویسندگان پیادهسازیهای جایگزینی نوشتهاند که ترتیب درج اولیهی کلیدها را به یاد میسپارند. بر اساس تجربههای حاصل از آن پیادهسازیها، نسخهی 2.7 کلاس جدید OrderedDict را در ماژول collections معرفی میکند.
API مربوط به OrderedDict همان رابط دیکشنریهای معمولی را فراهم میکند، اما کلیدها و مقادیر را به ترتیبی تضمینشده که به زمان نخستین درج هر کلید بستگی دارد، پیمایش میکند:
>>> from collections import OrderedDict
>>> d = OrderedDict([('first', 1),
... ('second', 2),
... ('third', 3)])
>>> d.items()
[('first', 1), ('second', 2), ('third', 3)]
اگر ورودی جدیدی ورودی موجود را بازنویسی کند، موقعیت درج اصلی بدون تغییر باقی میماند:
>>> d['second'] = 4
>>> d.items()
[('first', 1), ('second', 4), ('third', 3)]
حذف یک ورودی و درج مجدد آن، آن را به انتها منتقل میکند:
>>> del d['second']
>>> d['second'] = 5
>>> d.items()
[('first', 1), ('third', 3), ('second', 5)]
متد popitem() یک آرگومان اختیاری last دارد که مقدار پیشفرض آن True است. اگر last درست باشد، آخرین کلید افزودهشده برگردانده و حذف میشود؛ اگر نادرست باشد، قدیمیترین کلید انتخاب میشود:
>>> od = OrderedDict([(x,0) for x in range(20)])
>>> od.popitem()
(19, 0)
>>> od.popitem()
(18, 0)
>>> od.popitem(last=False)
(0, 0)
>>> od.popitem(last=False)
(1, 0)
مقایسهی دو دیکشنری مرتب، هم کلیدها و هم مقادیر را بررسی میکند و نیازمند آن است که ترتیب درج یکسان باشد:
>>> od1 = OrderedDict([('first', 1),
... ('second', 2),
... ('third', 3)])
>>> od2 = OrderedDict([('third', 3),
... ('first', 1),
... ('second', 2)])
>>> od1 == od2
False
>>> # Move 'third' key to the end
>>> del od2['third']; od2['third'] = 3
>>> od1 == od2
True
مقایسهی یک OrderedDict با یک دیکشنری معمولی، ترتیب درج را نادیده میگیرد و فقط کلیدها و مقادیر را مقایسه میکند.
OrderedDict چگونه کار میکند؟ این کلاس یک فهرست پیوندی دوطرفه از کلیدها را نگه میدارد و کلیدهای جدید را هنگام درج به فهرست میافزاید. یک دیکشنری ثانویه کلیدها را به گرههای متناظرشان در فهرست نگاشت میکند، بهطوری که حذف نیازی به پیمایش کل فهرست پیوندی ندارد و بنابراین O(1) باقی میماند.
کتابخانه استاندارد اکنون از استفاده از دیکشنریهای مرتب در چندین ماژول پشتیبانی میکند.
ماژول
ConfigParserبهصورت پیشفرض از آنها استفاده میکند؛ به این معنا که پروندههای پیکربندی اکنون میتوانند به ترتیب اصلی خود خوانده، تغییر داده و سپس بازنوشته شوند.متد
_asdict()برایcollections.namedtuple()اکنون یک دیکشنری مرتب بازمیگرداند که مقدارهای آن به همان ترتیب اندیسهای تاپل زیرین ظاهر میشوند.سازندهی کلاس
JSONDecoderدر ماژولjsonبا پارامتر object_pairs_hook توسعه یافت تا کدگشا بتواند نمونههایOrderedDictرا بسازد. پشتیبانی از ابزارهای شخص ثالث مانند PyYAML نیز اضافه شد.
همچنین ملاحظه نمائید
- PEP 372 - افزودن دیکشنری مرتب به collections
PEP نوشتهشده توسط آرمین روناکر و ریموند هتینگر؛ پیادهسازیشده توسط ریموند هتینگر.
PEP 378: مشخصکننده قالب برای جداکننده هزارگان¶
برای خواناتر شدن خروجی برنامه، ممکن است مفید باشد که به اعداد بزرگ جداکننده اضافه شود تا بهجای 18446744073709551616 بهصورت 18,446,744,073,709,551,616 نمایش داده شوند.
راهحل کاملاً عمومی برای انجام این کار، ماژول locale است که میتواند از جداکنندههای متفاوت ("," در آمریکای شمالی، "." در اروپا) و اندازههای گروهبندی متفاوت استفاده کند، اما استفاده از locale پیچیده است و برای برنامههای چندنخی که نخهای مختلفی برای localeهای گوناگون خروجی تولید میکنند، مناسب نیست.
بنابراین، سازوکار سادهای برای گروهبندی با کاما به زبان کوچک (mini-language) مورد استفاده در متد str.format() افزوده شده است. هنگام قالببندی یک عدد ممیز شناور، کافی است یک کاما بین عرض و دقت قرار دهید:
>>> '{:20,.2f}'.format(18446744073709551616.0)
'18,446,744,073,709,551,616.00'
هنگام قالببندی یک عدد صحیح، ویرگول را پس از عرض قرار دهید:
>>> '{:20,d}'.format(18446744073709551616)
'18,446,744,073,709,551,616'
این سازوکار بههیچوجه قابل تنظیم نیست؛ همیشه از ویرگول بهعنوان جداکننده استفاده میشود و گروهبندی همیشه بهصورت گروههای سهرقمی است. سازوکار قالببندی ویرگولی به اندازهی ماژول locale عمومی نیست، اما استفاده از آن آسانتر است.
همچنین ملاحظه نمائید
- PEP 378 - مشخصکننده قالب برای جداکننده هزارگان
PEP نوشتهشده توسط Raymond Hettinger؛ پیادهسازیشده توسط Eric Smith.
PEP 389: ماژول argparse برای تجزیه خط فرمان¶
ماژول argparse برای تجزیه آرگومانهای خط فرمان، بهعنوان جایگزینی قدرتمندتر برای ماژول optparse افزوده شد.
این بدان معناست که پایتون اکنون از سه ماژول متفاوت برای پارس کردن آرگومانهای خط فرمان پشتیبانی میکند: getopt، optparse و argparse. ماژول getopt شباهت نزدیکی به تابع getopt() کتابخانهی C دارد، بنابراین اگر در حال نوشتن پیشنمونهای پایتونی هستید که در نهایت در C بازنویسی خواهد شد، این ماژول همچنان مفید است. optparse زائد میشود، اما هیچ برنامهای برای حذف آن وجود ندارد، زیرا هنوز اسکریپتهای زیادی از آن استفاده میکنند و هیچ راه خودکاری برای بهروزرسانی این اسکریپتها وجود ندارد. (سازگار کردن API ماژول argparse با رابط optparse مورد بحث قرار گرفت، اما به دلیل بههمریختگی و دشواری بیش از حد رد شد.)
بهطور خلاصه، اگر در حال نوشتن اسکریپت جدیدی هستید و نیازی به نگرانی درباره سازگاری با نسخههای قبلی پایتون ندارید، به جای optparse از argparse استفاده کنید.
در ادامه یک مثال آمده است:
import argparse
parser = argparse.ArgumentParser(description='Command-line example.')
# Add optional switches
parser.add_argument('-v', action='store_true', dest='is_verbose',
help='produce verbose output')
parser.add_argument('-o', action='store', dest='output',
metavar='FILE',
help='direct output to FILE instead of stdout')
parser.add_argument('-C', action='store', type=int, dest='context',
metavar='NUM', default=0,
help='display NUM lines of added context')
# Allow any number of additional arguments.
parser.add_argument(nargs='*', action='store', dest='inputs',
help='input filenames (default is stdin)')
args = parser.parse_args()
print args.__dict__
مگر اینکه آن را بازنویسی کنید، سوییچهای -h و --help بهطور خودکار اضافه میشوند و خروجی مرتب و قالببندیشده تولید میکنند:
-> ./python.exe argparse-example.py --help
usage: argparse-example.py [-h] [-v] [-o FILE] [-C NUM] [inputs [inputs ...]]
Command-line example.
positional arguments:
inputs input filenames (default is stdin)
optional arguments:
-h, --help show this help message and exit
-v produce verbose output
-o FILE direct output to FILE instead of stdout
-C NUM display NUM lines of added context
مانند optparse، سوییچها و آرگومانهای خط فرمان بهصورت یک شیء با ویژگیهایی که نام آنها توسط پارامترهای dest مشخص میشود، بازگردانده میشوند:
-> ./python.exe argparse-example.py -v
{'output': None,
'is_verbose': True,
'context': 0,
'inputs': []}
-> ./python.exe argparse-example.py -v -o /tmp/output -C 4 file1 file2
{'output': '/tmp/output',
'is_verbose': True,
'context': 4,
'inputs': ['file1', 'file2']}
argparse اعتبارسنجی بسیار پیشرفتهتری نسبت به optparse دارد؛ میتوانید تعداد دقیق آرگومانها را بهصورت یک عدد صحیح مشخص کنید، ۰ یا بیشتر آرگومان را با ارسال '*'، ۱ یا بیشتر را با ارسال '+'، یا یک آرگومان اختیاری را با ارسال '?'. یک پارسر سطحبالا میتواند شامل زیرپارسرهایی برای تعریف زیرفرمانهایی باشد که مجموعههای متفاوتی از سوییچها دارند، مانند svn commit و svn checkout و غیره. میتوانید نوع یک آرگومان را بهصورت FileType مشخص کنید که بهطور خودکار پروندهها را برای شما باز میکند و درک میکند که '-' به معنای ورودی یا خروجی استاندارد است.
همچنین ملاحظه نمائید
- مستندات
argparse صفحه مستندات ماژول argparse.
- مهاجرت کد optparse به argparse
بخشی از مستندات پایتون که توضیح میدهد چگونه کدی را که از
optparseاستفاده میکند تبدیل کنید.- PEP 389 - argparse - ماژول جدید تجزیه خط فرمان
این PEP توسط استیون بثارد نوشته و پیادهسازی شده است.
PEP 391: پیکربندی مبتنی بر دیکشنری برای گزارشگیری¶
ماژول logging بسیار انعطافپذیر است؛ برنامهها میتوانند درختی از زیرسیستمهای گزارشگیری تعریف کنند و هر گزارشگیر در این درخت میتواند پیامهای خاصی را فیلتر کند، آنها را به شکل متفاوتی قالببندی کند و پیامها را به تعداد متغیری از هندلرها هدایت کند.
همهی این انعطافپذیری میتواند به پیکربندی زیادی نیاز داشته باشد. میتوانید دستورهای پایتون بنویسید تا اشیاء را ایجاد و ویژگیهایشان را تنظیم کنید، اما راهاندازی پیچیده نیازمند کدی پرجزئیات اما خستهکننده است. logging همچنین از تابع fileConfig() پشتیبانی میکند که یک پرونده را تجزیه میکند، اما قالب پرونده از پیکربندی فیلترها پشتیبانی نمیکند و تولید آن بهصورت برنامهای نیز دردسرسازتر است.
پایتون 2.7 تابع dictConfig() را اضافه میکند که از یک دیکشنری برای پیکربندی گزارشگیری استفاده میکند. راههای زیادی برای تولید دیکشنری از منابع مختلف وجود دارد: ساختن آن با کد؛ تجزیهی پروندهای حاوی JSON؛ یا استفاده از کتابخانهی تجزیهی YAML در صورت نصب بودن آن. برای اطلاعات بیشتر به توابع پیکربندی مراجعه کنید.
مثال زیر دو گزارشگیر را پیکربندی میکند: گزارشگیر ریشه و گزارشگیری به نام "network". پیامهایی که به گزارشگیر ریشه فرستاده میشوند، با استفاده از پروتکل syslog به گزارش سیستم ارسال خواهند شد و پیامهای ارسالی به گزارشگیر "network" در پروندهی network.log نوشته خواهند شد؛ این پرونده به محض رسیدن گزارش به ۱ مگابایت چرخانده خواهد شد.
import logging
import logging.config
configdict = {
'version': 1, # Configuration schema in use; must be 1 for now
'formatters': {
'standard': {
'format': ('%(asctime)s %(name)-15s '
'%(levelname)-8s %(message)s')}},
'handlers': {'netlog': {'backupCount': 10,
'class': 'logging.handlers.RotatingFileHandler',
'filename': '/logs/network.log',
'formatter': 'standard',
'level': 'INFO',
'maxBytes': 1000000},
'syslog': {'class': 'logging.handlers.SysLogHandler',
'formatter': 'standard',
'level': 'ERROR'}},
# Specify all the subordinate loggers
'loggers': {
'network': {
'handlers': ['netlog']
}
},
# Specify properties of the root logger
'root': {
'handlers': ['syslog']
},
}
# Set up configuration
logging.config.dictConfig(configdict)
# As an example, log two error messages
logger = logging.getLogger('/')
logger.error('Database not found')
netlogger = logging.getLogger('network')
netlogger.error('Connection failed')
سه بهبود کوچکتر در ماژول logging، که همگی توسط Vinay Sajip پیادهسازی شدهاند، عبارتاند از:
کلاس
SysLogHandlerاکنون از syslog از طریق TCP پشتیبانی میکند. سازنده دارای پارامتر socktype است که نوع سوکت مورد استفاده را تعیین میکند: یاsocket.SOCK_DGRAMبرای UDP یاsocket.SOCK_STREAMبرای TCP. پروتکل پیشفرض همچنان UDP است.متد
getChild()به نمونههایLoggerاضافه شد که با استفاده از یک مسیر نسبی، یک گزارشگیر فرزند را بازیابی میکند. برای مثال، وقتی با اجرایlog = getLogger('app')یک گزارشگیر را بازیابی کنید، فراخوانیlog.getChild('network.listen')معادلgetLogger('app.network.listen')است.به کلاس
LoggerAdapterمتدisEnabledFor()اضافه شد که یک سطح میگیرد و برمیگرداند که آیا گزارشگیر زیرین پیامی با آن سطح از اهمیت را پردازش میکند یا خیر.
همچنین ملاحظه نمائید
- PEP 391 - پیکربندی مبتنی بر دیکشنری برای گزارشگیری
PEP توسط وینای ساجیپ نوشته و پیادهسازی شده است.
PEP 3106: نماهای دیکشنری¶
متدهای دیکشنری keys()، values() و items() در پایتون 3.x متفاوت هستند. آنها بهجای فهرستی کاملاً عینیتیافته (materialized)، شیئی به نام نما <view> برمیگردانند.
تغییر مقادیر بازگشتیِ keys()، values() و items() در پایتون 2.7 ممکن نیست، زیرا کدهای زیادی میشکستند. در عوض، نسخههای 3.x با نامهای جدید viewkeys()، viewvalues() و viewitems() افزوده شدند.
>>> d = dict((i*10, chr(65+i)) for i in range(26))
>>> d
{0: 'A', 130: 'N', 10: 'B', 140: 'O', 20: ..., 250: 'Z'}
>>> d.viewkeys()
dict_keys([0, 130, 10, 140, 20, 150, 30, ..., 250])
نماها را میتوان پیمایش کرد، اما نماهای کلید و آیتم مانند مجموعهها نیز رفتار میکنند. عملگر & اشتراک را انجام میدهد و | اجتماع را انجام میدهد:
>>> d1 = dict((i*10, chr(65+i)) for i in range(26))
>>> d2 = dict((i**.5, i) for i in range(1000))
>>> d1.viewkeys() & d2.viewkeys()
set([0.0, 10.0, 20.0, 30.0])
>>> d1.viewkeys() | range(0, 30)
set([0, 1, 130, 3, 4, 5, 6, ..., 120, 250])
نما دیکشنری را پیگیری میکند و با تغییر دیکشنری، محتوای آن نیز تغییر میکند:
>>> vk = d.viewkeys()
>>> vk
dict_keys([0, 130, 10, ..., 250])
>>> d[260] = '&'
>>> vk
dict_keys([0, 130, 260, 10, ..., 250])
با این حال، توجه داشته باشید که در حین پیمایش روی نما نمیتوانید کلیدها را اضافه یا حذف کنید:
>>> for k in vk:
... d[k*2] = k
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: dictionary changed size during iteration
میتوانید از متدهای نما در کد پایتون 2.x استفاده کنید و مبدل 2to3 آنها را به متدهای استاندارد keys()، values() و items() تغییر میدهد.
PEP 3137: شیء memoryview¶
شیء memoryview نمایی از محتوای حافظهی شیء دیگر فراهم میکند که با رابط نوع bytes مطابقت دارد.
>>> import string
>>> m = memoryview(string.letters)
>>> m
<memory at 0x37f850>
>>> len(m) # Returns length of underlying object
52
>>> m[0], m[25], m[26] # Indexing returns one byte
('a', 'z', 'A')
>>> m2 = m[0:26] # Slicing returns another memoryview
>>> m2
<memory at 0x37f080>
محتوای نما را میتوان به رشتهای از بایتها یا فهرستی از اعداد صحیح تبدیل کرد:
>>> m2.tobytes()
'abcdefghijklmnopqrstuvwxyz'
>>> m2.tolist()
[97, 98, 99, 100, 101, 102, 103, ... 121, 122]
>>>
شیءهای memoryview در صورتی که شیء زیرین تغییرپذیر باشد، اجازه میدهند آن را تغییر دهید.
>>> m2[0] = 75
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot modify read-only memory
>>> b = bytearray(string.letters) # Creating a mutable object
>>> b
bytearray(b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
>>> mb = memoryview(b)
>>> mb[0] = '*' # Assign to view, changing the bytearray.
>>> b[0:5] # The bytearray has been changed.
bytearray(b'*bcde')
>>>
سایر تغییرات زبان¶
برخی از تغییرات کوچکتری که در هستهی زبان پایتون اعمال شدهاند، عبارتاند از:
سینتکس مقادیر لفظی مجموعه از پایتون 3.x به نسخههای قدیمیتر بکپورت شده است. از آکولادها برای دربرگرفتن محتویات مجموعهی تغییرپذیر حاصل استفاده میشود؛ مقادیر لفظی مجموعه با نداشتن دو نقطه و مقادیر، از دیکشنریها متمایز میشوند.
{}همچنان یک دیکشنری خالی را نشان میدهد؛ برای مجموعهی خالی ازset()استفاده کنید.>>> {1, 2, 3, 4, 5} set([1, 2, 3, 4, 5]) >>> set() # empty set set([]) >>> {} # empty dict {}
بکپورتشده به نسخههای پیشین توسط Alexandre Vassalotti؛ bpo-2335.
درکهای دیکشنری و مجموعه ویژگی دیگری هستند که از 3.x بکپورت شدهاند و درکهای فهرستی/تولیدگر را بهگونهای تعمیم میدهند که از سینتکس لفظی مجموعهها و دیکشنریها استفاده کنند.
>>> {x: x*x for x in range(6)} {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25} >>> {('a'*x) for x in range(6)} set(['', 'a', 'aa', 'aaa', 'aaaa', 'aaaaa'])
بکپورت شده توسط الکساندر واسالوتی؛ bpo-2333.
دستور
withاکنون میتواند از چندین مدیر زمینه در یک دستور استفاده کند. مدیران زمینه از چپ به راست پردازش میشوند و هر یک به عنوان آغاز یک دستورwithجدید در نظر گرفته میشود. این بدان معناست که:with A() as a, B() as b: ... suite of statements ...
معادل است با:
with A() as a: with B() as b: ... suite of statements ...
تابع
contextlib.nested()کارکردی بسیار مشابه ارائه میدهد، بنابراین دیگر ضروری نیست و منسوخ شده است.(پیشنهادشده در https://codereview.appspot.com/53094؛ پیادهسازیشده توسط Georg Brandl.)
تبدیلهای بین اعداد ممیز شناور و رشتهها اکنون در بیشتر پلتفرمها بهدرستی گرد میشوند. این تبدیلها در بسیاری از مکانهای مختلف رخ میدهند:
str()روی اعداد اعشاری و مختلط؛ سازندههایfloatوcomplex؛ قالببندی عددی؛ سریالسازی و سریالزدایی اعداد اعشاری و مختلط با استفاده از ماژولهایmarshal،pickleوjson؛ تجزیهی مقادیر لفظی اعشاری و موهومی در کد پایتون؛ و تبدیلDecimalبه عدد اعشاری.در ارتباط با این موضوع،
repr()یک عدد ممیز شناور x اکنون نتیجهای را برمیگرداند که بر اساس کوتاهترین رشتهی اعشاریای است که تضمین شده تحت گرد کردن صحیح (با حالت گرد کردن نصف به زوج) دوباره به x گرد شود. پیشتر، رشتهای بر اساس گرد کردن x به ۱۷ رقم اعشاری میداد.کتابخانه گرد کردن مسئول این بهبود، روی ویندوز و روی پلتفرمهای یونیکس که از کامپایلرهای gcc، icc یا suncc استفاده میکنند کار میکند. ممکن است تعداد کمی پلتفرم وجود داشته باشد که نتوان عملکرد صحیح این کد را در آنها تضمین کرد، بنابراین در چنین سیستمهایی از این کد استفاده نمیشود. میتوانید با بررسی
sys.float_repr_styleمتوجه شوید که از کدام کد استفاده میشود؛ این مقدار در صورت استفاده از کد جدیدshortو در غیر این صورتlegacyخواهد بود.پیادهسازیشده توسط Eric Smith و Mark Dickinson، با استفاده از کتابخانهی
dtoa.cنوشتهی David Gay؛ bpo-7117.تبدیل اعداد صحیح بلند و اعداد صحیح معمولی به ممیز شناور اکنون به شکل متفاوتی گرد میشود و نزدیکترین عدد ممیز شناور به آن عدد را برمیگرداند. این موضوع برای اعداد صحیح کوچکی که میتوان آنها را دقیقاً تبدیل کرد اهمیتی ندارد، اما برای اعداد بزرگی که ناگزیر دقت را از دست میدهند، پایتون 2.7 اکنون تقریب نزدیکتری میزند. برای مثال، پایتون 2.6 موارد زیر را محاسبه میکرد:
>>> n = 295147905179352891391 >>> float(n) 2.9514790517935283e+20 >>> n - long(float(n)) 65535L
نتیجه ممیز شناور پایتون 2.7 بزرگتر است، اما بسیار نزدیکتر به مقدار واقعی:
>>> n = 295147905179352891391 >>> float(n) 2.9514790517935289e+20 >>> n - long(float(n)) -1L
(پیادهسازیشده توسط Mark Dickinson؛ bpo-3166.)
تقسیم اعداد صحیح نیز در رفتار گرد کردن خود دقیقتر است. (همچنین توسط Mark Dickinson پیادهسازی شده است؛ bpo-1811.)
تبدیل ضمنی نوع برای اعداد مختلط حذف شده است؛ مفسر دیگر هرگز تلاش نخواهد کرد که متد
__coerce__()را روی اشیاء مختلط فراخوانی کند. (حذف شده توسط Meador Inge و Mark Dickinson؛ bpo-5211.)متد
str.format()اکنون از شمارهگذاری خودکار فیلدهای جایگزینی پشتیبانی میکند. این باعث میشود استفاده ازstr.format()بیشتر شبیه به استفاده از قالببندی%sباشد:>>> '{}:{}:{}'.format(2009, 04, 'Sunday') '2009:4:Sunday' >>> '{}:{}:{day}'.format(2009, 4, day='Sunday') '2009:4:Sunday'
شمارهگذاری خودکار فیلدها را از چپ به راست در نظر میگیرد؛ بنابراین نخستین مشخصگر
{...}از نخستین آرگومانِstr.format()استفاده خواهد کرد، مشخصگر بعدی از آرگومان بعدی، و به همین ترتیب. شما نمیتوانید شمارهگذاری خودکار و شمارهگذاری صریح را با هم ترکیب کنید — یا همهی فیلدهای مشخصگرتان را شمارهگذاری کنید یا هیچکدام را — اما میتوانید شمارهگذاری خودکار را با فیلدهای نامدار ترکیب کنید، همانطور که در مثال دومِ بالا آمده است. (ارائهشده توسط اریک اسمیت؛ bpo-5237.)اعداد مختلط اکنون بهدرستی از استفاده با
format()پشتیبانی میکنند و بهطور پیشفرض راستچین هستند. مشخص کردن دقت یا جداسازی با کاما بر هر دو بخش حقیقی و موهومی عدد اعمال میشود، اما عرض فیلد و چینشِ مشخصشده بر کل خروجی1.5+3jحاصل اعمال میشود. (ارائهشده توسط اریک اسمیت؛ bpo-1588 و bpo-7988.)کد قالب 'F' اکنون همیشه خروجی خود را با نویسههای بزرگ قالببندی میکند، بنابراین اکنون 'INF' و 'NAN' تولید خواهد کرد. (مشارکت اریک اسمیت؛ bpo-3382.)
یک تغییر در سطح پایین: متد
object.__format__()اکنون اگر یک رشته قالببندی به آن ارسال شود، هشدارPendingDeprecationWarningرا ایجاد میکند، زیرا متد__format__()برایobjectشیء را به بازنمایی رشتهای تبدیل کرده و آن را قالببندی میکند. پیشتر این متد رشته قالببندی را بهصورت بیصدا روی بازنمایی رشتهای اعمال میکرد، اما این میتوانست اشتباههایی را در کد پایتون پنهان کند. اگر شما اطلاعات قالببندی مانند ترازبندی یا دقت را ارائه میکنید، احتمالاً انتظار دارید که قالببندی به شیوهای مخصوص آن شیء اعمال شود. (توسط اریک اسمیت اصلاح شد؛ bpo-7994.)نوعهای
int()وlong()متدbit_lengthرا به دست آوردند که تعداد بیتهای لازم برای نمایش آرگومان خود در مبنای دودویی را برمیگرداند:>>> n = 37 >>> bin(n) '0b100101' >>> n.bit_length() 6 >>> n = 2**123-1 >>> n.bit_length() 123 >>> (n+1).bit_length() 124
(مشارکت فردریک یوهانسون و ویکتور استینر؛ bpo-3439.)
دستور
importاگر یک ایمپورت نسبی (مثلاًfrom .os import sep) شکست بخورد، دیگر یک ایمپورت مطلق را امتحان نخواهد کرد. این کار یک اشکال را رفع میکند، اما ممکن است برخی دستورهایimportرا که صرفاً بهطور تصادفی کار میکردند، از کار بیندازد. (اصلاح توسط Meador Inge؛ bpo-7902.)اکنون برای یک زیرکلاس از نوع توکار
unicodeامکانپذیر است که متد__unicode__()را بازتعریف کند. (پیادهسازی توسط Victor Stinner؛ bpo-1583863.)متد
translate()نوعbytearrayاکنونNoneرا بهعنوان آرگومان اول خود میپذیرد. (اصلاحشده توسط Georg Brandl؛ bpo-4759.)هنگام استفاده از
@classmethodو@staticmethodبرای پوشش دادن متدها بهعنوان متدهای کلاس یا متدهای ایستا، شیء پوششی اکنون تابع پوششدادهشده را بهعنوان ویژگی__func__خود در دسترس قرار میدهد. (مشارکتشده توسط Amaury Forgeot d'Arc، پس از پیشنهاد George Sakkis؛ bpo-5982.)وقتی مجموعهی محدودی از ویژگیها با استفاده از
__slots__تنظیم شده بود، حذف یک ویژگی تنظیمنشده همانطور که انتظار میرفتAttributeErrorایجاد نمیکرد. این مشکل توسط Benjamin Peterson برطرف شد؛ bpo-7604.)اکنون دو کدگذاری جدید مورد پشتیبانی قرار میگیرند: «cp720» که عمدتاً برای متن عربی به کار میرود؛ و «cp858»، گونهای از CP 850 که نماد یورو را اضافه میکند. (CP720 با مشارکت Alexander Belchenko و Amaury Forgeot d'Arc در bpo-1616979؛ CP858 با مشارکت Tim Hatch در bpo-8016.)
شیء
fileاکنون هنگام تلاش برای باز کردن یک پوشه در پلتفرمهای POSIX، ویژگیfilenameرا روی استثنایIOErrorتنظیم میکند (توسط Jan Kaliszewski اشاره شد؛ bpo-4764)، و بهجای اعتماد به کتابخانه C برای گرفتن و گزارش خطا، اکنون بهطور صریح نوشتن در اشیاء پروندهی فقطخواندنی را بررسی میکند و ممنوع میکند (توسط Stefan Krah برطرف شد؛ bpo-5677).خود توکنساز پایتون اکنون پایان سطرها را تبدیل میکند، بنابراین تابع توکار
compile()اکنون کدی را که از هر قرارداد پایان سطر استفاده میکند، میپذیرد. بهعلاوه، این تابع دیگر الزام نمیکند که کد با یک سطر جدید پایان یابد.در پایتون 3.x، پرانتزهای اضافی در تعریف توابع غیرمجاز هستند، به این معنا که از
def f((x)): passخطای سینتکس دریافت میکنید. در حالت هشدار پایتون ۳ (Python3-warning)، پایتون 2.7 اکنون دربارهی این کاربرد عجیب هشدار میدهد. (یادداشتشده توسط James Lingard؛ bpo-7362.)اکنون میتوان به شیءهای کلاسهای قدیمی (old-style) ارجاع ضعیف ایجاد کرد. کلاسهای جدید (new-style) همیشه قابل ارجاع ضعیف بودند. (اصلاح توسط Antoine Pitrou؛ bpo-8268.)
هنگامی که یک شیء ماژول زبالهروبی میشود، دیکشنری ماژول اکنون تنها زمانی پاکسازی میشود که هیچکس دیگری ارجاعی به آن دیکشنری نگه نداشته باشد (bpo-7140).
تغییرات مفسر¶
یک متغیر محیطی جدید، PYTHONWARNINGS، امکان کنترل هشدارها را فراهم میکند. مقدار این متغیر باید رشتهای شامل تنظیمات هشدار باشد؛ تنظیماتی معادل موارد استفادهشده با سوییچ -W که با کاما از هم جدا شدهاند. (ارائهشده توسط برایان کرتین؛ bpo-7301.)
برای مثال، تنظیم زیر هشدارها را هر بار که رخ میدهند چاپ میکند، اما هشدارهای ماژول Cookie را به خطا تبدیل میکند. (سینتکس دقیق برای تنظیم یک متغیر محیطی بین سیستمعاملها و پوستههای مختلف متفاوت است.)
export PYTHONWARNINGS=all,error:::Cookie:0
بهینهسازیها¶
چندین بهبود کارایی افزوده شده است:
یک آپکد جدید برای انجام بوتاسترپینگ دستورهای
withافزوده شد که متدهای__enter__()و__exit__()را جستجو میکند. (مشارکت توسط Benjamin Peterson.)زبالهروب اکنون برای یک الگوی استفادهی رایج عملکرد بهتری دارد: زمانی که اشیاء زیادی تخصیص داده میشوند بدون اینکه هیچیک از آنها آزادسازی شود. پیشتر این کار برای زبالهروبی زمان درجه دوم میگرفت، اما اکنون تعداد زبالهروبیهای کامل با رشد تعداد اشیاء روی هیپ کاهش مییابد. منطق جدید تنها زمانی یک گذر کامل زبالهروبی انجام میدهد که نسل میانی ۱۰ بار جمعآوری شده باشد و تعداد اشیاء بازمانده از نسل میانی از ۱۰ درصد تعداد اشیاء در قدیمیترین نسل فراتر رود. (پیشنهاد Martin von Löwis و پیادهسازی Antoine Pitrou؛ bpo-4074.)
زبالهروب تلاش میکند ظرفهای سادهای را که نمیتوانند بخشی از یک چرخه باشند پیگیری نکند. در پایتون 2.7، این امر اکنون برای تاپلها و دیکشنریهای حاوی نوعهای اتمی (مانند اعداد صحیح، رشتهها و غیره) برقرار است. بهطور انتقالی، دیکشنریای که حاوی تاپلهایی از نوعهای اتمی باشد نیز پیگیری نخواهد شد. این امر با کاهش تعداد اشیایی که باید توسط زبالهروب در نظر گرفته و پیمایش شوند، به کاهش هزینهی هر زبالهروبی کمک میکند. (مشارکتشده توسط Antoine Pitrou؛ bpo-4688.)
اعداد صحیح بلند اکنون بهصورت داخلی یا در مبنای
2**15یا در مبنای2**30ذخیره میشوند و این مبنا در زمان ساخت تعیین میشود. پیشتر، آنها همیشه در مبنای2**15ذخیره میشدند. استفاده از مبنای2**30بهبودهای عملکردی چشمگیری روی رایانههای ۶۴ بیتی به همراه دارد، اما نتایج بنچمارک روی رایانههای ۳۲ بیتی مختلط بودهاند. بنابراین، پیشفرض استفاده از مبنای2**30روی رایانههای ۶۴ بیتی و مبنای2**15روی رایانههای ۳۲ بیتی است؛ در یونیکس، گزینهی جدید configure به نام--enable-big-digitsوجود دارد که میتوان از آن برای نادیده گرفتن این پیشفرض استفاده کرد.جدای از بهبودهای کارایی، این تغییر باید برای کاربران نهایی نامرئی باشد، با یک استثنا: برای اهداف آزمون و اشکالزدایی، یک دنباله ساختاری (structseq) جدید
sys.long_infoوجود دارد که اطلاعاتی درباره قالب داخلی فراهم میکند و تعداد بیتها به ازای هر رقم و اندازه بر حسب بایت نوع C استفادهشده برای ذخیرهسازی هر رقم را نشان میدهد:>>> import sys >>> sys.long_info sys.long_info(bits_per_digit=30, sizeof_digit=4)
(با مشارکت مارک دیکینسون؛ bpo-4258.)
مجموعهای دیگر از تغییرات، اشیاء long را چند بایت کوچکتر کرد: ۲ بایت کوچکتر در سیستمهای ۳۲ بیتی و ۶ بایت در سیستمهای ۶۴ بیتی. (مشارکتشده توسط Mark Dickinson؛ bpo-5260.)
الگوریتم تقسیم اعداد صحیح بلند با فشردهسازی حلقه داخلی، انجام شیفت به جای ضرب و رفع یک پیمایش اضافی غیرضروری، سریعتر شده است. بنچمارکهای مختلف، افزایش سرعتی بین ۵۰٪ تا ۱۵۰٪ را برای تقسیم اعداد صحیح بلند و عملیات باقیمانده (modulo) نشان میدهند. (مشارکتشده توسط مارک دیکینسون؛ bpo-5512.) عملیات بیتی نیز بهطور قابل توجهی سریعتر شدهاند (وصل اولیه توسط گرگوری اسمیت؛ bpo-1087418).
پیادهسازی
%بررسی میکند که آیا عملوند سمت چپ یک رشته پایتون است و آن را بهصورت ویژه مدیریت میکند؛ این امر منجر به افزایش کارایی ۱ تا ۳ درصدی برای برنامههایی میشود که بهطور مکرر از%همراه با رشتهها استفاده میکنند، مانند کتابخانههای قالبسازی. (پیادهسازیشده توسط Collin Winter؛ bpo-5176.)درکهای فهرستی که دارای شرط
ifهستند، به بایتکد سریعتری کامپایل میشوند. (وصل توسط آنتوان پیترو، بازگردانیشده (back-ported) به نسخه 2.7 توسط جفری یاسکین؛ bpo-4715.)تبدیل عدد صحیح یا عدد صحیح بلند به رشته دهدهی با پیادهسازی حالت خاص برای مبنای ۱۰، بهجای استفاده از تابع تبدیل عمومی که مبناهای دلخواه را پشتیبانی میکند، سریعتر شد. (وصله توسط گاوین بولتون؛ bpo-6713.)
متدهای
split()،replace()،rindex()،rpartition()وrsplit()در نوعهای شبهرشته (رشتهها، رشتههای یونیکد و اشیاءbytearray) اکنون بهجای پویش نویسهبهنویسه، از یک الگوریتم سریع جستوجوی معکوس استفاده میکنند. این گاهی ۱۰ برابر سریعتر است. (افزودهشده توسط Florent Xicluna؛ bpo-7462 و bpo-7622.)ماژولهای
pickleوcPickleاکنون رشتههای استفادهشده برای نام ویژگیها را بهطور خودکار درونسازی (intern) میکنند و مصرف حافظهی اشیاء حاصل از پیکلگشایی را کاهش میدهند. (مشارکت توسط جیک مکگوایر؛ bpo-5084.)ماژول
cPickleاکنون حالت خاصی را برای دیکشنریها در نظر میگیرد و زمان مورد نیاز برای پیکل کردن آنها را تقریباً نصف میکند. (با مشارکت Collin Winter؛ bpo-5670.)
ماژولهای جدید و بهبودیافته¶
مانند هر نسخه، کتابخانهی استاندارد پایتون تعدادی بهبود و رفع اشکال دریافت کرده است. در ادامه، فهرست ناقصی از برجستهترین تغییرات که به ترتیب الفبا بر اساس نام ماژول مرتب شدهاند، آمده است. برای فهرست کاملتری از تغییرات به پروندهی Misc/NEWS در درخت سورس مراجعه کنید، یا برای همهی جزئیات، گزارشهای Subversion را مرور کنید.
کلاس پایهی اشکالزدایی ماژول
bdbیعنیBdbقابلیتی برای پرش از ماژولها به دست آورد. سازنده اکنون یک شیء پیمایشپذیر حاوی الگوهایی به سبک glob مانندdjango.*را میپذیرد؛ اشکالزدا به فریمهای پشتهی ماژولی که با یکی از این الگوها مطابقت داشته باشد، وارد نمیشود. (مشارکتشده توسط Maru Newby پس از پیشنهاد Senthil Kumaran؛ bpo-5142.)ماژول
binasciiاکنون از API بافر پشتیبانی میکند، بنابراین میتوان از آن با نمونههایmemoryviewو دیگر اشیاء بافر مشابه استفاده کرد. (بکپورت شده از 3.x توسط Florent Xicluna؛ bpo-7703.)ماژول بهروزرسانیشده: ماژول
bsddbاز نسخهی 4.7.2devel9 به نسخهی 4.8.4 از بستهی pybsddb بهروزرسانی شده است. نسخهی جدید دارای سازگاری بهتر با Python 3.x و رفع اشکالات مختلف است و چندین پرچم و متد جدید BerkeleyDB اضافه میکند. (بهروزرسانی توسط Jesús Cea Avión؛ bpo-8156. تغییرنامهی pybsddb را میتوان در https://hg.jcea.es/pybsddb/file/tip/ChangeLog خواند.)کلاس
BZ2Fileدر ماژولbz2اکنون از پروتکل مدیریت زمینه پشتیبانی میکند، بنابراین میتوانیدwith bz2.BZ2File(...) as f:بنویسید. (با مشارکت Hagen Fürstenau؛ bpo-3860.)کلاس جدید: کلاس
Counterدر ماژولcollectionsبرای شمارش دادهها مفید است. نمونههایCounterعمدتاً مانند دیکشنریها رفتار میکنند، اما برای کلیدهای ناموجود، بهجای ایجاد خطایKeyErrorمقدار صفر برمیگردانند:>>> from collections import Counter >>> c = Counter() >>> for letter in 'here is a sample of english text': ... c[letter] += 1 ... >>> c Counter({' ': 6, 'e': 5, 's': 3, 'a': 2, 'i': 2, 'h': 2, 'l': 2, 't': 2, 'g': 1, 'f': 1, 'm': 1, 'o': 1, 'n': 1, 'p': 1, 'r': 1, 'x': 1}) >>> c['e'] 5 >>> c['z'] 0
سه متد دیگر برای
Counterوجود دارد.most_common()، N عنصر پرتکرارتر و شمارش آنها را برمیگرداند.elements()پیمایشگری روی عناصر موجود در آن برمیگرداند که هر عنصر را به تعداد شمارش آن تکرار میکند.subtract()یک پیمایشپذیر میگیرد و بهجای افزودن، برای هر عنصر یکی کم میکند؛ اگر آرگومان یک دیکشنری یا یکCounterدیگر باشد، شمارشها کم میشوند.>>> c.most_common(5) [(' ', 6), ('e', 5), ('s', 3), ('a', 2), ('i', 2)] >>> c.elements() -> 'a', 'a', ' ', ' ', ' ', ' ', ' ', ' ', 'e', 'e', 'e', 'e', 'e', 'g', 'f', 'i', 'i', 'h', 'h', 'm', 'l', 'l', 'o', 'n', 'p', 's', 's', 's', 'r', 't', 't', 'x' >>> c['e'] 5 >>> c.subtract('very heavy on the letter e') >>> c['e'] # Count is now lower -1
مشارکتشده توسط Raymond Hettinger؛ bpo-1696199.
کلاس جدید:
OrderedDictدر بخش پیشین PEP 372: افزودن دیکشنری مرتب به collections شرح داده شده است.متد جدید: نوع دادهی
dequeاکنون دارای متدcount()است که تعداد عناصر درون خود که برابر با آرگومان دادهشدهی x هستند را برمیگرداند، و متدreverse()که عناصر صف دوطرفه را بهصورت درجا وارونه میکند.dequeهمچنین طول بیشینهی خود را بهصورت ویژگی فقطخواندنیmaxlenدر دسترس قرار میدهد. (هر دو قابلیت توسط Raymond Hettinger افزوده شدهاند.)کلاس
namedtupleاکنون یک پارامتر اختیاری rename دارد. اگر rename درست باشد، نامهای فیلدی که به این دلیل که تکرار شدهاند یا شناسههای قانونی پایتون نیستند نامعتبر هستند، به نامهای قانونیای تغییر نام داده میشوند که از موقعیت فیلد در فهرست فیلدها برگرفته شدهاند:>>> from collections import namedtuple >>> T = namedtuple('T', ['field1', '$illegal', 'for', 'field2'], rename=True) >>> T._fields ('field1', '_1', '_2', 'field2')
(افزودهشده توسط Raymond Hettinger؛ bpo-1818.)
در نهایت، کلاس پایه انتزاعی
Mappingاکنون اگر یک نگاشت با نوع دیگری کهMappingنیست مقایسه شود،NotImplementedرا برمیگرداند. (توسط Daniel Stutzbach اصلاح شد؛ bpo-8729.)سازندههای کلاسهای تجزیهکننده در ماژول
ConfigParserاکنون پارامتر allow_no_value را میپذیرند که مقدار پیشفرض آن false است؛ اگر true باشد، گزینههای بدون مقدار مجاز خواهند بود. برای مثال:>>> import ConfigParser, StringIO >>> sample_config = """ ... [mysqld] ... user = mysql ... pid-file = /var/run/mysqld/mysqld.pid ... skip-bdb ... """ >>> config = ConfigParser.RawConfigParser(allow_no_value=True) >>> config.readfp(StringIO.StringIO(sample_config)) >>> config.get('mysqld', 'user') 'mysql' >>> print config.get('mysqld', 'skip-bdb') None >>> print config.get('mysqld', 'unknown') Traceback (most recent call last): ... NoOptionError: No option 'unknown' in section: 'mysqld'
(مشارکتشده توسط ماتس کیندال؛ bpo-7005.)
تابع منسوخشده:
contextlib.nested()، که اجازه میدهد بیش از یک مدیر زمینه با تنها یک دستورwithمدیریت شود، منسوخ شده است، زیرا دستورwithاکنون از چندین مدیر زمینه پشتیبانی میکند.ماژول
cookielibاکنون کوکیهایی را که فیلد نسخهی نامعتبر دارند، یعنی فیلدی که حاوی مقدار عدد صحیح نیست، نادیده میگیرد. (توسط John J. Lee اصلاح شد؛ bpo-3924.)تابع
deepcopy()ماژولcopyاکنون متدهای مقید به نمونه را بهدرستی کپی میکند. (پیادهسازی توسط Robert Collins؛ bpo-1515.)ماژول
ctypesاکنون برای آرگومانهایی که بهعنوان اشارهگر تعریف شدهاند، همیشهNoneرا به یک اشارهگرNULLدر C تبدیل میکند. (تغییر توسط Thomas Heller؛ bpo-4606.) کتابخانهی زیربنایی libffi به نسخه 3.0.9 بهروزرسانی شده است که شامل اصلاحهای گوناگونی برای پلتفرمهای مختلف است. (بهروزرسانی توسط Matthias Klose؛ bpo-8142.)متد جدید: کلاس
timedeltaاز ماژولdatetimeمتدtotal_seconds()را دریافت کرد که تعداد ثانیههای مدتزمان را برمیگرداند. (با مشارکت برایان کوینلان؛ bpo-5788.)متد جدید: به کلاس
Decimalمتد کلاسfrom_float()اضافه شد که تبدیل دقیق یک عدد ممیز شناور بهDecimalرا انجام میدهد. این تبدیل دقیق در پی نزدیکترین تقریب دهدهی به مقدار نمایش ممیز شناور است؛ بنابراین مقدار دهدهی حاصل، اگر عدم دقتی وجود داشته باشد، همچنان شامل آن خواهد بود. برای مثال،Decimal.from_float(0.1)مقدارDecimal('0.1000000000000000055511151231257827021181583404541015625')را برمیگرداند. (پیادهسازیشده توسط Raymond Hettinger؛ bpo-4796.)مقایسهی نمونههای
Decimalبا اعداد ممیز شناور اکنون نتایج معقولی بر اساس مقادیر عددی عملوندها تولید میکند. پیشتر چنین مقایسههایی به قواعد پیشفرض پایتون برای مقایسهی اشیاء بازگشت میکردند که نتایجی دلخواه بر اساس نوع اشیاء تولید میکرد. توجه داشته باشید که همچنان نمیتوانیدDecimalو ممیز شناور را در عملیاتهای دیگر مانند جمع ترکیب کنید، زیرا باید بهطور صریح انتخاب کنید که چگونه بین float وDecimalتبدیل انجام شود. (توسط Mark Dickinson اصلاح شد؛ bpo-2531.)سازندهی
Decimalاکنون اعداد ممیز شناور (افزودهشده توسط Raymond Hettinger؛ bpo-8257) و نویسههای یونیکد غیراروپایی مانند ارقام عربی-هندی (با مشارکت Mark Dickinson؛ bpo-6595) را میپذیرد.بیشتر متدهای کلاس
Contextاکنون علاوه بر نمونههایDecimal، اعداد صحیح را نیز میپذیرند؛ تنها استثناها متدهایcanonical()وis_canonical()هستند. (وصله توسط Juan José Conti؛ bpo-7633.)هنگام استفاده از نمونههای
Decimalبا متدformat()رشته، ترازبندی پیشفرض قبلاً چپچینی بود. این امر به راستچینی تغییر یافته است که برای نوعهای عددی منطقیتر است. (تغییر توسط Mark Dickinson؛ bpo-6857.)مقایسههای شامل مقدار NaN علامتدهنده (یا
sNAN) اکنون به جای آنکه بسته به عملگر مقایسه، بیصدا مقداری درست یا نادرست برگردانند، سیگنالInvalidOperationرا صادر میکنند. مقادیر NaN خاموش (یاNaN) اکنون هشپذیر هستند. (توسط Mark Dickinson اصلاح شد؛ bpo-7279.)ماژول
difflibاکنون از طریق یک تغییر کوچک — استفاده از نویسه تب به جای فاصلهها بهعنوان جداکننده در سرآیند حاوی نام پرونده — خروجیای تولید میکند که با ابزارهای مدرن diff/patch سازگارتر است. (اصلاح توسط Anatoly Techtonik؛ bpo-7585.)دستور
sdistدر Distutils اکنون همیشه پروندهیMANIFESTرا بازتولید میکند، زیرا حتی اگر پروندههایMANIFEST.inیاsetup.pyتغییر نکرده باشند، ممکن است کاربر پروندههای جدیدی ایجاد کرده باشد که باید گنجانده شوند. (توسط Tarek Ziadé برطرف شد؛ bpo-8688.)پرچم
IGNORE_EXCEPTION_DETAILدر ماژولdoctestاکنون نام ماژولِ حاوی استثنای مورد آزمون را نادیده میگیرد. (وصل توسط Lennart Regebro؛ bpo-7490.)کلاس
Messageاز ماژولemailاز این پس باری با مقدار یونیکد را میپذیرد و بار را بهطور خودکار به کدگذاری مشخصشده توسطoutput_charsetتبدیل میکند. (افزودهشده توسط R. David Murray؛ bpo-1368247.)کلاس
Fractionاکنون یک عدد اعشاری یا نمونهای ازDecimal، یا دو عدد گویا را بهعنوان آرگومانهای سازندهی خود میپذیرد. (پیادهسازیشده توسط Mark Dickinson؛ اعداد گویا در bpo-5812 و float/decimal در bpo-8294 اضافه شدند.)مقایسههای ترتیبی (
<،<=،>،>=) بین کسرها و اعداد مختلط اکنون یکTypeErrorایجاد میکنند. این کار یک کاستی را برطرف میکند و باعث میشودFractionبا سایر انواع عددی سازگار باشد.کلاس جدید:
FTP_TLSدر ماژولftplibاتصالات امن FTP را با استفاده از کپسولهسازی TLS برای احراز هویت و همچنین انتقالهای کنترل و دادهی بعدی فراهم میکند. (ارائهشده توسط Giampaolo Rodola؛ bpo-2054.)متد
storbinary()برای بارگذاریهای دودویی اکنون میتواند به لطف پارامتر افزودهشدهی rest، بارگذاریها را از سر بگیرد (وصل توسط Pablo Mouzo؛ bpo-6845.)دکوراتور جدید کلاس:
@~functools.total_orderingدر ماژولfunctoolsکلاسی را میگیرد که متد__eq__()و یکی از__lt__()،__le__()،__gt__()یا__ge__()را تعریف میکند، و متدهای مقایسهی مفقود را تولید میکند. از آنجا که متد__cmp__()در پایتون 3.x منسوخ میشود، این دکوراتور تعریف کلاسهای دارای ترتیب را آسانتر میکند. (افزودهشده توسط Raymond Hettinger؛ bpo-5479.)تابع جدید:
cmp_to_key()یک تابع مقایسهی قدیمی که دو آرگومان میگیرد را میپذیرد و یک فراخوانیپذیر جدید برمیگرداند که میتوان از آن بهعنوان پارامتر کلید در توابعی مانندsorted()،min()وmax()و غیره استفاده کرد. کاربرد اصلی موردنظر، کمک به سازگار کردن کد با پایتون 3.x است. (افزودهشده توسط Raymond Hettinger.)تابع جدید: تابع
is_tracked()ماژولgcدر صورتی که یک نمونهی دادهشده توسط زبالهروب پیگیری شود مقدار true و در غیر این صورت مقدار false را برمیگرداند. (مشارکتشده توسط Antoine Pitrou؛ bpo-4688.)کلاس
GzipFileماژولgzipاکنون از پروتکل مدیریت زمینه پشتیبانی میکند، بنابراین میتوانید بنویسیدwith gzip.GzipFile(...) as f:(ارائهشده توسط Hagen Fürstenau؛ bpo-3860)، و اکنون کلاس پایه انتزاعیio.BufferedIOBaseرا پیادهسازی میکند، بنابراین میتوانید برای پردازش سریعتر آن را باio.BufferedReaderدربرگیرید (ارائهشده توسط Nir Aides؛ bpo-7471). همچنین اکنون میتوان با فراهم کردن یک مهر زمانی اختیاری برای سازنده، زمان اصلاح ثبتشده در یک پرونده فشردهشده با gzip را بازنویسی کرد. (ارائهشده توسط Jacques Frechet؛ bpo-4272.)پروندهها در قالب gzip ممکن است با بایتهای صفرِ انتهایی پدینگ شوند؛ ماژول
gzipاکنون این بایتهای انتهایی را مصرف میکند. (اصلاحشده توسط Tadek Pietraszek و Brian Curtin؛ bpo-2846.)ویژگی جدید: ماژول
hashlibاکنون دارای ویژگیalgorithmsاست که حاوی تاپلی از نام الگوریتمهای پشتیبانیشده است. در پایتون 2.7،hashlib.algorithmsشامل('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512')است. (مشارکتشده توسط کارل شنِه؛ bpo-7418.)کلاس پیشفرض
HTTPResponseکه توسط ماژولhttplibاستفاده میشود، اکنون از بافر کردن پشتیبانی میکند و در نتیجه، خواندن پاسخهای HTTP بسیار سریعتر شده است. (مشارکتشده توسط Kristján Valur Jónsson؛ bpo-4879.)کلاسهای
HTTPConnectionوHTTPSConnectionاکنون از پارامتر source_address پشتیبانی میکنند؛ یک تاپل دوتایی(host, port)که آدرس مبدأی را که برای اتصال استفاده خواهد شد، مشخص میکند. (با مشارکت Eldon Ziegler؛ bpo-3972.)ماژول
ihooksاکنون از ایمپورتهای نسبی پشتیبانی میکند. توجه داشته باشید کهihooksماژولی قدیمیتر برای سفارشیسازی ایمپورتهاست که ماژولimputilافزودهشده در پایتون 2.0 جایگزین آن شده است. (پشتیبانی از ایمپورت نسبی توسط نیل شمناور افزوده شد.)ماژول
imaplibاکنون از نشانیهای IPv6 پشتیبانی میکند. (با مشارکت Derek Morr؛ bpo-1655.)تابع جدید:
getcallargs()ماژولinspectیک فراخوانیپذیر و آرگومانهای جایگاهی و کلیدواژهای آن را میگیرد و تشخیص میدهد که کدامیک از پارامترهای فراخوانیپذیر هر آرگومان را دریافت خواهد کرد و دیکشنریای برمیگرداند که نام آرگومانها را به مقادیرشان نگاشت میکند. برای مثال:>>> from inspect import getcallargs >>> def f(a, b=1, *pos, **named): ... pass ... >>> getcallargs(f, 1, 2, 3) {'a': 1, 'b': 2, 'pos': (3,), 'named': {}} >>> getcallargs(f, a=2, x=4) {'a': 2, 'b': 1, 'pos': (), 'named': {'x': 4}} >>> getcallargs(f) Traceback (most recent call last): ... TypeError: f() takes at least 1 argument (0 given)
مشارکتشده توسط جورج ساکیس؛ bpo-3135.
ماژول بهروزرسانیشده: کتابخانهی
ioبه نسخهای که همراه پایتون 3.1 عرضه شده است ارتقا یافته است. در نسخه 3.1، کتابخانهی ورودی/خروجی بهطور کامل به زبان C بازنویسی شد و بسته به وظیفهای که انجام میشود، ۲ تا ۲۰ برابر سریعتر است. نسخهی اصلی پایتون به ماژول_pyioتغییر نام یافت.یک تغییر جزئی ناشی از این: کلاس
io.TextIOBaseاکنون دارای ویژگیerrorsاست که تنظیم خطای بهکاررفته برای خطاهای کدگذاری و کدگشایی را ارائه میدهد (یکی از'strict'،'replace'،'ignore').کلاس
io.FileIOاکنون هنگامی که یک توصیفگر پروندهی نامعتبر به آن داده شود،OSErrorایجاد میکند. (پیادهسازیشده توسط Benjamin Peterson؛ bpo-4991.) متدtruncate()اکنون مکان پرونده را حفظ میکند؛ پیشتر مکان پرونده را به انتهای پروندهی جدید تغییر میداد. (اصلاحشده توسط Pascal Chambon؛ bpo-6939.)تابع جدید:
itertools.compress(data, selectors)دو پیمایشگر میگیرد. المانهای data در صورتی برگردانده میشوند که مقدار متناظر در selectors درست باشد:itertools.compress('ABCDEF', [1,0,1,0,1,1]) => A, C, E, F
تابع جدید:
itertools.combinations_with_replacement(iter, r)تمام ترکیبات ممکن به طول r از المانهای پیمایشپذیر iter را برمیگرداند. برخلافcombinations()، المانهای منفرد میتوانند در ترکیبات تولیدشده تکرار شوند:itertools.combinations_with_replacement('abc', 2) => ('a', 'a'), ('a', 'b'), ('a', 'c'), ('b', 'b'), ('b', 'c'), ('c', 'c')
توجه داشته باشید که المانها بر اساس موقعیتشان در ورودی بهعنوان یکتا در نظر گرفته میشوند، نه بر اساس مقادیر واقعیشان.
تابع
itertools.count()اکنون آرگومان step دارد که امکان افزایش با مقادیری غیر از ۱ را فراهم میکند.count()همچنین اکنون پذیرش آرگومانهای کلیدواژهای و استفاده از مقادیر غیرصحیح مانند اعداد ممیز شناور یا نمونههایDecimalرا ممکن میسازد. (پیادهسازیشده توسط Raymond Hettinger؛ bpo-5032.)itertools.combinations()وitertools.product()پیشتر برای مقادیر r بزرگتر از پیمایشپذیر ورودی، استثنایValueErrorایجاد میکردند. این موضوع یک خطای مشخصات در نظر گرفته شد، بنابراین اکنون یک پیمایشگر خالی برمیگردانند. (توسط Raymond Hettinger اصلاح شد؛ bpo-4816.)ماژول بهروزرسانیشده: ماژول
jsonبه نسخه 2.0.9 از بستهی simplejson ارتقا یافت که شامل یک ماژول توسعهای C است که کدگذاری و کدگشایی را سریعتر میکند. (با مشارکت Bob Ippolito؛ bpo-4136.)برای پشتیبانی از نوع جدید
collections.OrderedDict، تابعjson.load()اکنون دارای پارامتر اختیاری object_pairs_hook است که با هر شیء لفظی که به فهرستی از جفتها کدگشایی میشود، فراخوانی خواهد شد. (ارائهشده توسط Raymond Hettinger؛ bpo-5381.)کلاس
Maildirدر ماژولmailboxاکنون مهر زمانی پوشههایی را که میخواند ثبت میکند و تنها در صورتی آنها را مجدداً میخواند که زمان تغییرشان بعداً تغییر کرده باشد. این امر با جلوگیری از پویشهای غیرضروری پوشهها، کارایی را بهبود میبخشد. (توسط A.M. Kuchling و Antoine Pitrou اصلاح شد؛ bpo-1607951، bpo-6896.)توابع جدید: ماژول
mathتوابعerf()وerfc()را برای تابع خطا و تابع خطای مکمل،expm1()را کهe**x - 1را با دقت بیشتر از استفاده ازexp()و کم کردن ۱ محاسبه میکند،gamma()را برای تابع گاما، وlgamma()را برای لگاریتم طبیعی تابع گاما به دست آورد. (ارائهشده توسط Mark Dickinson و nirinA raseliarison؛ bpo-3366.)کلاسهای
Manager*در ماژولmultiprocessingاکنون میتوانند یک فراخوانیپذیر دریافت کنند که هرگاه یک زیرفرایند آغاز شود، فراخوانی میشود، به همراه مجموعهای از آرگومانها که به آن فراخوانیپذیر منتقل میشوند. (مشارکتشده توسط lekma؛ bpo-5585.)کلاس
Poolکه یک استخر از فرایندهای کارگر را کنترل میکند، اکنون یک پارامتر اختیاری maxtasksperchild دارد. فرایندهای کارگر تعداد مشخصی از وظایف را انجام میدهند و سپس خارج میشوند که این امر باعث میشودPoolکارگر جدیدی را راهاندازی کند. این قابلیت زمانی مفید است که وظایف ممکن است منجر به نشت حافظه یا منابع دیگر شوند، یا برخی وظایف باعث شوند کارگر بسیار بزرگ شود. (ارائهشده توسط Charles Cazabon؛ bpo-6963.)ماژول
nntplibاکنون از نشانیهای IPv6 پشتیبانی میکند. (با مشارکت Derek Morr؛ bpo-1664.)توابع جدید: ماژول
osفراخوانیهای سیستمی POSIX زیر را پوشش میدهد:getresgid()وgetresuid()که GIDها و UIDهای واقعی، مؤثر و ذخیرهشده را برمیگردانند؛setresgid()وsetresuid()که GIDها و UIDهای واقعی، مؤثر و ذخیرهشده را به مقادیر جدید تنظیم میکنند؛initgroups()که فهرست دسترسی گروهی را برای فرایند جاری مقداردهی اولیه میکند. (توابع GID/UID توسط Travis H. ارائه شدهاند؛ bpo-6508. پشتیبانی از initgroups توسط Jean-Paul Calderone افزوده شده است؛ bpo-7333.)تابع
os.fork()اکنون قفل ایمپورت را در فرایند فرزند مجدداً مقداردهی اولیه میکند؛ این کار مشکلات سولاریس را هنگامی کهfork()از یک نخ فراخوانی میشود برطرف میکند. (برطرفشده توسط Zsolt Cserna؛ bpo-7242.)در ماژول
os.path، توابعnormpath()وabspath()اکنون یونیکد را حفظ میکنند؛ اگر مسیر ورودی آنها یک رشته یونیکد باشد، مقدار بازگشتی نیز یک رشته یونیکد خواهد بود. (normpath()توسط Matt Giuca در bpo-5827 اصلاح شد؛abspath()توسط Ezio Melotti در bpo-3426 اصلاح شد.)ماژول
pydocاکنون برای نمادهای گوناگونی که پایتون به کار میبرد، راهنما دارد. اکنون میتوانید برای مثالhelp('<<')یاhelp('@')را اجرا کنید. (مشارکتشده توسط David Laban؛ bpo-4739.)توابع
split()،sub()وsubn()در ماژولreاکنون برای سازگاری با سایر توابع این ماژول، آرگومان اختیاری flags را میپذیرند. (افزوده شده توسط Gregory P. Smith.)تابع جدید:
run_path()در ماژولrunpyکد موجود در مسیر ارائهشده در آرگومان path را اجرا میکند. path میتواند مسیر یک پروندهی منبع پایتون (example.py)، یک پروندهی بایتکد کامپایلشده (example.pyc)، یک پوشه (./package/) یا یک آرشیو zip (example.zip) باشد. اگر مسیر یک پوشه یا zip ارائه شود، به ابتدایsys.pathافزوده میشود و ماژول__main__ایمپورت خواهد شد. انتظار میرود که پوشه یا zip شامل یک__main__.pyباشد؛ اگر چنین نباشد، ممکن است__main__.pyدیگری از مکانی در ادامهیsys.pathایمپورت شود. این کار بخش بیشتری از سازوکارrunpyرا در اختیار اسکریپتهایی قرار میدهد که میخواهند شیوهی پردازش نام مسیر صریح توسط خط فرمان پایتون را تقلید کنند. (افزودهشده توسط Nick Coghlan؛ bpo-6816.)تابع جدید: در ماژول
shutil، تابعmake_archive()یک نام پرونده، نوع آرشیو (zip یا قالب tar) و یک مسیر پوشه را میگیرد و آرشیوی حاوی محتویات پوشه میسازد. (افزودهشده توسط Tarek Ziadé.)توابع
copyfile()وcopytree()در ماژولshutilاکنون وقتی از آنها خواسته شود که یک پایپ نامدار را کپی کنند، استثنایSpecialFileErrorایجاد میکنند. پیشتر کد با باز کردن پایپهای نامدار برای خواندن، آنها را مانند یک پرونده معمولی در نظر میگرفت و این کار بهطور نامحدود مسدود میشد. (توسط Antoine Pitrou اصلاح شد؛ bpo-3002.)ماژول
signalدیگر هندلر سیگنال را مجدداً نصب نمیکند، مگر اینکه این کار واقعاً ضروری باشد؛ این تغییر اشکالی را برطرف میکند که میتوانست گرفتن سیگنال EINTR را بهطور مقاوم ناممکن کند. (اصلاحشده توسط Charles-Francois Natali؛ bpo-8354.)توابع جدید: در ماژول
site، سه تابع جدید مسیرهای مختلف مخصوص سایت و کاربر را برمیگردانند.getsitepackages()فهرستی شامل تمام پوشههای سراسری site-packages را برمیگرداند،getusersitepackages()مسیر پوشه site-packages کاربر را برمیگرداند وgetuserbase()مقدار متغیر محیطیUSER_BASEرا برمیگرداند که مسیر پوشهای را ارائه میدهد که میتوان از آن برای ذخیره داده استفاده کرد. (مشارکتشده توسط Tarek Ziadé؛ bpo-6693.)ماژول
siteاکنون استثناهایی را که هنگام ایمپورت شدن ماژولsitecustomizeرخ میدهند گزارش میدهد و دیگر استثنایKeyboardInterruptرا نمیگیرد و نمیبلعید. (توسط Victor Stinner اصلاح شد؛ bpo-3137.)تابع
create_connection()پارامتر source_address را دریافت کرد؛ یک تاپل دوتایی(host, port)که نشانی مبدأی را که برای اتصال استفاده خواهد شد تعیین میکند. (مشارکتکننده: Eldon Ziegler؛ bpo-3972.)متدهای
recv_into()وrecvfrom_into()اکنون در اشیایی که از API بافر پشتیبانی میکنند مینویسند که مفیدترین آنها اشیاءbytearrayوmemoryviewهستند. (پیادهسازی توسط Antoine Pitrou؛ bpo-8104.)کلاس
TCPServerدر ماژولSocketServerاکنون از مهلتهای زمانی سوکت و غیرفعال کردن الگوریتم ناگل (Nagle) پشتیبانی میکند. ویژگی کلاسdisable_nagle_algorithmبه طور پیشفرضFalseاست؛ اگر بازنویسی شود تا مقدار آن true باشد، گزینهی TCP_NODELAY روی اتصالهای درخواست جدید تنظیم میشود تا از بافر شدن تعداد زیادی ارسال کوچک در یک بستهی TCP واحد جلوگیری شود. ویژگی کلاسtimeoutمیتواند حاوی مهلت زمانی بر حسب ثانیه باشد که روی سوکت درخواست اعمال خواهد شد؛ اگر در این مدت هیچ درخواستی دریافت نشود،handle_timeout()فراخوانی میشود وhandle_request()بازمیگردد. (مشارکت توسط Kristján Valur Jónsson؛ bpo-6192 و bpo-6267.)ماژول بهروزرسانیشده: ماژول
sqlite3به نسخه 2.6.0 از بستهی pysqlite بهروزرسانی شده است. نسخه 2.6.0 شامل تعدادی رفع اشکال است و قابلیت بارگذاری افزونههای SQLite از کتابخانههای اشتراکی را میافزاید. برای فعالسازی افزونهها، متدenable_load_extension(True)را فراخوانی کنید و سپس برای بارگذاری یک کتابخانهی اشتراکی خاص،load_extension()را فراخوانی کنید. (بهروزرسانی توسط Gerhard Häring.)شیءهای
SSLSocketدر ماژولsslاکنون از API بافر پشتیبانی میکنند، که یک شکست در بدنه آزمون را برطرف کرد (اصلاح توسط آنتوان پیترو؛ bpo-7133) و بهطور خودکار ماکرویSSL_MODE_AUTO_RETRYدر OpenSSL را تنظیم میکنند، که جلوگیری خواهد کرد از بازگردانده شدن کد خطا از عملیاتrecv()که موجب دستدهی مجدد SSL میشوند (اصلاح توسط آنتوان پیترو؛ bpo-8222).تابع سازندهی
wrap_socket()اکنون آرگومان ciphers را میپذیرد که رشتهای است و الگوریتمهای رمزنگاری مجاز را فهرست میکند؛ قالب این رشته در مستندات OpenSSL توضیح دادهشده است. (افزودهشده توسط Antoine Pitrou؛ bpo-8322.)تغییر دیگری باعث میشود ماژول توسعهای، همهی رمزها و الگوریتمهای چکیده OpenSSL را بارگذاری کند تا همگی در دسترس باشند. برخی از گواهیهای SSL قابل راستیآزمایی نبودند و خطای "unknown algorithm" گزارش میشد. (گزارششده توسط Beda Kosata و برطرفشده توسط Antoine Pitrou؛ bpo-8484.)
نسخه OpenSSL مورد استفاده، اکنون بهصورت ویژگیهای ماژول
ssl.OPENSSL_VERSION(یک رشته)،ssl.OPENSSL_VERSION_INFO(یک تاپل ۵تایی) وssl.OPENSSL_VERSION_NUMBER(یک عدد صحیح) در دسترس است. (افزودهشده توسط Antoine Pitrou؛ bpo-8321.)ماژول
structدیگر هنگامی که مقداری برای یک کد قالب عدد صحیح خاص (یکی ازbBhHiIlLqQ) بیش از حد بزرگ باشد، خطاهای سرریز را بیصدا نادیده نمیگیرد؛ اکنون همیشه یک استثنایstruct.errorایجاد میکند. (تغییر توسط Mark Dickinson؛ bpo-1523.) تابعpack()همچنین پیش از امتحان کردن متد__int__()یا گزارش دادن خطا، تلاش خواهد کرد که برای تبدیل و بستهبندی مقادیر غیرصحیح از__index__()استفاده کند. (تغییر توسط Mark Dickinson؛ bpo-8300.)تابع جدید: تابع
check_output()ماژولsubprocessفرمانی را با مجموعهای مشخص از آرگومانها اجرا میکند و در صورتی که فرمان بدون خطا اجرا شود، خروجی فرمان را بهصورت یک رشته برمیگرداند؛ در غیر این صورت، استثنایCalledProcessErrorرا ایجاد میکند.>>> subprocess.check_output(['df', '-h', '.']) 'Filesystem Size Used Avail Capacity Mounted on\n /dev/disk0s2 52G 49G 3.0G 94% /\n' >>> subprocess.check_output(['df', '-h', '/bogus']) ... subprocess.CalledProcessError: Command '['df', '-h', '/bogus']' returned non-zero exit status 1
(مشارکتشده توسط Gregory P. Smith.)
ماژول
subprocessاکنون پس از دریافت سیگنالEINTR، فراخوانیهای سیستمی داخلی خود را دوباره انجام میدهد. (توسط چندین نفر گزارش شد؛ وصل نهایی توسط گرگوری پی. اسمیت در bpo-1068268.)تابع جدید:
is_declared_global()در ماژولsymtableبرای متغیرهایی که بهطور صریح سراسری اعلامشدهاند مقدار درست و برای متغیرهایی که بهطور ضمنی سراسریاند مقدار نادرست برمیگرداند. (مشارکت توسط Jeremy Hylton.)ماژول
syslogاکنون بهجای مقدار پیشفرض قبلی'python'، از مقدارsys.argv[0]بهعنوان شناسه استفاده خواهد کرد. (تغییر دادهشده توسط Sean Reifschneider؛ bpo-8451.)مقدار
sys.version_infoاکنون یک تاپل نامدار است، با ویژگیهایی به نامهایmajor،minor،micro،releaselevelوserial. (ارائهشده توسط Ross Light؛ bpo-4285.)sys.getwindowsversion()نیز یک تاپل نامدار برمیگرداند که ویژگیهایی با نامهایmajor،minor،build،platform،service_pack،service_pack_major،service_pack_minor،suite_maskوproduct_typeدارد. (مشارکتشده توسط Brian Curtin؛ bpo-7766.)مدیریت خطای پیشفرض ماژول
tarfileتغییر کرده است تا دیگر خطاهای مهلک را سرکوب نکند. سطح خطای پیشفرض قبلاً 0 بود، به این معنا که خطاها فقط باعث میشدند پیامی در گزارش اشکالزدایی نوشته شود، اما از آنجا که گزارش اشکالزدایی بهطور پیشفرض فعال نیست، این خطاها نادیده میمانند. سطح خطای پیشفرض اکنون 1 است که در صورت وقوع خطا، استثنا مطرح میکند. (تغییر توسط Lars Gustäbel؛ bpo-7357.)ماژول
tarfileاکنون از فیلتر کردن اشیاءTarInfoکه به یک پرونده tar افزوده میشوند پشتیبانی میکند. هنگامی کهadd()را فراخوانی میکنید، میتوانید یک آرگومان اختیاری filter که فراخوانیپذیر است ارائه کنید. فراخوانیپذیر filter برای هر پروندهای که افزوده میشود، شیءTarInfoمربوط به آن را دریافت میکند و میتواند آن را تغییر داده و برگرداند. اگر فراخوانیپذیرNoneرا برگرداند، آن پرونده در آرشیو حاصل قرار نخواهد گرفت. این قابلیت از آرگومان موجود exclude قدرتمندتر است و بنابراین آن آرگومان منسوخ شده است. (افزوده شده توسط Lars Gustäbel؛ bpo-6856.) کلاسTarFileنیز اکنون از پروتکل مدیریت زمینه پشتیبانی میکند. (افزوده شده توسط Lars Gustäbel؛ bpo-7232.)متد
wait()از کلاسthreading.Eventاکنون هنگام خروج، پرچم داخلی را برمیگرداند. این بدان معناست که این متد معمولاً مقدار درست را برمیگرداند، زیراwait()باید تا زمانی که پرچم داخلی درست شود، مسدود بماند. مقدار بازگشتی تنها در صورتی نادرست خواهد بود که مهلت زمانی تعیین شده باشد و عملیات از مهلت آن بگذرد. (مشارکتشده توسط Tim Lesher؛ bpo-1674032.)پایگاه دادهی یونیکد ارائهشده توسط ماژول
unicodedataاکنون بهطور داخلی برای تعیین اینکه کدام نویسهها عددی، فضای سفید یا نشاندهندهی شکست خط هستند، استفاده میشود. این پایگاه داده همچنین اطلاعاتی از پرونده دادهایUnihan.txtرا در بر میگیرد (وصل توسط Anders Chrigström و Amaury Forgeot d'Arc؛ bpo-1571184) و به نسخهی 5.2.0 بهروزرسانی شده است (بهروزرسانی توسط Florent Xicluna؛ bpo-8024).تابع
urlsplit()در ماژولurlparseاکنون طرحوارههای ناشناختهی URL را به شکلی سازگار با RFC 3986 مدیریت میکند: اگر URL به شکل"<something>://..."باشد، متن پیش از://بهعنوان طرحواره در نظر گرفته میشود، حتی اگر طرحوارهای ساختگی باشد که ماژول آن را نمیشناسد. این تغییر ممکن است کدهایی را که برای دور زدن رفتار قدیمی نوشتهشده بودند، از کار بیندازد. برای مثال، پایتون 2.6.4 یا 2.5 موارد زیر را برمیگرداند:>>> import urlparse >>> urlparse.urlsplit('invented://host/filename?query') ('invented', '', '//host/filename?query', '', '')
پایتون 2.7 (و پایتون 2.6.5) خواهد برگرداند:
>>> import urlparse >>> urlparse.urlsplit('invented://host/filename?query') ('invented', 'host', '/filename?query', '', '')
(در واقع پایتون 2.7 خروجی کمی متفاوتی تولید میکند، زیرا بهجای یک تاپل استاندارد، یک تاپل نامدار برمیگرداند.)
ماژول
urlparseهمچنین از نشانیهای لفظی IPv6 طبق تعریف RFC 2732 پشتیبانی میکند (با مشارکت Senthil Kumaran؛ bpo-2987).>>> urlparse.urlparse('http://[1080::8:800:200C:417A]/foo') ParseResult(scheme='http', netloc='[1080::8:800:200C:417A]', path='/foo', params='', query='', fragment='')
کلاس جدید: کلاس
WeakSetدر ماژولweakrefمجموعهای است که تنها ارجاعهای ضعیف به عناصر خود را نگه میدارد؛ عناصر به محض اینکه هیچ ارجاعی به آنها اشاره نکند، حذف میشوند. (ابتدا در Python 3.x توسط Raymond Hettinger پیادهسازی شد و توسط Michael Foord به نسخه 2.7 بکپورت شد.)کتابخانهی
xml.etree.ElementTreeهنگام خروجی گرفتن دستورالعمل پردازش XML (که به شکل<?xml-stylesheet href="#style1"?>است) یا کامنت (که به شکل<!-- comment -->است)، دیگر امپرسندها و کمانکها را خنثی نمیکند. (وصل توسط Neil Muller؛ bpo-2746.)کلاینت و سرور XML-RPC، که توسط ماژولهای
xmlrpclibوSimpleXMLRPCServerارائهشدهاند، با پشتیبانی از قابلیت keep-alive در HTTP/1.1 و با استفادهی اختیاری از کدگذاری gzip برای فشردهسازی XML در حال مبادله، کارایی خود را بهبود بخشیدهاند. فشردهسازی gzip توسط ویژگیencode_thresholdازSimpleXMLRPCRequestHandlerکنترل میشود که حاوی اندازهای بر حسب بایت است؛ پاسخهای بزرگتر از این مقدار فشرده میشوند. (ارائهشده توسط Kristján Valur Jónsson؛ bpo-6267.)کلاس
ZipFileدر ماژولzipfileاکنون از پروتکل مدیریت زمینه پشتیبانی میکند، بنابراین میتوانید بنویسیدwith zipfile.ZipFile(...) as f:. (مشارکتشده توسط برایان کورتین؛ bpo-5511.)zipfileاکنون از آرشیو کردن پوشههای خالی نیز پشتیبانی میکند و آنها را بهدرستی استخراج میکند. (اصلاحشده توسط Kuba Wieczorek؛ bpo-4710.) خواندن پروندهها از یک آرشیو سریعتر شده است، و تناوب بینread()وreadline()اکنون بهدرستی کار میکند. (مشارکتشده توسط Nir Aides؛ bpo-7610.)تابع
is_zipfile()اکنون علاوه بر مسیرنامهای پذیرفتهشده در نسخههای قبلی، یک شیء پرونده را نیز میپذیرد. (مشارکت از Gabriel Genellina؛ bpo-4756.)متد
writestr()اکنون یک پارامتر اختیاری compress_type دارد که به شما امکان میدهد روش فشردهسازی پیشفرضِ تعیینشده در سازندهیZipFileرا نادیده بگیرید. (مشارکتکننده: رونالد اوسورن؛ bpo-6003.)
ماژول جدید: importlib¶
پایتون 3.1 شامل بستهی importlib است؛ بازپیادهسازی منطق زیربنایی دستور import پایتون. importlib برای پیادهسازان مفسرهای پایتون و کاربرانی که میخواهند ایمپورتکنندههای جدیدی بنویسند که بتوانند در فرایند ایمپورت مشارکت کنند، مفید است. پایتون 2.7 شامل بستهی کامل importlib نیست، بلکه در عوض زیرمجموعهی بسیار کوچکی دارد که تنها یک تابع، import_module()، را در بر میگیرد.
import_module(name, package=None) یک ماژول را ایمپورت میکند. name رشتهای است که نام ماژول یا بسته را در بر دارد. میتوان با ارائهی رشتهای که با نویسهی . آغاز میشود (مانند ..utils.errors) ایمپورتهای نسبی را انجام داد. برای ایمپورتهای نسبی، آرگومان package باید ارائه شود و نام بستهای است که بهعنوان لنگر برای ایمپورت نسبی استفاده خواهد شد. import_module() هم ماژول ایمپورتشده را در sys.modules درج میکند و هم شیء ماژول را برمیگرداند.
در ادامه چند مثال آوردهشده است:
>>> from importlib import import_module
>>> anydbm = import_module('anydbm') # Standard absolute import
>>> anydbm
<module 'anydbm' from '/p/python/Lib/anydbm.py'>
>>> # Relative import
>>> file_util = import_module('..file_util', 'distutils.command')
>>> file_util
<module 'distutils.file_util' from '/python/Lib/distutils/file_util.pyc'>
importlib توسط Brett Cannon پیادهسازی شد و در پایتون 3.1 معرفی شد.
ماژول جدید: sysconfig¶
ماژول sysconfig از بستهی Distutils جدا شده و به یک ماژول سطحبالا جدید و مستقل تبدیل شده است. sysconfig توابعی برای دریافت اطلاعاتی دربارهی فرایند ساخت پایتون فراهم میکند: سوییچهای کامپایلر، مسیرهای نصب، نام پلتفرم و اینکه آیا پایتون از پوشهی منبع خود اجرا میشود یا خیر.
برخی از توابع این ماژول عبارتاند از:
get_config_var()متغیرها را از Makefile پایتون و پروندهیpyconfig.hبازمیگرداند.get_config_vars()دیکشنریای را برمیگرداند که شامل تمام متغیرهای پیکربندی است.get_path()مسیر پیکربندیشده برای نوع خاصی از ماژول را برمیگرداند: کتابخانه استاندارد، ماژولهای مخصوص سایت، ماژولهای مخصوص پلتفرم و غیره.is_python_build()در صورتی که در حال اجرای یک پرونده دودویی از درخت منبع پایتون باشید، مقدار true را برمیگرداند و در غیر این صورت false.
برای جزئیات بیشتر و فهرست کامل توابع، به مستندات sysconfig مراجعه کنید.
بستهی Distutils و sysconfig اکنون توسط طارق زیاده نگهداری میشوند، که همچنین بستهی Distutils2 (مخزن منبع در https://hg.python.org/distutils2/) را برای توسعهی نسخهی نسل بعدی Distutils آغاز کرده است.
ttk: ابزارکهای تمدار برای Tk¶
Tcl/Tk 8.5 مجموعهای از ابزارکهای تمدار را در بر میگیرد که ابزارکهای پایهی Tk را بازپیادهسازی میکنند، اما ظاهر آنها بیشتر قابل سفارشیسازی است و از این رو میتوانند شباهت بیشتری به ابزارکهای پلتفرم بومی داشته باشند. این مجموعه ابزارک در ابتدا Tile نام داشت، اما هنگام افزوده شدن به نسخهی 8.5 از Tcl/Tck، به Ttk تغییر نام داد (مخفف "themed Tk").
برای اطلاعات بیشتر، مستندات ماژول ttk را بخوانید. ممکن است بخواهید صفحه راهنمای Tcl/Tk را نیز بخوانید که موتور تم Ttk را شرح میدهد و در نشانی https://www.tcl.tk/man/tcl8.5/TkCmd/ttk_intro.html در دسترس است. چند تصویر صفحه از کد Python/Ttk در حال استفاده در نشانی https://code.google.com/archive/p/python-ttk/wikis/Screenshots.wiki موجود است.
ماژول tkinter.ttk توسط Guilherme Polo نوشته شد و در bpo-2983 اضافه شد. نسخهی جایگزینی به نام Tile.py که توسط Martin Franklin نوشته و توسط Kevin Walzer نگهداری میشد، در bpo-2618 برای گنجاندن پیشنهاد شد، اما نویسندگان استدلال کردند که کار Guilherme Polo جامعتر بود.
ماژول بهروزرسانیشده: unittest¶
ماژول unittest بهطور چشمگیری بهبود یافت؛ ویژگیهای جدید بسیاری به آن افزوده شد. بیشتر این ویژگیها، مگر خلاف آن ذکر شده باشد، توسط Michael Foord پیادهسازی شدهاند. نسخهی بهبودیافتهی این ماژول، برای استفاده با نسخههای 2.4 تا 2.6 پایتون، در قالب بستهی unittest2 بستهبندی شده و بهطور جداگانه از unittest2 قابل دانلود است.
هنگام استفاده از خط فرمان، این ماژول میتواند آزمونها را بهطور خودکار کشف کند. این ماژول به اندازهی py.test یا nose پیشرفته نیست، اما راهی ساده برای اجرای آزمونهایی که در مجموعهای از پوشههای بسته نگهداری میشوند فراهم میکند. برای مثال، دستور زیر، زیرپوشهی test/ را برای یافتن هر پروندهی آزمونِ قابلایمپورت با نام test*.py جستجو خواهد کرد:
python -m unittest discover -s test
برای جزئیات بیشتر به مستندات ماژول unittest مراجعه کنید. (در bpo-6001 توسعه یافت.)
تابع main() از برخی گزینههای جدید دیگر پشتیبانی میکند:
-bیا--bufferجریانهای خروجی استاندارد و خطای استاندارد را در طول هر آزمون بافر میکند. اگر آزمون موفق باشد، هرگونه خروجی حاصل دور ریخته میشود؛ در صورت شکست، خروجی بافرشده نمایش داده میشود.-cیا--catchباعث میشود وقفهی control-C با ظرافت بیشتری مدیریت شود. بهجای آنکه فرایند آزمون بلافاصله دچار وقفه شود، آزمون در حال اجرا به پایان میرسد و سپس نتایج جزئی تا لحظهی وقفه گزارش میشوند. اگر صبور نیستید، فشردن دوبارهی control-C باعث وقفهی فوری میشود.این هندلر کنترل-C تلاش میکند در مواردی که کد مورد آزمون یا آزمونهای در حال اجرا هندلر سیگنال خود را تعریف کردهاند، با تشخیص اینکه هندلر سیگنالی از قبل تنظیم شده و فراخوانی آن، از ایجاد مشکلات جلوگیری کند. اگر این روش برای شما کار نکرد، دکوراتور
removeHandler()وجود دارد که میتوان از آن برای علامتگذاری آزمونهایی که باید مدیریت کنترل-C در آنها غیرفعال شود، استفاده کرد.-fیا--failfastباعث میشود اجرای آزمونها به محض شکست یک آزمون، بهجای ادامهی اجرای آزمونهای بعدی، متوقف شود. (پیشنهاد دادهشده توسط Cliff Dyer و پیادهسازیشده توسط Michael Foord؛ bpo-8074.)
پیامهای پیشرفت اکنون هنگام اجرا در حالت پرگویی (verbose)، 'x' را برای شکستهای مورد انتظار و 'u' را برای موفقیتهای غیرمنتظره نمایش میدهند. (با مشارکت Benjamin Peterson.)
موارد آزمون میتوانند برای رد کردن یک آزمون، استثنای SkipTest را ایجاد کنند (bpo-1034053).
پیامهای خطا برای شکستهای assertEqual()، assertTrue() و assertFalse() اکنون اطلاعات بیشتری ارائه میدهند. اگر ویژگی longMessage کلاسهای TestCase خود را به true تنظیم کنید، در صورت شکست، هم پیام خطای استاندارد و هم هر پیام اضافیای که ارائه کرده باشید چاپ خواهد شد. (افزوده شده توسط مایکل فورد؛ bpo-5663.)
متد assertRaises() اکنون هنگامی که بدون ارائهی شیء فراخوانیپذیر برای اجرا فراخوانی شود، یک مدیر زمینه برمیگرداند. برای مثال، میتوانید این را بنویسید:
with self.assertRaises(KeyError):
{}['foo']
(پیادهسازیشده توسط آنتوان پیترو؛ bpo-4444.)
ثابتهای آزمایشی راهاندازی و برچیدن (setup و teardown) در سطح ماژول و کلاس اکنون پشتیبانی میشوند. ماژولها میتوانند شامل توابع setUpModule() و tearDownModule() باشند. کلاسها میتوانند متدهای setUpClass() و tearDownClass() را داشته باشند که باید بهصورت متد کلاس تعریف شوند (با استفاده از @classmethod یا معادل آن). این توابع و متدها هنگامی فراخوانی میشوند که اجراکننده آزمون به مورد آزمونی در ماژول یا کلاسی دیگر جابهجا شود.
متدهای addCleanup() و doCleanups() افزوده شدند. addCleanup() به شما امکان میدهد توابع پاکسازیای اضافه کنید که بدون قید و شرط فراخوانی میشوند (پس از setUp() اگر setUp() شکست بخورد، در غیر این صورت پس از tearDown()). این امر تخصیص و آزادسازی منابع را در طول آزمونها بسیار سادهتر میکند (bpo-5679).
تعدادی متد جدید اضافه شد که آزمونهای تخصصیتر فراهم میکنند. بسیاری از این متدها توسط مهندسان گوگل برای استفاده در بدنههای آزمون خود نوشته شدند؛ Gregory P. Smith، Michael Foord و GvR روی ادغام آنها در نسخهی پایتونِ unittest کار کردند.
assertIsNone()وassertIsNotNone()یک عبارت دریافت میکنند و تأیید میکنند که نتیجهNoneاست یا نیست.assertIs()وassertIsNot()دو مقدار میگیرند و بررسی میکنند که آیا این دو مقدار به یک شیء ارزیابی میشوند یا خیر. (افزودهشده توسط Michael Foord؛ bpo-2578.)assertIsInstance()وassertNotIsInstance()بررسی میکنند که آیا شیء حاصل، نمونهای از یک کلاس خاص است یا نمونهای از یکی از کلاسهای یک تاپل. (اضافهشده توسط Georg Brandl؛ bpo-7031.)assertGreater()،assertGreaterEqual()،assertLess()وassertLessEqual()دو مقدار را مقایسه میکنند.assertMultiLineEqual()دو رشته را مقایسه میکند و اگر برابر نباشند، مقایسهای مفید نمایش میدهد که تفاوتهای میان دو رشته را برجسته میسازد. این مقایسه اکنون بهطور پیشفرض هنگام مقایسهی رشتههای یونیکد باassertEqual()استفاده میشود.assertRegexpMatches()وassertNotRegexpMatches()بررسی میکنند که آیا آرگومان اول رشتهای است که با عبارت باقاعدهی ارائهشده بهعنوان آرگومان دوم تطبیق میکند یا نمیکند (bpo-8038).assertRaisesRegexp()بررسی میکند که آیا استثنای خاصی پرتاب میشود، و سپس همچنین بررسی میکند که نمایش رشتهای استثنا با عبارت باقاعدهی ارائهشده مطابقت داشته باشد.assertIn()وassertNotIn()بررسی میکنند که آیا اولی در دومی است یا نیست.assertItemsEqual()آزمایش میکند که آیا دو دنبالهی ارائهشده حاوی همان عناصر هستند.assertSetEqual()بررسی میکند که آیا دو مجموعه برابر هستند یا خیر، و در صورت خطا تنها تفاوتهای بین مجموعهها را گزارش میکند.بهطور مشابه،
assertListEqual()وassertTupleEqual()انواع مشخصشده را مقایسه میکنند و هرگونه تفاوت را بدون آنکه لزوماً مقادیر کامل آنها را چاپ کنند، توضیح میدهند؛ این متدها اکنون بهطور پیشفرض هنگام مقایسه فهرستها و تاپلها با استفاده ازassertEqual()به کار میروند. بهطور کلیتر،assertSequenceEqual()دو دنباله را مقایسه میکند و میتواند بهصورت اختیاری بررسی کند که آیا هر دو دنباله از نوع خاصی هستند یا خیر.assertDictEqual()دو دیکشنری را مقایسه میکند و تفاوتها را گزارش میدهد؛ این متد اکنون بهصورت پیشفرض هنگام مقایسهی دو دیکشنری با استفاده ازassertEqual()به کار میرود.assertDictContainsSubset()بررسی میکند که آیا همهی جفتهای کلید/مقدار موجود در اول، در دوم یافت میشوند یا خیر.assertAlmostEqual()وassertNotAlmostEqual()آزمون میکنند که آیا first و second تقریباً برابر هستند یا نه. این متد میتواند اختلاف آنها را تا تعداد رقمهایی که بهصورت اختیاری در places مشخص میشود گرد کند (مقدار پیشفرض ۷ است) و آن را با صفر مقایسه کند، یا الزام کند که اختلاف کوچکتر از مقدار delta دادهشده باشد.loadTestsFromName()بهدرستی از ویژگیsuiteClassدرTestLoaderپیروی میکند. (توسط Mark Roddy اصلاح شد؛ bpo-6866.)قلاب جدیدی به شما امکان میدهد متد
assertEqual()را برای مدیریت نوعهای دادهی جدید گسترش دهید. متدaddTypeEqualityFunc()یک شیء نوع و یک تابع میگیرد. این تابع زمانی استفاده میشود که هر دو شیءی که در حال مقایسه هستند از نوع مشخصشده باشند. این تابع باید دو شیء را مقایسه کند و در صورت عدم مطابقت، استثنایی ایجاد کند؛ ایدهی خوبی است که تابع اطلاعات بیشتری دربارهی اینکه چرا دو شیء با هم مطابقت ندارند ارائه دهد، درست همانطور که متدهای جدید مقایسهی دنباله انجام میدهند.
تابع unittest.main() اکنون یک آرگومان اختیاری exit میپذیرد. اگر نادرست باشد، main() تابع sys.exit() را فراخوانی نمیکند و به این ترتیب میتوان main() را در مفسر تعاملی به کار برد. (مشارکت از J. Pablo Fernández؛ bpo-3379.)
کلاس TestResult متدهای جدید startTestRun() و stopTestRun() دارد که بلافاصله پیش و پس از یک اجرای آزمون فراخوانی میشوند. (مشارکتشده توسط رابرت کالینز؛ bpo-5728.)
با تمام این تغییرات، پروندهی unittest.py بهطرزی ناخوشایند بزرگ میشد، بنابراین ماژول به یک بسته تبدیل شد و کد به چندین پرونده تقسیم شد (توسط Benjamin Peterson). این امر بر نحوهی ایمپورت یا استفاده از ماژول تأثیری نمیگذارد.
همچنین ملاحظه نمائید
- https://web.archive.org/web/20210619163128/http://www.voidspace.org.uk/python/articles/unittest2.shtml
قابلیتهای جدید، نحوهی استفاده از آنها و دلایل تصمیمهای مختلف طراحی را شرح میدهد. (به قلم مایکل فورد.)
ماژول بهروزرسانیشده: ElementTree 1.3¶
نسخهی کتابخانه ElementTree که همراه پایتون ارائه میشود، به نسخه 1.3 بهروزرسانی شد. برخی از قابلیتهای جدید عبارتاند از:
توابع تجزیهی گوناگون اکنون یک آرگومان کلیدواژهای parser میپذیرند که نمونهی
XMLParserمورد استفاده را مشخص میکند. این کار امکان نادیده گرفتن کدگذاری داخلی پرونده را فراهم میکند:p = ET.XMLParser(encoding='utf-8') t = ET.XML("""<root/>""", parser=p)
خطاهای تجزیه XML اکنون استثنای
ParseErrorایجاد میکنند که نمونههای آن ویژگیpositionدارند؛ این ویژگی شامل یک تاپل (سطر، ستون) است که محل مشکل را مشخص میکند.کد ElementTree برای تبدیل درختها به رشته بهطور قابلتوجهی بازنویسی شده است که این امر آن را در بسیاری از موارد تقریباً دو برابر سریعتر میکند. متدهای
ElementTree.write()وElement.write()اکنون یک پارامتر method دارند که میتواند "xml" (پیشفرض)، "html" یا "text" باشد. حالت HTML المانهای خالی را بهجای<empty/>بهصورت<empty></empty>خروجی میدهد و حالت متنی از روی المانها عبور میکند و فقط تکههای متنی را خروجی میدهد. اگر ویژگیtagیک المان را برابرNoneقرار دهید اما فرزندان آن را سر جای خود نگه دارید، هنگام نوشتن درخت، آن المان از خروجی حذف خواهد شد؛ بنابراین برای حذف یک المان واحد نیازی به بازآرایی گستردهتر ندارید.مدیریت فضای نام نیز بهبود یافته است. اکنون تمام اعلانهای
xmlns:<whatever>روی عنصر ریشه درج میشوند، نه بهصورت پراکنده در سراسر XML حاصل. میتوانید فضای نام پیشفرض یک درخت را با تنظیم ویژگیdefault_namespaceتعیین کنید و پیشوندهای جدید را باregister_namespace()ثبت کنید. در حالت XML، میتوانید از پارامتر درست/نادرست xml_declaration برای سرکوب اعلان XML استفاده کنید.متد جدید
Element:extend()آیتمهای یک دنباله را به فرزندان عنصر میافزاید. خودِ عناصر مانند دنبالهها رفتار میکنند، بنابراین جابهجایی فرزندان از یک عنصر به عنصر دیگر آسان است:from xml.etree import ElementTree as ET t = ET.XML("""<list> <item>1</item> <item>2</item> <item>3</item> </list>""") new = ET.XML('<root/>') new.extend(t) # Outputs <root><item>1</item>...</root> print ET.tostring(new)
متد جدید
Element:iter()فرزندان عنصر را بهصورت یک تولیدگر تولید میکند. همچنین میتوانیدfor child in elem:را بنویسید تا روی فرزندان یک عنصر حلقه بزنید. متد موجودgetiterator()اکنون منسوخ شده است؛getchildren()که فهرستی از فرزندان میسازد و برمیگرداند نیز منسوخ شده است.متد جدید
Element:itertext()تمام تکههای متنی را که فرزندان این عنصر هستند تولید میکند. برای مثال:t = ET.XML("""<list> <item>1</item> <item>2</item> <item>3</item> </list>""") # Outputs ['\n ', '1', ' ', '2', ' ', '3', '\n'] print list(t.itertext())
منسوخ: استفاده از یک المان بهعنوان مقدار بولی (یعنی
if elem:) در صورتی که المان فرزندی داشته باشد، مقدار درست و در صورتی که فرزندی نداشته باشد، مقدار نادرست را برمیگرداند. این رفتار سردرگمکننده است —Noneنادرست است، اما المان بیفرزند هم نادرست است؟ — بنابراین اکنونFutureWarningفعال خواهد شد. در کد خود باید صریح باشید: اگر به تعداد فرزندان علاقهمندید،len(elem) != 0بنویسید، یاelem is not None.
فردریک لوند ElementTree را توسعه میدهد و نسخهی 1.3 را تولید کرد؛ میتوانید مقالهی او دربارهی نسخهی 1.3 را در https://web.archive.org/web/20200703234532/http://effbot.org/zone/elementtree-13-intro.htm بخوانید. فلوران شیکلونا پس از بحثهایی در python-dev و در bpo-6472، نسخهی همراه پایتون را بهروزرسانی کرد.)
تغییرات ساخت و C API¶
تغییرات در فرایند ساخت پایتون و در API زبان C شامل موارد زیر است:
آخرین نسخهی منتشرشدهی اشکالزدای گنو، یعنی GDB 7، قابل اسکریپتنویسی با پایتون است. هنگامی که اشکالزدایی یک برنامهی اجرایی P را آغاز میکنید، GDB به دنبال پروندهای با نام
P-gdb.pyمیگردد و آن را بهطور خودکار میخواند. دیو مالکوم یکpython-gdb.pyارائه کرده است که تعدادی دستور مفید برای اشکالزدایی خودِ پایتون اضافه میکند. برای نمونه،py-upوpy-downیک فریم پشتهی پایتون به بالا یا پایین میروند که معمولاً معادل چندین فریم پشتهی C است.py-printمقدار یک متغیر پایتون را چاپ میکند وpy-btردگیری پشتهی پایتون را چاپ میکند. (در نتیجهی bpo-8032 اضافه شد.)اگر از پروندهی
.gdbinitارائهشده به همراه پایتون استفاده کنید، ماکرو "pyo" در نسخهی 2.7 اکنون بهدرستی کار میکند زمانی که نخِ در حال اشکالزدایی قفل مفسر سراسری را در اختیار ندارد؛ این ماکرو اکنون پیش از چاپ، آن را در اختیار میگیرد. (مشارکتشده توسط Victor Stinner؛ bpo-3632.)Py_AddPendingCall()اکنون نخایمن است و به هر نخ کارگری اجازه میدهد اعلانهایی را به نخ اصلی پایتون ارسال کند. این بهویژه برای عملیات ورودی/خروجی ناهمگام مفید است. (مشارکتشده توسط Kristján Valur Jónsson؛ bpo-4293.)تابع جدید:
PyCode_NewEmpty()یک شیء کد خالی ایجاد میکند؛ تنها نام پرونده، نام تابع و شماره سطر اول لازم است. این برای ماژولهای توسعهای که در تلاشاند پشته ردگیری کاربردیتری بسازند مفید است. پیشتر چنین ماژولهایی لازم بودPyCode_New()را فراخوانی کنند که آرگومانهای بسیار بیشتری داشت. (افزودهشده توسط Jeffrey Yasskin.)تابع جدید:
PyErr_NewExceptionWithDoc()یک کلاس استثنا جدید ایجاد میکند، درست همانطور کهPyErr_NewException()موجود انجام میدهد، اما یک آرگومان اضافیchar *میگیرد که رشته مستند کلاس استثنا جدید را در بر دارد. (افزودهشده توسط 'lekma' در سامانه پیگیری اشکال پایتون؛ bpo-7033.)تابع جدید:
PyFrame_GetLineNumber()یک شیء فریم میگیرد و شماره سطری را که فریم هماکنون در حال اجرای آن است برمیگرداند. پیش از این، کد باید اندیس دستور بایتکد در حال اجرا را میگرفت و سپس شماره سطر متناظر با آن نشانی را جستوجو میکرد. (افزودهشده توسط Jeffrey Yasskin.)توابع جدید:
PyLong_AsLongAndOverflow()وPyLong_AsLongLongAndOverflow()یک عدد صحیح بلند پایتون را بهصورت یک long یا long long در C تقریب میزنند. اگر عدد آنقدر بزرگ باشد که در نوع خروجی جا نشود، پرچم سرریز تنظیم میشود و به فراخوانکننده بازگردانده میشود. (مشارکتشده توسط Case Van Horsen؛ bpo-7528 و bpo-7767.)تابع جدید: ناشی از بازنویسی تبدیل رشته به عدد اعشاری، تابع جدید
PyOS_string_to_double()افزوده شد. توابع قدیمیPyOS_ascii_strtod()وPyOS_ascii_atof()اکنون منسوخ شدهاند.تابع جدید:
PySys_SetArgvEx()مقدارsys.argvرا تنظیم میکند و میتواند بسته به مقدار پارامتر updatepath، بهصورت اختیاریsys.pathرا بهروزرسانی کند تا پوشهی حاوی اسکریپتی را که نامش توسطsys.argv[0]مشخص میشود، در بر بگیرد.این تابع برای بستن حفره امنیتی در برنامههایی که پایتون را تعبیه میکنند اضافه شد. تابع قدیمی،
PySys_SetArgv()، همیشهsys.pathرا بهروزرسانی میکرد و گاهی پوشه جاری را به آن اضافه میکرد. این بدان معنا بود که اگر برنامهای که پایتون در آن تعبیه شده را در پوشهای که توسط شخص دیگری کنترل میشود اجرا میکردید، مهاجمان میتوانستند یک ماژول اسب تروا در آن پوشه قرار دهند (مثلاً پروندهای با نامos.py) که برنامه شما سپس آن را ایمپورت و اجرا میکرد.اگر نگهداری یک برنامه C/C++ که پایتون را درون خود جای میدهد را بر عهده دارید، بررسی کنید که آیا
PySys_SetArgv()را فراخوانی میکنید و به دقت در نظر بگیرید که آیا برنامه باید ازPySys_SetArgvEx()با تنظیم updatepath روی false استفاده کند یا خیر.مشکل امنیتی با شماره CVE 2008-5983 گزارش شد؛ در bpo-5753 مورد بحث قرار گرفت و توسط Antoine Pitrou رفع شد.
ماکروهای جدید: پروندههای سرآیند پایتون اکنون ماکروهای زیر را تعریف میکنند:
Py_ISALNUM،Py_ISALPHA،Py_ISDIGIT،Py_ISLOWER،Py_ISSPACE،Py_ISUPPER،Py_ISXDIGIT،Py_TOLOWERوPy_TOUPPER. همهی این توابع مشابه ماکروهای استاندارد C برای دستهبندی نویسهها هستند، اما تنظیم locale فعلی را نادیده میگیرند، زیرا پایتون در چندین جا باید نویسهها را بهصورت مستقل از locale تحلیل کند. (افزودهشده توسط اریک اسمیت؛ bpo-5793.)تابع حذفشده:
PyEval_CallObject()اکنون فقط بهصورت ماکرو در دسترس است. یک نسخهی تابعی از آن برای حفظ سازگاری پیوند ABI نگهداری میشد، اما آن به سال ۱۹۹۷ برمیگردد؛ تا به حال قطعاً میتوان آن را حذف کرد. (حذف توسط آنتوان پیترو؛ bpo-8276.)کدهای قالب جدید: توابع
PyString_FromFormat()،PyString_FromFormatV()وPyErr_Format()اکنون کدهای قالب%lldو%lluرا برای نمایش نوعهای long long زبان C میپذیرند. (مشارکتشده توسط Mark Dickinson؛ bpo-7228.)تعامل پیچیده بین نخها و انشعاب فرایند تغییر کرده است. پیشتر، ممکن بود فرایند فرزندی که توسط
os.fork()ایجاد میشود، شکست بخورد، زیرا فرزند تنها با یک نخ در حال اجرا ایجاد میشود؛ همان نخی کهos.fork()را اجرا میکند. اگر هنگام انجام انشعاب، نخهای دیگر قفلی مانند قفل ایمپورت پایتون را نگه داشته بودند، آن قفل در فرایند جدید همچنان بهعنوان «نگهداشتهشده» علامتگذاری میشد. اما در فرایند فرزند هیچچیز هرگز آن قفل را آزاد نمیکرد، زیرا نخهای دیگر تکثیر نشده بودند و فرایند فرزند دیگر نمیتوانست ایمپورت انجام دهد.پایتون 2.7 پیش از انجام
os.fork()قفل ایمپورت را به دست میآورد و همچنین هر قفلی را که با استفاده از ماژولthreadingایجاد شده باشد پاکسازی میکند. ماژولهای توسعهای C که قفلهای داخلی دارند یا خودfork()را فراخوانی میکنند، از این پاکسازی بهرهمند نخواهند شد.(توسط Thomas Wouters اصلاح شد؛ bpo-1590864.)
تابع
Py_Finalize()اکنون تابع داخلیthreading._shutdown()را فراخوانی میکند؛ این کار از ایجاد برخی استثناها هنگام خاموش شدن مفسر جلوگیری میکند. (وصله توسط Adam Olsen؛ bpo-1722344.)هنگام استفاده از ساختار
PyMemberDefبرای تعریف ویژگیهای یک نوع، پایتون دیگر به شما اجازه نمیدهد که سعی کنید ویژگیT_STRING_INPLACEرا حذف یا تنظیم کنید.نمادهای سراسری تعریفشده توسط ماژول
ctypesاکنون دارای پیشوندPyیا_ctypesهستند. (پیادهسازیشده توسط Thomas Heller؛ bpo-3102.)گزینهی جدید پیکربندی: سوییچ
--with-system-expatاجازه میدهد ماژولpyexpatبرای استفاده از کتابخانهی Expat سیستم ساخته شود. (مشارکتشده توسط Arfrever Frehtes Taifersar Arahesis؛ bpo-7609.)گزینه جدید پیکربندی : گزینه
--with-valgrindاکنون تخصیصدهنده pymalloc را غیرفعال میکند که تحلیل صحیح آن برای آشکارساز خطاهای حافظه Valgrind دشوار است. بنابراین Valgrind در تشخیص نشت حافظه و تجاوز از محدوده بهتر عمل خواهد کرد. (مشارکتشده توسط James Henstridge؛ bpo-2422.)گزینهی جدید configure: اکنون میتوانید یک رشتهی خالی به
--with-dbmliborder=ارائه دهید تا همهی ماژولهای مختلف DBM غیرفعال شوند. (افزودهشده توسط Arfrever Frehtes Taifersar Arahesis؛ bpo-6491.)اسکریپت configure اکنون اشکالهای گرد کردن ممیز شناور را در برخی تراشههای ۳۲ بیتی اینتل بررسی میکند و یک تعریف پیشپردازنده به نام
X87_DOUBLE_ROUNDINGتعریف میکند. در حال حاضر هیچ کدی از این تعریف استفاده نمیکند، اما اگر کسی بخواهد از آن استفاده کند، در دسترس است. (افزودهشده توسط مارک دیکنسون؛ bpo-2937.)configure اکنون همچنین یک متغیر Makefile به نام
LDCXXSHAREDرا برای پشتیبانی از پیوند C++ تنظیم میکند. (مشارکتشده توسط Arfrever Frehtes Taifersar Arahesis؛ bpo-1222585.)فرایند ساخت اکنون پروندههای لازم برای پشتیبانی از pkg-config را ایجاد میکند. (مشارکت از سوی Clinton Roy؛ bpo-3585.)
فرایند ساخت اکنون از Subversion 1.7 پشتیبانی میکند. (مشارکتشده توسط Arfrever Frehtes Taifersar Arahesis؛ bpo-6094.)
کپسولها¶
پایتون 3.1 یک نوع دادهی جدید در C به نام PyCapsule برای ارائهی یک C API به یک ماژول توسعهای اضافه میکند. کپسول در اصل نگهدارندهی یک اشارهگر void * در C است و بهصورت یک ویژگی ماژول در دسترس قرار میگیرد؛ برای مثال، API ماژول socket بهصورت socket.CAPI ارائه شده است و unicodedata نیز ucnhash_CAPI را ارائه میکند. سایر ماژولهای توسعهای میتوانند ماژول را ایمپورت کنند، برای به دست آوردن شیء کپسول به دیکشنری آن دسترسی پیدا کنند و سپس اشارهگر void * را به دست آورند که معمولاً به آرایهای از اشارهگرها به توابع مختلف API ماژول اشاره میکند.
یک نوع دادهی موجود از قبل برای این کار استفاده میشود، PyCObject، اما ایمنی نوع فراهم نمیکند. کد مخرب نوشتهشده به پایتون خالص میتواند با گرفتن یک PyCObject از ماژول A و جایگزین کردن آن بهنحوی بهجای PyCObject در ماژول B، خطای قطعهبندی (segmentation fault) ایجاد کند. کپسولها نام خود را میدانند و بهدستآوردن اشارهگر مستلزم ارائهی نام است:
void *vtable;
if (!PyCapsule_IsValid(capsule, "mymodule.CAPI") {
PyErr_SetString(PyExc_ValueError, "argument type invalid");
return NULL;
}
vtable = PyCapsule_GetPointer(capsule, "mymodule.CAPI");
به شما اطمینان داده میشود که vtable به هر چیزی که انتظار دارید اشاره میکند. اگر کپسول دیگری ارسال شده باشد، PyCapsule_IsValid() نام ناسازگار را تشخیص میدهد و مقدار false را برمیگرداند. برای اطلاعات بیشتر دربارهی استفاده از این اشیاء به ارائهی یک C API برای ماژول توسعهای مراجعه کنید.
پایتون 2.7 اکنون بهطور داخلی از کپسولها برای ارائهی APIهای مختلف ماژولهای توسعهای استفاده میکند، اما PyCObject_AsVoidPtr() تغییر داده شد تا کپسولها را مدیریت کند و سازگاری زمان کامپایل با رابط PyCObject حفظ شود. استفاده از PyCObject_AsVoidPtr() هشدار PendingDeprecationWarning را صادر خواهد کرد که بهطور پیشفرض بیصدا است.
در پایتون 3.1 پیادهسازی شد و توسط لری هستینگز به نسخه 2.7 بکپورت شد؛ در bpo-5630 مورد بحث قرار گرفت.
تغییرات خاص پورت: ویندوز¶
ماژول
msvcrtاکنون شامل چند ثابت از پروندهی سرآیندcrtassem.hاست:CRT_ASSEMBLY_VERSION،VC_ASSEMBLY_PUBLICKEYTOKENوLIBRARIES_ASSEMBLY_NAME_PREFIX. (ارائه شده توسط دیوید کورناپو؛ bpo-4365.)ماژول
_winregبرای دسترسی به رجیستری اکنون توابعCreateKeyEx()وDeleteKeyEx()را پیادهسازی میکند که نسخههای توسعهیافتهای از توابع پیشتر پشتیبانیشده هستند و چند آرگومان اضافی میگیرند. توابعDisableReflectionKey()،EnableReflectionKey()وQueryReflectionKey()نیز آزمایش و مستندسازی شدند. (پیادهسازی توسط Brian Curtin: bpo-7347.)برای آغاز کردن نخها از API جدید
_beginthreadex()استفاده میشود و اکنون از توابع بومی ذخیرهسازی نخمحلی استفاده میشود. (مشارکتشده توسط Kristján Valur Jónsson؛ bpo-3582.)تابع
os.kill()اکنون در ویندوز کار میکند. مقدار سیگنال میتواند یکی از ثابتهایCTRL_C_EVENT،CTRL_BREAK_EVENTیا هر عدد صحیح باشد. دو ثابت نخست رویدادهای فشردن کلید Control-C و Control-Break را به زیرفرایندها ارسال میکنند؛ هر مقدار دیگر از APITerminateProcess()استفاده خواهد کرد. (مشارکتشده توسط Miki Tebeka؛ bpo-1220212.)تابع
os.listdir()اکنون برای مسیر خالی بهدرستی شکست میخورد. (اصلاحشده توسط Hirokazu Yamamoto؛ bpo-5913.)ماژول
mimetypesاکنون هنگام مقداردهی اولیه، پایگاه داده MIME را از رجیستری ویندوز میخواند. (وصل توسط گابریل جنلینا؛ bpo-4969.)
تغییرات خاص پورت: Mac OS X¶
مسیر
/Library/Python/2.7/site-packagesاکنون بهsys.pathالحاق میشود تا بستههای افزودهشده میان نصب سیستمی و یک رونوشت نصبشده توسط کاربر از همان نسخه به اشتراک گذاشته شوند. (تغییر توسط Ronald Oussoren؛ bpo-4865.)تغییر یافته در نسخهی 2.7.13: از نسخهی 2.7.13 به بعد، این تغییر حذف شد.
/Library/Python/2.7/site-packages، پوشهی site-packages که توسط پایتون 2.7 سیستمیِ ارائهشده از سوی اپل استفاده میشود، دیگر برای پایتونهای نصبشده توسط کاربر، مانند پایتونهایی که از طریق نصبکنندههای python.org نصب شدهاند، بهsys.pathالحاق نمیشود. از macOS 10.12 به بعد، اپل نحوهی پیکربندی پوشهی site-packages سیستمی را تغییر داد؛ این امر میتوانست باعث شود نصب اجزای pip، مانند setuptools، شکست بخورد. بستههای نصبشده برای پایتون سیستمی دیگر با پایتونهای نصبشده توسط کاربر به اشتراک گذاشته نمیشوند. (bpo-28440)
تغییرات خاص پورت: FreeBSD¶
ثابت
SO_SETFIBدر FreeBSD 7.1، که همراه با متدهایsocket()یعنیgetsockopt()/setsockopt()برای انتخاب جدول مسیریابی جایگزین استفاده میشود، اکنون در ماژولsocketدر دسترس است. (افزودهشده توسط Kyle VanderBeek؛ bpo-8235.)
سایر تغییرات و اصلاحات¶
دو اسکریپت بنچمارک،
iobenchوccbench، به پوشهیToolsاضافه شدند.iobenchهنگام انجام عملیات گوناگون، سرعت اشیاء ورودی/خروجی پروندهی توکار برگرداندهشده توسطopen()را اندازهگیری میکند، وccbenchیک بنچمارک همروندی است که میکوشد هنگام انجام چندین وظیفه با استفاده از تعداد متغیری از نخها، توان عملیاتی محاسبات، تأخیر تعویض نخ، و پهنای باند پردازش ورودی/خروجی را اندازهگیری کند.اسکریپت
Tools/i18n/msgfmt.pyاکنون شکلهای جمع را در پروندههای.poدرک میکند. (توسط Martin von Löwis اصلاح شد؛ bpo-5464.)هنگام ایمپورت کردن یک ماژول از یک پروندهی
.pycیا.pyoکه همتای.pyآن موجود است، در صورتی که نام پروندهی اصلی از اعتبار افتاده باشد، ویژگیهایco_filenameاشیاء کدی که به دست میآیند بازنویسی میشوند. این وضعیت میتواند رخ دهد اگر پرونده تغییر نام داده باشد، جابهجا شده باشد یا از طریق مسیرهای مختلف به آن دسترسی پیدا شود. (وصله توسط Ziga Seilnacht و Jean-Paul Calderone؛ bpo-1180193.)اسکریپت
regrtest.pyاکنون سوییچ--randseed=را میپذیرد که یک عدد صحیح میگیرد؛ این عدد بهعنوان بذر تصادفی برای گزینهی-rکه آزمونها را به ترتیب تصادفی اجرا میکند، استفاده خواهد شد. گزینهی-rهمچنین بذر استفادهشده را گزارش میدهد (افزودهشده توسط Collin Winter.)سوییچ دیگر
regrtest.py،-jاست که یک عدد صحیح میگیرد و مشخص میکند چند آزمون بهطور موازی اجرا میشوند. این امکان را فراهم میکند که زمان اجرای کل روی ماشینهای چندهستهای کاهش یابد. این گزینه با چندین گزینه دیگر، از جمله سوییچ-Rکه بهدلیل ایجاد زمانهای اجرای طولانی شناخته میشود، سازگار است. (افزودهشده توسط Antoine Pitrou، bpo-6152.) این گزینه همچنین میتواند با سوییچ جدید-Fاستفاده شود که آزمونهای انتخابشده را در یک حلقه اجرا میکند تا زمانی که شکست بخورند. (افزودهشده توسط Antoine Pitrou؛ bpo-7312.)هنگامی که بهعنوان اسکریپت اجرا میشود، ماژول
py_compile.pyاکنون'-'را بهعنوان آرگومان میپذیرد که فهرست نام پروندههایی را که باید کامپایل شوند از ورودی استاندارد میخواند. (ارائهشده توسط Piotr Ożarowski؛ bpo-8233.)
انتقال به پایتون 2.7¶
این بخش، تغییرات پیشتر توضیح دادهشده و سایر رفع اشکالها را فهرست میکند که ممکن است نیازمند تغییراتی در کد شما باشند:
تابع
range()آرگومانهای خود را بهطور سازگارتری پردازش میکند؛ اکنون__int__()را روی آرگومانهایی که اعشاری یا عدد صحیح نیستند و به آن داده میشوند فراخوانی میکند. (توسط Alexander Belopolsky اصلاح شد؛ bpo-1533.)متد
format()رشته، دقت پیشفرض استفادهشده برای اعداد ممیز شناور و مختلط را از ۶ رقم اعشاری به ۱۲ تغییر داد، که با دقت استفادهشده توسطstr()مطابقت دارد. (تغییر توسط Eric Smith؛ bpo-5920.)به دلیل یک بهینهسازی برای دستور
with، متدهای ویژه__enter__()و__exit__()باید به نوع شیء تعلق داشته باشند و نمیتوان آنها را مستقیماً به نمونهی شیء الصاق کرد. این موضوع بر کلاسهای سبک جدید (new-style) (مشتقشده ازobject) و نوعهای توسعهای C تأثیر میگذارد. (bpo-6101.)به دلیل یک اشکال در Python 2.6، پارامتر exc_value در متدهای
__exit__()اغلب نمایش رشتهای استثنا بود، نه یک نمونه از آن. این اشکال در 2.7 برطرف شد، بنابراین exc_value همانطور که انتظار میرود یک نمونه خواهد بود. (اصلاحشده توسط Florent Xicluna؛ bpo-7853.)وقتی مجموعهی محدودی از ویژگیها با استفاده از
__slots__تنظیم شده بود، حذف یک ویژگی تنظیمنشده همانطور که انتظار میرفتAttributeErrorایجاد نمیکرد. این مشکل توسط Benjamin Peterson برطرف شد؛ bpo-7604.)
در کتابخانه استاندارد:
عملیات روی نمونههای
datetimeکه به سالی خارج از بازه پشتیبانیشده منجر میشدند، همیشه خطایOverflowErrorایجاد نمیکردند. چنین خطاهایی اکنون با دقت بیشتری بررسی میشوند و از این پس استثنا ایجاد خواهد شد. (گزارششده توسط Mark Leander، وصل توسط Anand B. Pillai و Alexander Belopolsky؛ bpo-7150.)هنگام استفاده از نمونههای
Decimalبا متدformat()یک رشته، ترازبندی پیشفرض قبلاً چپچین بود. این مورد به راستچین تغییر کرده است که ممکن است خروجی برنامههای شما را تغییر دهد. (تغییر توسط Mark Dickinson؛ bpo-6857.)مقایسههای شامل مقدار NaN علامتدهنده (یا
sNAN) اکنون به جای آنکه بسته به عملگر مقایسه، بیصدا مقداری درست یا نادرست برگردانند، سیگنالInvalidOperationرا صادر میکنند. مقادیر NaN خاموش (یاNaN) اکنون هشپذیر هستند. (توسط Mark Dickinson اصلاح شد؛ bpo-7279.)کتابخانهی
xml.etree.ElementTreeهنگام خروجی گرفتن از یک دستورالعمل پردازش XML (که به شکل<?xml-stylesheet href="#style1"?>است) یا کامنت (که به شکل<!-- comment -->است)، دیگر امپرساندها و براکتهای زاویهای را خنثی نمیکند. (وصل توسط نیل مولر؛ bpo-2746.)متد
readline()از اشیایStringIOاکنون هنگامی که طول منفی درخواست شود، هیچ کاری انجام نمیدهد؛ همانطور که دیگر اشیای شبهپرونده چنین میکنند. (bpo-7348).ماژول
syslogاکنون بهجای مقدار پیشفرض قبلی'python'، از مقدارsys.argv[0]بهعنوان شناسه استفاده خواهد کرد. (تغییر دادهشده توسط Sean Reifschneider؛ bpo-8451.)مدیریت خطای پیشفرض ماژول
tarfileتغییر کرده است تا دیگر خطاهای مهلک را سرکوب نکند. سطح خطای پیشفرض قبلاً 0 بود، به این معنا که خطاها فقط باعث میشدند پیامی در گزارش اشکالزدایی نوشته شود، اما از آنجا که گزارش اشکالزدایی بهطور پیشفرض فعال نیست، این خطاها نادیده میمانند. سطح خطای پیشفرض اکنون 1 است که در صورت وقوع خطا، استثنا مطرح میکند. (تغییر توسط Lars Gustäbel؛ bpo-7357.)تابع
urlsplit()در ماژولurlparseاکنون طرحوارههای ناشناختهی URL را به شکلی سازگار با RFC 3986 مدیریت میکند: اگر URL به شکل"<something>://..."باشد، متن پیش از://بهعنوان طرحواره در نظر گرفته میشود، حتی اگر طرحوارهای ساختگی باشد که ماژول آن را نمیشناسد. این تغییر ممکن است کدهایی را که برای دور زدن رفتار قدیمی نوشتهشده بودند، از کار بیندازد. برای مثال، پایتون 2.6.4 یا 2.5 موارد زیر را برمیگرداند:>>> import urlparse >>> urlparse.urlsplit('invented://host/filename?query') ('invented', '', '//host/filename?query', '', '')
پایتون 2.7 (و پایتون 2.6.5) خواهد برگرداند:
>>> import urlparse >>> urlparse.urlsplit('invented://host/filename?query') ('invented', 'host', '/filename?query', '', '')
(در واقع پایتون 2.7 خروجی کمی متفاوتی تولید میکند، زیرا بهجای یک تاپل استاندارد، یک تاپل نامدار برمیگرداند.)
برای ماژولهای توسعهای C:
افزونههای C که از کدهای قالب عدد صحیح با خانواده توابع
PyArg_Parse*استفاده میکنند، اکنون به جای تولیدDeprecationWarning، استثنایTypeErrorایجاد میکنند (bpo-5080).بهجای توابع قدیمی
PyOS_ascii_strtod()وPyOS_ascii_atof()که اکنون منسوخ شدهاند، از تابع جدیدPyOS_string_to_double()استفاده کنید.
برای برنامههایی که پایتون را در خود تعبیه میکنند:
تابع
PySys_SetArgvEx()اضافه شد که به برنامهها امکان میدهد حفرهی امنیتی ناشی از استفاده از تابع موجودPySys_SetArgv()را ببندند. بررسی کنید که آیاPySys_SetArgv()را فراخوانی میکنید و با دقت در نظر بگیرید که آیا برنامه باید ازPySys_SetArgvEx()با تنظیم updatepath روی false استفاده کند.
ویژگیهای جدید افزودهشده به نسخههای نگهداری پایتون 2.7¶
زمانی که وضعیت واقعاً ایجاب کند، ممکن است قابلیتهای جدیدی به نسخههای نگهداری Python 2.7 افزوده شود. هرگونه افزودنی از این دست باید فرایند پیشنهاد بهبود پایتون را طی کند و دلایل قانعکنندهای ارائه دهد که چرا نمیتوان بهطور کافی با افزودن قابلیت جدید تنها به Python 3، یا با انتشار آن در شاخص بستههای پایتون (Python Package Index) به آنها پرداخت.
علاوه بر پیشنهادهای خاص فهرستشده در زیر، یک معافیت کلی وجود دارد که اجازه میدهد هشدارهای -3 جدید در هر نسخه نگهداری پایتون 2.7 افزوده شوند.
دو متغیر محیطی جدید برای حالت اشکالزدایی¶
در حالت اشکالزدایی، آمار [xxx refs] بهطور پیشفرض نوشته نمیشود و اکنون باید متغیر محیطی PYTHONSHOWREFCOUNT نیز تنظیم شود. (مشارکتشده توسط Victor Stinner؛ bpo-31733.)
وقتی پایتون با تعریف COUNT_ALLOC کامپایل شود، شمارندههای تخصیص دیگر بهطور پیشفرض برونریزی نمیشوند: اکنون باید متغیر محیطی PYTHONSHOWALLOCCOUNT نیز تنظیم شود. علاوه بر این، شمارندههای تخصیص اکنون به stderr برونریزی میشوند، نه به stdout. (مشارکتشده توسط Victor Stinner؛ bpo-31692.)
اضافه شده در نسخهی 2.7.15.
PEP 434: استثنای بهبود IDLE برای همه شاخهها¶
PEP 434 معافیتی کلی را برای تغییرات اعمالشده در محیط توسعهی IDLE — که همراه با پایتون عرضه میشود — شرح میدهد. این معافیت به توسعهدهندگان IDLE امکان میدهد تا تجربهی کاربری سازگارتری را در تمام نسخههای پشتیبانیشدهی پایتون 2 و 3 فراهم کنند.
برای جزئیات هرگونه تغییر در IDLE، به پروندهی NEWS نسخهی مورد نظر مراجعه کنید.
PEP 466: بهبودهای امنیت شبکه برای پایتون 2.7¶
PEP 466 شماری از پیشنهادهای بهبود امنیت شبکه را توصیف میکند که برای گنجاندن در نسخههای نگهداری پایتون 2.7 تصویب شدهاند، و نخستین این تغییرات در نسخهی پایتون 2.7.7 ظاهر شد.
ویژگیهای مرتبط با PEP 466 که در پایتون 2.7.7 اضافه شدند:
hmac.compare_digest()از پایتون 3 به نسخههای قدیمیتر بکپورت شد تا عملیات مقایسهی مقاوم در برابر حملهی زمانی برای برنامههای پایتون 2 در دسترس قرار گیرد. (نوشتهی Alex Gaynor؛ bpo-21306.)در نصبکنندههای رسمی ویندوز که در python.org منتشر شدهاند، OpenSSL به نسخهی 1.0.1g ارتقا یافت. (با مشارکت Zachary Ware؛ bpo-21462.)
ویژگیهای مرتبط با PEP 466 افزودهشده در پایتون 2.7.8:
hashlib.pbkdf2_hmac()از Python 3 به نسخههای قدیمیتر منتقل شد تا الگوریتم هش مناسب برای ذخیرهسازی امن گذرواژه، بهطور گسترده در دسترس برنامههای Python 2 قرار گیرد. (با مشارکت Alex Gaynor؛ bpo-21304.)OpenSSL در نصبکنندههای رسمی ویندوز که در python.org منتشر شدهاند، به نسخهی 1.0.1h ارتقا یافت. (مشارکت توسط Zachary Ware در bpo-21671 برای CVE 2014-0224.)
ویژگیهای مرتبط با PEP 466 افزودهشده در Python 2.7.9:
بیشترِ ماژول
sslپایتون 3.4 به نسخههای قبلی بازگردانده شد . این بدان معناست کهsslاکنون از نشانگر نام سرور (Server Name Indication)، تنظیمات TLS1.x، دسترسی به مخزن گواهیهای پلتفرم، کلاسSSLContextو قابلیتهای دیگر پشتیبانی میکند. (مشارکتشده توسط Alex Gaynor و David Reid؛ bpo-21308.)برای جزئیات دقیق، به یادداشتهای «نسخهی افزودهشده: 2.7.9» در مستندات ماژول رجوع کنید.
تابع
os.urandom()تغییر یافت تا بهجای باز کردن مجدد/dev/urandomدر هر فراخوانی، توصیفگر پروندهی/dev/urandomرا در نهانگاه ذخیره کند. (با مشارکت الکس گینور؛ bpo-21305.)hashlib.algorithms_guaranteedوhashlib.algorithms_availableاز پایتون ۳ بکپورت شدند تا انتخاب قویترین الگوریتم هش موجود برای برنامههای پایتون ۲ آسانتر شود. (مشارکتشده توسط Alex Gaynor در bpo-21307)
PEP 477: بکپورت ensurepip (PEP 453) به پایتون 2.7¶
PEP 477 گنجاندن ماژول ensurepip مربوط به PEP 453 و مستندات بهبودیافتهای که بهواسطهی آن ممکن شد را در نسخههای نگهداری Python 2.7 تصویب میکند؛ این موارد نخستین بار در نسخهی Python 2.7.9 ظاهر شدند.
بوتاسترپینگ pip بهصورت پیشفرض¶
ماژول جدید ensurepip (تعریفشده در PEP 453) سازوکاری استاندارد و چندسکویی برای بوتاسترپینگ کردن نصبکنندهی pip در نصبهای پایتون فراهم میکند. نسخهی pip که همراه پایتون 2.7.9 ارائه میشود، pip 1.5.6 است و نسخههای نگهداری 2.7.x در آینده، نسخهی همراه را به جدیدترین نسخهی pip که هنگام ایجاد نسخهی نامزد انتشار (release candidate) در دسترس است، بهروزرسانی خواهند کرد.
بهطور پیشفرض، دستورهای pip، pipX و pipX.Y در همهی پلتفرمها (که در آن X.Y نشاندهندهی نسخهی نصب پایتون است) همراه با بستهی پایتونی pip و وابستگیهای آن نصب میشوند.
برای ساخت سیپایتون از سورس در سیستمهای POSIX، دستورهای make install و make altinstall بهطور پیشفرض pip را بوتاسترپ نمیکنند. این رفتار را میتوان از طریق گزینههای configure کنترل کرد و از طریق گزینههای Makefile بازنویسی کرد.
در ویندوز و Mac OS X، نصبکنندههای سیپایتون اکنون بهطور پیشفرض pip را همراه با خودِ سیپایتون نصب میکنند (کاربران میتوانند در طول فرایند نصب از نصب آن صرفنظر کنند). کاربران ویندوز باید تغییرات خودکار PATH را فعال کنند تا pip بهطور پیشفرض از خط فرمان در دسترس باشد؛ در غیر این صورت همچنان میتوان از طریق راهانداز پایتون برای ویندوز با py -m pip به آن دسترسی داشت.
همانطور که در PEP بحث شده است، بستهسازان پلتفرم میتوانند انتخاب کنند که این دستورها را بهطور پیشفرض نصب نکنند، به شرط آنکه این دستورها هنگام فراخوانی، دستورالعملهای روشن و سادهای درباره نحوه نصبشان روی آن پلتفرم ارائه دهند (معمولاً با استفاده از مدیر بسته سیستم).
تغییرات مستندات¶
بهعنوان بخشی از این تغییر، بخشهای نصب ماژولهای پایتون و توزیع ماژولهای پایتون از مستندات، بهطور کامل بهعنوان اسناد کوتاه «شروع کار» و «پرسشهای متداول» بازطراحی شدهاند. بیشتر مستندات بستهبندی اکنون به Python Packaging User Guide که توسط Python Packaging Authority نگهداری میشود و مستندات پروژههای جداگانه منتقل شده است.
با این حال، از آنجا که این مهاجرت در حال حاضر هنوز کامل نشده است، نسخههای قدیمی آن راهنماها همچنان به صورت ساخت توسعههای C و C++ با setuptools و ساخت توسعههای C و C++ با setuptools در دسترس هستند.
همچنین ملاحظه نمائید
- PEP 453 -- بوتاسترپینگ صریح pip در نصبهای پایتون
PEP نوشتهشده توسط Donald Stufft و Nick Coghlan و پیادهسازیشده توسط Donald Stufft، Nick Coghlan، Martin von Löwis و Ned Deily.
PEP 476: فعالسازی راستیآزمایی گواهی بهصورت پیشفرض برای کلاینتهای http کتابخانه استاندارد¶
PEP 476 ماژول httplib و ماژولهایی را که از آن استفاده میکنند، مانند urllib2 و xmlrpclib، بهروزرسانی کرد تا از این پس بهطور پیشفرض راستیآزمایی کنند که سرور گواهیای ارائه میدهد که توسط یک مرجع صدور گواهی موجود در ذخیرهگاه اعتماد پلتفرم (trust store) امضا شده باشد و نام میزبان آن با نام میزبان درخواستشده مطابقت داشته باشد؛ این امر امنیت بسیاری از برنامهها را بهطور چشمگیری بهبود میبخشد. این تغییر در نسخه Python 2.7.9 اعمال شد.
برنامههایی که به رفتار قدیمی قبلی نیاز دارند میتوانند یک زمینه جایگزین ارسال کنند:
import urllib2
import ssl
# This disables all verification
context = ssl._create_unverified_context()
# This allows using a specific certificate for the host, which doesn't need
# to be in the trust store
context = ssl.create_default_context(cafile="/path/to/file.crt")
urllib2.urlopen("https://invalid-cert", context=context)
PEP 493: ابزارهای مهاجرت به راستیآزمایی HTTPS برای پایتون 2.7¶
PEP 493 برای پشتیبانی از فرایند تدریجیترِ ارتقای زیرساخت در محیطهایی که برنامهها و سرویسهایی را در بر میگیرند که هنگام برقراری اتصالات HTTPS کلاینت به پردازش تاریخیِ سهلگیرانهی گواهیهای سرور تکیه دارند، ابزارهای مهاجرت بیشتری فراهم میکند. این افزودهها در نسخهی پایتون 2.7.12 ارائه شدند.
این ابزارها برای استفاده در مواردی در نظر گرفته شدهاند که نمیتوان برنامهها و سرویسهای تحت تأثیر را بهگونهای تغییر داد که هنگام برقراری اتصال، بهطور صریح یک زمینه SSL آزادتر را ارسال کنند.
برای برنامهها و سرویسهایی که بههیچوجه قابل تغییر نیستند، میتوان متغیر محیطی جدید PYTHONHTTPSVERIFY را روی 0 تنظیم کرد تا یک فرایند پایتون بهطور کامل به رفتار سهلگیرانهی پیشفرض پایتون 2.7.8 و نسخههای پیشین بازگردد.
برای مواردی که کد برقراری اتصال قابل تغییر نیست، اما کل برنامه قابل تغییر است، میتوان از تابع جدید ssl._https_verify_certificates() برای تنظیم رفتار پیشفرض در زمان اجرا استفاده کرد.
هدف ساخت جدید make regen-all¶
برای سادهسازی کامپایل متقاطع (cross-compilation)، و برای اطمینان از اینکه سیپایتون میتواند بدون نیاز به نسخهای از پایتون که از قبل در دسترس باشد، بهطور قابل اطمینان کامپایل شود، سیستم ساخت مبتنی بر autotools دیگر تلاش نمیکند پروندههای تولیدشده را بهصورت ضمنی بر اساس زمانهای تغییر پرونده بازکامپایل کند.
در عوض، دستور جدید make regen-all اضافه شده است تا در صورت نیاز، این پروندهها بهاجبار بازتولید شوند (مثلاً پس از آنکه نسخهی اولیهای از پایتون بر اساس نسخههای از پیش تولیدشده ساخته شده باشد).
اهداف بازتولید گزینشیتری نیز تعریف شدهاند؛ برای جزئیات به Makefile.pre.in مراجعه کنید.
(مشارکتشده توسط Victor Stinner در bpo-23404.)
اضافه شده در نسخهی 2.7.14.
حذف هدف ساخت make touch¶
هدف ساخت make touch که پیشتر برای درخواست بازتولید ضمنی پروندههای تولیدشده از طریق بهروزرسانی زمانهای تغییرشان استفاده میشد، حذف شده است.
این مورد با هدف جدید make regen-all جایگزین شده است.
(مشارکتشده توسط Victor Stinner در bpo-23404.)
تغییر یافته در نسخهی 2.7.14.
سپاسگزاریها¶
نویسنده مایل است از افراد زیر بهخاطر ارائه پیشنهادها، اصلاحات و کمک در پیشنویسهای مختلف این مقاله تشکر کند: Nick Coghlan، Philip Jenvey، Ryan Lovett، R. David Murray و Hugh Secker-Walker.