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

نویسنده:

Raymond Hettinger

این مقاله ویژگی‌های جدید پایتون 3.2 را در مقایسه با 3.1 توضیح می‌دهد. پایتون 3.2 در تاریخ ۲۰ فوریه ۲۰۱۱ منتشر شد. این مقاله بر چند نکته‌ی برجسته تمرکز دارد و چند مثال ارائه می‌دهد. برای جزئیات کامل، پرونده‌ی Misc/NEWS را ببینید.

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

PEP 392 - زمان‌بندی انتشار پایتون 3.2

PEP 384: تعریف رابط دودویی پایدار (ABI)

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

با پایتون 3.2، یک رویکرد جایگزین در دسترس قرار می‌گیرد: ماژول‌های توسعه‌ای که خود را به یک API محدود منحصر می‌کنند (با تعریف Py_LIMITED_API) نمی‌توانند از بسیاری از اجزای داخلی استفاده کنند، اما به مجموعه‌ای از توابع API محدود می‌شوند که وعده داده شده است در طول چندین نسخه پایدار بمانند. در نتیجه، ماژول‌های توسعه‌ای که برای 3.2 در آن حالت ساخته شده‌اند، با 3.3، 3.4 و غیره نیز کار خواهند کرد. ماژول‌های توسعه‌ای که از جزئیات ساختارهای حافظه استفاده می‌کنند همچنان قابل ساخت هستند، اما باید برای هر نسخه‌ی دارای ویژگی جدید (feature release) دوباره کامپایل شوند.

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

PEP 384 - تعریف ABI پایدار

PEP (پیشنهاد بهبود پایتون) نوشته‌شده توسط Martin von Löwis.

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

یک ماژول جدید برای تجزیه‌ی خط فرمان، argparse، معرفی شد تا بر محدودیت‌های optparse غلبه کند؛ ماژولی که از آرگومان‌های جایگاهی (نه فقط گزینه‌ها)، زیرفرمان‌ها، گزینه‌های الزامی و دیگر الگوهای رایج تعیین و اعتبارسنجی گزینه‌ها پشتیبانی نمی‌کرد.

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

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

import argparse
parser = argparse.ArgumentParser(
            description = 'Manage servers',         # main description for help
            epilog = 'Tested on Solaris and Linux') # displayed after help
parser.add_argument('action',                       # argument name
            choices = ['deploy', 'start', 'stop'],  # three allowed values
            help = 'action on each target')         # help msg
parser.add_argument('targets',
            metavar = 'HOSTNAME',                   # var name used in help msg
            nargs = '+',                            # require one or more targets
            help = 'url for target machines')       # help msg explanation
parser.add_argument('-u', '--user',                 # -u or --user option
            required = True,                        # make it a required argument
            help = 'login as user')

مثالی از فراخوانی پارسر روی یک رشته فرمان:

>>> cmd = 'deploy sneezy.example.com sleepy.example.com -u skycaptain'
>>> result = parser.parse_args(cmd.split())
>>> result.action
'deploy'
>>> result.targets
['sneezy.example.com', 'sleepy.example.com']
>>> result.user
'skycaptain'

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

>>> parser.parse_args('-h'.split())

usage: manage_cloud.py [-h] -u USER
                       {deploy,start,stop} HOSTNAME [HOSTNAME ...]

Manage servers

positional arguments:
  {deploy,start,stop}   action on each target
  HOSTNAME              url for target machines

optional arguments:
  -h, --help            show this help message and exit
  -u USER, --user USER  login as user

Tested on Solaris and Linux

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

import argparse
parser = argparse.ArgumentParser(prog='HELM')
subparsers = parser.add_subparsers()

parser_l = subparsers.add_parser('launch', help='Launch Control')   # first subgroup
parser_l.add_argument('-m', '--missiles', action='store_true')
parser_l.add_argument('-t', '--torpedos', action='store_true')

parser_m = subparsers.add_parser('move', help='Move Vessel',        # second subgroup
                                 aliases=('steer', 'turn'))         # equivalent names
parser_m.add_argument('-c', '--course', type=int, required=True)
parser_m.add_argument('-s', '--speed', type=int, default=0)
$ ./helm.py --help                         # top level help (launch and move)
$ ./helm.py launch --help                  # help for launch options
$ ./helm.py launch --missiles              # set missiles=True and torpedos=False
$ ./helm.py steer --course 180 --speed 5   # set movement parameters

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

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

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

برای جزئیات تفاوت‌ها با optparse به مهاجرت کد optparse به argparse مراجعه کنید.

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

ماژول logging دو نوع پیکربندی ارائه می‌کرد: یک سبک با فراخوانی تابع برای هر گزینه، یا سبکی دیگر که توسط یک پرونده خارجیِ ذخیره‌شده در قالب configparser هدایت می‌شد. این گزینه‌ها انعطاف‌پذیری ایجاد پیکربندی از پرونده‌های JSON یا YAML را فراهم نمی‌کردند و از پیکربندی افزایشی نیز پشتیبانی نمی‌کردند؛ پیکربندی‌ای که برای تعیین گزینه‌های گزارش‌گیر از خط فرمان لازم است.

برای پشتیبانی از سبکی انعطاف‌پذیرتر، این ماژول اکنون logging.config.dictConfig() را برای تعیین پیکربندی گزارش‌گیری با دیکشنری‌های ساده‌ی پایتون ارائه می‌دهد. گزینه‌های پیکربندی شامل قالب‌بندها، هندلرها، فیلترها و گزارش‌گیرها است. در ادامه یک نمونه‌ی کارا از دیکشنری پیکربندی آمده است:

{"version": 1,
 "formatters": {"brief": {"format": "%(levelname)-8s: %(name)-15s: %(message)s"},
                "full": {"format": "%(asctime)s %(name)-15s %(levelname)-8s %(message)s"}
                },
 "handlers": {"console": {
                   "class": "logging.StreamHandler",
                   "formatter": "brief",
                   "level": "INFO",
                   "stream": "ext://sys.stdout"},
              "console_priority": {
                   "class": "logging.StreamHandler",
                   "formatter": "full",
                   "level": "ERROR",
                   "stream": "ext://sys.stderr"}
              },
 "root": {"level": "DEBUG", "handlers": ["console", "console_priority"]}}

اگر آن دیکشنری در پرونده‌ای به نام conf.json ذخیره شده باشد، می‌توان آن را با کدی مانند این بارگذاری و فراخوانی کرد:

>>> import json, logging.config
>>> with open('conf.json') as f:
...     conf = json.load(f)
...
>>> logging.config.dictConfig(conf)
>>> logging.info("Transaction completed normally")
INFO    : root           : Transaction completed normally
>>> logging.critical("Abnormal termination")
2011-02-17 11:14:36,694 root            CRITICAL Abnormal termination

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

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

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

PEP 3148: ماژول concurrent.futures

کد ایجاد و مدیریت همزمانی در یک فضای نام سطح بالای جدید با نام concurrent در حال گردآوری است. نخستین عضو آن بسته‌ای به نام futures است که رابطی یکنواخت و سطح بالا برای مدیریت نخ‌ها و فرایندها فراهم می‌کند.

طراحی concurrent.futures از بسته‌ی java.util.concurrent الهام گرفته است. در آن مدل، یک فراخوانی در حال اجرا و نتیجه‌ی آن توسط یک شیء Future نمایش داده می‌شوند که ویژگی‌های مشترک میان نخ‌ها، فرایندها و فراخوانی‌های رویه از راه دور را انتزاعی می‌کند. این شیء از بررسی وضعیت (در حال اجرا یا پایان‌یافته)، مهلت‌های زمانی، لغو کردن، افزودن کال‌بک‌ها و دسترسی به نتایج یا استثناها پشتیبانی می‌کند.

ارائه‌ی اصلی ماژول جدید، دو کلاس اجراکننده برای راه‌اندازی و مدیریت فراخوانی‌هاست. هدف اجراکننده‌ها این است که استفاده از ابزارهای موجود برای انجام فراخوانی‌های موازی را آسان‌تر کنند. آن‌ها شما را از زحمت راه‌اندازی یک استخر منابع، اجرای فراخوانی‌ها، ایجاد یک صف نتایج، افزودن مدیریت مهلت زمانی و محدود کردن تعداد کل نخ‌ها، فرایندها یا فراخوانی‌های رویه از راه دور بی‌نیاز می‌کنند.

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

هر دو کلاس رابط مشترکی با سه متد دارند: submit() برای زمان‌بندی یک فراخوانی‌پذیر و برگرداندن یک شیء Future؛ map() برای زمان‌بندی تعداد زیادی فراخوانی ناهمگام به‌طور هم‌زمان، و shutdown() برای آزادسازی منابع. این کلاس یک مدیر زمینه است و می‌توان از آن در دستور with استفاده کرد تا اطمینان حاصل شود که منابع پس از اتمام اجرای آینده‌نماهایی که در حال حاضر در انتظار هستند، به‌طور خودکار آزاد می‌شوند.

یک نمونه‌ی ساده از ThreadPoolExecutor، راه‌اندازی چهار نخ موازی برای کپی کردن پرونده‌ها است:

import concurrent.futures, shutil
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as e:
    e.submit(shutil.copy, 'src1.txt', 'dest1.txt')
    e.submit(shutil.copy, 'src2.txt', 'dest2.txt')
    e.submit(shutil.copy, 'src3.txt', 'dest3.txt')
    e.submit(shutil.copy, 'src3.txt', 'dest4.txt')

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

PEP 3148 - آینده‌نماها -- اجرای محاسبات به‌صورت ناهمگام

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

کد خواندن موازی URLها با نخ‌ها، مثالی از استفاده از نخ‌ها برای دریافت چند صفحه‌ی وب به‌صورت موازی.

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

PEP 3147: پوشه‌های مخزن PYC

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

مسئله‌ی «جنگ‌های pyc» (pyc fights) با رایج شدن عرضه‌ی توزیع‌های لینوکس همراه با چندین نسخه از پایتون، برجسته‌تر شده است. این تداخل‌ها با جایگزین‌های سی‌پایتون مانند Unladen Swallow نیز به وجود می‌آیند.

برای حل این مشکل، سازوکار ایمپورت پایتون گسترش یافته است تا از نام‌پرونده‌های متمایز برای هر مفسر استفاده کند. به جای آنکه پایتون 3.2 و پایتون 3.3 و Unladen Swallow هر کدام بر سر پرونده‌ای به نام "mymodule.pyc" رقابت کنند، اکنون به دنبال "mymodule.cpython-32.pyc"، "mymodule.cpython-33.pyc" و "mymodule.unladen10.pyc" خواهند گشت. و برای جلوگیری از اینکه همه‌ی این پرونده‌های جدید پوشه‌های منبع را شلوغ کنند، پرونده‌های pyc اکنون در پوشه‌ای به نام "__pycache__" که درون پوشه‌ی بسته ذخیره می‌شود، گردآوری می‌شوند.

علاوه بر نام پرونده‌ها و پوشه‌های مقصد، طرح‌واره جدید چند جنبه دارد که برای برنامه‌نویس قابل مشاهده‌اند:

  • ماژول‌های ایمپورت‌شده اکنون یک ویژگی __cached__ دارند که نام پرونده‌ی واقعیِ ایمپورت‌شده را ذخیره می‌کند:

    >>> import collections
    >>> collections.__cached__
    'c:/py32/lib/__pycache__/collections.cpython-32.pyc'
    
  • برچسبی که برای هر مفسر یکتا است، از ماژول imp قابل دسترسی است:

    >>> import imp
    >>> imp.get_tag()
    'cpython-32'
    
  • اسکریپت‌هایی که سعی می‌کنند نام پرونده منبع را از پرونده ایمپورت‌شده استنتاج کنند، اکنون باید هوشمندتر باشند. دیگر کافی نیست که به‌سادگی «c» را از نام پرونده «.pyc» حذف کنید. در عوض، از توابع جدید در ماژول imp استفاده کنید:

    >>> imp.source_from_cache('c:/py32/lib/__pycache__/collections.cpython-32.pyc')
    'c:/py32/lib/collections.py'
    >>> imp.cache_from_source('c:/py32/lib/collections.py')
    'c:/py32/lib/__pycache__/collections.cpython-32.pyc'
    
  • ماژول‌های py_compile و compileall به‌روزرسانی شده‌اند تا قرارداد نام‌گذاری جدید و پوشه‌ی مقصد جدید را منعکس کنند. فراخوانی compileall از طریق خط فرمان گزینه‌های جدیدی دارد: -i برای مشخص کردن فهرستی از پرونده‌ها و پوشه‌هایی که باید کامپایل شوند، و -b که باعث می‌شود پرونده‌های بایت‌کد به جای __pycache__ در مکان قدیمی خود نوشته شوند.

  • ماژول importlib.abc با کلاس‌های پایه‌ی انتزاعی جدید برای بارگذاری پرونده‌های بایت‌کد به‌روزرسانی شده است. کلاس‌های پایه‌ی انتزاعی قدیمی، PyLoader و PyPycLoader، منسوخ شده‌اند (دستورالعمل‌هایی درباره‌ی چگونگی حفظ سازگاری با پایتون ۳.۱ در مستندات گنجانده شده است).

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

PEP 3147 - پوشه‌های مخزن PYC

PEP نوشته‌شده توسط Barry Warsaw.

PEP 3149: پرونده‌های .so برچسب‌گذاری‌شده با نسخه‌ی رابط دودویی برنامه (ABI)

پوشه‌ی مخزن PYC اجازه می‌دهد چندین پرونده‌ی نهانگاه بایت‌کد در کنار یکدیگر قرار گیرند. این PEP سازوکاری مشابه را برای پرونده‌های شیء اشتراکی (shared object) پیاده‌سازی می‌کند؛ بدین ترتیب که به آن‌ها یک پوشه‌ی مشترک و نام‌های متمایز برای هر نسخه اختصاص می‌دهد.

پوشه‌ی مشترک "pyshared" است و نام پرونده‌ها با مشخص کردن پیاده‌سازی پایتون (مانند سی‌پایتون، PyPy، Jython و غیره)، شماره‌های نسخه‌ی اصلی و فرعی، و پرچم‌های اختیاری ساخت (مانند "d" برای اشکال‌زدایی، "m" برای pymalloc و "u" برای یونیکد پهن (wide-unicode)) از یکدیگر متمایز می‌شوند. برای بسته‌ی دلخواه "foo"، ممکن است هنگام نصب بسته‌ی توزیع، این پرونده‌ها را ببینید:

/usr/share/pyshared/foo.cpython-32m.so
/usr/share/pyshared/foo.cpython-33md.so

در خود پایتون، تگ‌ها از طریق توابعی در ماژول sysconfig قابل دسترسی هستند:

>>> import sysconfig
>>> sysconfig.get_config_var('SOABI')       # find the version tag
'cpython-32mu'
>>> sysconfig.get_config_var('EXT_SUFFIX')  # find the full filename extension
'.cpython-32mu.so'

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

PEP 3149 - پرونده‌های .so برچسب‌گذاری‌شده با نسخه ABI

PEP نوشته‌شده توسط Barry Warsaw.

PEP 3333: رابط دروازه وب‌سرور پایتون v1.0.1

این PEP اطلاعاتی روشن می‌سازد که پروتکل WSGI چگونه باید مسائل بایت/متن را مدیریت کند. چالش این است که مدیریت رشته در پایتون 3 به ساده‌ترین شکل با نوع str انجام می‌شود، هرچند که خود پروتکل HTTP بایت‌محور است.

این PEP میان به‌اصطلاح رشته‌های بومی (native strings) که برای سرآیندها و فراداده‌های درخواست/پاسخ به کار می‌روند و رشته‌های بایتی (byte strings) که برای بدنه‌های درخواست و پاسخ استفاده می‌شوند، تمایز قائل می‌شود.

رشته‌های بومی همیشه از نوع str هستند، اما به نقطه‌کدهایی از U+0000 تا U+00FF محدود می‌شوند که با کدگذاری Latin-1 به بایت‌ها قابل تبدیل‌اند. از این رشته‌ها برای کلیدها و مقادیر در دیکشنری محیط و برای سرآیندها و وضعیت‌های پاسخ در تابع start_response() استفاده می‌شود. این رشته‌ها باید از نظر کدگذاری، از RFC 2616 پیروی کنند. یعنی باید یا نویسه‌های ISO-8859-1 باشند یا از کدگذاری MIME مطابق RFC 2047 استفاده کنند.

برای توسعه‌دهندگانی که برنامه‌های WSGI را از پایتون 2 منتقل می‌کنند، نکات مهم عبارت‌اند از:

  • اگر برنامه از قبل در Python 2 برای سرآیندها از رشته‌ها استفاده می‌کرده است، نیازی به تغییر نیست.

  • اگر در عوض، برنامه سرآیندهای خروجی را کدگذاری کرده یا سرآیندهای ورودی را کدگشایی کرده باشد، در این صورت سرآیندها باید به Latin-1 بازکدگذاری شوند. برای مثال، یک سرآیند خروجی که در utf-8 کدگذاری شده بود و از h.encode('utf-8') استفاده می‌کرد، اکنون باید با استفاده از h.encode('utf-8').decode('latin-1') از بایت‌ها به رشته‌های بومی تبدیل شود.

  • مقادیری که توسط یک برنامه تولید می‌شوند یا با استفاده از متد write() ارسال می‌شوند، باید رشته‌های بایتی باشند. تابع start_response() و environ باید از رشته‌های بومی استفاده کنند. این دو را نمی‌توان با هم ترکیب کرد.

برای پیاده‌سازان سرور که مسیرهای CGI به WSGI یا سایر پروتکل‌های به سبک CGI را می‌نویسند، کاربران باید بتوانند با استفاده از رشته‌های بومی به محیط دسترسی داشته باشند، حتی اگر پلتفرم زیرین قرارداد متفاوتی داشته باشد. برای پر کردن این شکاف، ماژول wsgiref تابع جدیدی به نام wsgiref.handlers.read_environ() دارد که متغیرهای CGI را از os.environ به رشته‌های بومی بازکدگذاری می‌کند و یک دیکشنری جدید بازمی‌گرداند.

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

PEP 3333 - رابط دروازه وب‌سرور پایتون (Python Web Server Gateway Interface) v1.0.1

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

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

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

  • قالب‌بندی رشته در format() و str.format() قابلیت‌های جدیدی برای نویسه‌ی قالب # به دست آورد. پیش‌تر، برای اعداد صحیح در مبنای دودویی، هشت، یا شانزده، این نویسه باعث می‌شد خروجی به‌ترتیب پیشوند '0b'، '0o' یا '0x' بگیرد. اکنون این نویسه می‌تواند اعداد ممیز شناور، اعداد مختلط و Decimal را نیز مدیریت کند، به‌طوری که خروجی همیشه نقطه‌ی اعشار داشته باشد، حتی وقتی هیچ رقمی پس از آن نباشد.

    >>> format(20, '#o')
    '0o24'
    >>> format(12.34, '#5.0f')
    '  12.'
    

    (پیشنهاد Mark Dickinson و پیاده‌سازی Eric Smith در bpo-7094.)

  • همچنین متد جدید str.format_map() وجود دارد که با پذیرش هر شیء نگاشت، قابلیت‌های متد موجود str.format() را گسترش می‌دهد. این متد جدید، استفاده از قالب‌بندی رشته را با هر یک از اشیاء شبه‌دیکشنری فراوان پایتون مانند defaultdict، Shelf، ConfigParser یا dbm ممکن می‌سازد. این متد همچنین با زیرکلاس‌های سفارشی dict که کلیدها را پیش از جستجو عادی‌سازی می‌کنند یا متد __missing__() را برای کلیدهای ناشناخته فراهم می‌کنند، سودمند است:

    >>> import shelve
    >>> d = shelve.open('tmp.shl')
    >>> 'The {project_name} status is {status} as of {date}'.format_map(d)
    'The testing project status is green as of February 15, 2011'
    
    >>> class LowerCasedDict(dict):
    ...     def __getitem__(self, key):
    ...         return dict.__getitem__(self, key.lower())
    ...
    >>> lcd = LowerCasedDict(part='widgets', quantity=10)
    >>> 'There are {QUANTITY} {Part} in stock'.format_map(lcd)
    'There are 10 widgets in stock'
    
    >>> class PlaceholderDict(dict):
    ...     def __missing__(self, key):
    ...         return '<{}>'.format(key)
    ...
    >>> 'Hello {name}, welcome to {location}'.format_map(PlaceholderDict())
    'Hello <name>, welcome to <location>'
    

(پیشنهادشده توسط Raymond Hettinger و پیاده‌سازی‌شده توسط Eric Smith در bpo-6081.)

  • اکنون می‌توان مفسر را با گزینه‌ی بی‌صدا یعنی -q راه‌اندازی کرد تا از نمایش اطلاعات حق نشر و نسخه در حالت تعاملی جلوگیری شود. این گزینه را می‌توان با استفاده از ویژگی sys.flags درون‌نگری کرد:

    $ python -q
    >>> sys.flags
    sys.flags(debug=0, division_warning=0, inspect=0, interactive=0,
    optimize=0, dont_write_bytecode=0, no_user_site=0, no_site=0,
    ignore_environment=0, verbose=0, bytes_warning=0, quiet=1)
    

    (ارائه‌شده توسط Marcin Wojdyr در bpo-1772833).

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

    >>> class A:
    ...     @property
    ...     def f(self):
    ...         return 1 // 0
    ...
    >>> a = A()
    >>> hasattr(a, 'f')
    Traceback (most recent call last):
      ...
    ZeroDivisionError: integer division or modulo by zero
    

    (کشف‌شده توسط Yury Selivanov و رفع‌شده توسط Benjamin Peterson؛ bpo-9666.)

  • برای یک عدد اعشاری یا مختلط، str() اکنون همان repr() آن است. پیش‌تر، شکل str() کوتاه‌تر بود، اما این فقط باعث سردرگمی می‌شد و اکنون که کوتاه‌ترین repr() ممکن به‌طور پیش‌فرض نمایش داده می‌شود، دیگر نیازی به آن نیست:

    >>> import math
    >>> repr(math.pi)
    '3.141592653589793'
    >>> str(math.pi)
    '3.141592653589793'
    

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

  • اشیاء memoryview اکنون متد release() را دارند و همچنین اکنون از پروتکل مدیریت زمینه پشتیبانی می‌کنند. این امر اجازه می‌دهد هر منبعی که هنگام درخواست بافر از شیء اصلی به‌دست آمده بود، به‌موقع آزاد شود.

    >>> with memoryview(b'abcdefgh') as v:
    ...     print(v.tolist())
    [97, 98, 99, 100, 101, 102, 103, 104]
    

    (افزوده‌شده توسط Antoine Pitrou؛ bpo-9757.)

  • پیش‌تر، حذف یک نام از فضای نام محلی در صورتی که آن نام به‌عنوان متغیر آزاد در یک بلوک تودرتو ظاهر شود، غیرمجاز بود:

    def outer(x):
        def inner():
            return x
        inner()
        del x
    

    این کار اکنون مجاز است. به یاد داشته باشید که هدف بند except پاک می‌شود، بنابراین این کد که قبلاً در پایتون 2.6 کار می‌کرد، در پایتون 3.1 خطای SyntaxError ایجاد می‌کرد و اکنون دوباره کار می‌کند:

    def f():
        def print_error():
            print(e)
        try:
            something
        except Exception as e:
            print_error()
            # implicit "del e" here
    

    (به bpo-4617 مراجعه کنید.)

  • نوع‌های دنباله ساختاری اکنون زیرکلاس‌هایی از تاپل هستند. این بدان معناست که ساختارهای C مانند ساختارهایی که توسط os.stat()، time.gmtime() و sys.version_info برگردانده می‌شوند، اکنون مانند یک named tuple عمل می‌کنند و اکنون با توابع و متدهایی که انتظار دارند آرگومان‌شان یک تاپل باشد، کار می‌کنند. این گامی بزرگ به جلو در انعطاف‌پذیر کردن ساختارهای C به اندازه‌ی همتایان پایتون خالص آن‌هاست:

    >>> import sys
    >>> isinstance(sys.version_info, tuple)
    True
    >>> 'Version %d.%d.%d %s(%d)' % sys.version_info
    'Version 3.2.0 final(0)'
    

    (پیشنهاد Arfrever Frehtes Taifersar Arahesis و پیاده‌سازی Benjamin Peterson در bpo-8413.)

  • اکنون کنترل هشدارها با استفاده از متغیر محیطی PYTHONWARNINGS به‌عنوان جایگزینی برای استفاده از -W در خط فرمان، آسان‌تر است:

    $ export PYTHONWARNINGS='ignore::RuntimeWarning::,once::UnicodeWarning::'
    

    (پیشنهادشده توسط Barry Warsaw و پیاده‌سازی‌شده توسط Philip Jenvey در bpo-7301.)

  • یک دسته‌ی هشدار جدید، ResourceWarning، اضافه شده است. این هشدار زمانی منتشر می‌شود که مشکلات احتمالی مربوط به مصرف منابع یا پاک‌سازی شناسایی شوند. این هشدار به‌صورت پیش‌فرض در ساخت‌های نهایی معمولی خاموش است، اما می‌توان آن را از طریق امکانات ارائه‌شده توسط ماژول warnings یا در خط فرمان فعال کرد.

    اگر فهرست gc.garbage هنگام خاموشی مفسر خالی نباشد، یک ResourceWarning صادر می‌شود، و اگر gc.DEBUG_UNCOLLECTABLE تنظیم شده باشد، تمام اشیای گردآوری‌نشدنی چاپ می‌شوند. هدف از این کار آن است که برنامه‌نویس آگاه شود که کد او شامل مشکلات نهایی‌سازی شیء است.

    همچنین یک ResourceWarning زمانی صادر می‌شود که یک file object بدون بسته‌شدن صریح نابود شود. هرچند آزادساز حافظه چنین شیئی تضمین می‌کند که منبع زیرین سیستم‌عامل (معمولاً یک توصیف‌گر پرونده) بسته شود، تأخیر در تخصیص‌زدایی شیء می‌تواند مشکلات گوناگونی به‌وجود آورد، به‌ویژه در ویندوز. در ادامه نمونه‌ای از فعال‌سازی این هشدار از طریق خط فرمان آمده است:

    $ python -q -Wdefault
    >>> f = open("foo", "wb")
    >>> del f
    __main__:1: ResourceWarning: unclosed file <_io.BufferedWriter name='foo'>
    

    (افزوده‌شده توسط آنتوان پی‌ترو و گئورگ براندل در bpo-10093 و bpo-477863.)

  • اشیاء range اکنون از متد‌های index و count پشتیبانی می‌کنند. این بخشی از تلاشی است تا اشیاء بیشتری کلاس پایه انتزاعی collections.Sequence را به‌طور کامل پیاده‌سازی کنند. در نتیجه، زبان API یکدست‌تری خواهد داشت. علاوه بر این، اشیاء range اکنون از اسلایس‌کردن و اندیس‌های منفی پشتیبانی می‌کنند، حتی با مقادیری بزرگ‌تر از sys.maxsize. این امر باعث می‌شود range با فهرست‌ها همکنش‌پذیرتر باشد:

    >>> range(0, 100, 2).count(10)
    1
    >>> range(0, 100, 2).index(10)
    5
    >>> range(0, 100, 2)[5]
    10
    >>> range(0, 100, 2)[0:5]
    range(0, 10, 2)
    

    (با مشارکت Daniel Stutzbach در bpo-9213، Alexander Belopolsky در bpo-2690 و Nick Coghlan در bpo-10889.)

  • تابع توکار callable() از Py2.x احیا شد. این تابع جایگزینی مختصر و خوانا برای استفاده از یک abstract base class در عبارتی مانند isinstance(x, collections.Callable) فراهم می‌کند:

    >>> callable(max)
    True
    >>> callable(20)
    False
    

    (به bpo-10518 مراجعه کنید.)

  • سازوکار ایمپورت پایتون اکنون می‌تواند ماژول‌های نصب‌شده در پوشه‌هایی که مسیرنام‌شان شامل نویسه‌های غیراسکی است را بارگذاری کند. این، مشکل آزاردهنده‌ی پوشه‌های خانگی کاربرانی که نام کاربری‌شان شامل نویسه‌های غیراسکی است را حل کرد.

(نیازمند کار گسترده‌ای از سوی Victor Stinner در bpo-9425.)

ماژول‌های جدید، بهبودیافته و منسوخ

کتابخانه استاندارد پایتون دستخوش تلاش‌های نگهداری قابل توجه و بهبودهای کیفی شده است.

بزرگ‌ترین خبر برای پایتون 3.2 این است که بسته‌ی email، ماژول mailbox و ماژول‌های nntplib اکنون به‌درستی با مدل بایت/متن در پایتون 3 کار می‌کنند. برای نخستین بار، مدیریت صحیح پیام‌هایی با کدگذاری‌های ترکیبی فراهم شده است.

در سراسر کتابخانه استاندارد، توجه دقیق‌تری به کدگذاری‌ها و مسائل متن در برابر بایت‌ها شده است. به‌طور خاص، تعاملات با سیستم‌عامل اکنون بهتر می‌توانند داده‌های غیر اسکی را با استفاده از کدگذاری MBCS ویندوز، کدگذاری‌های آگاه از locale یا UTF-8 تبادل کنند.

دستاورد مهم دیگر، افزودن پشتیبانی به‌مراتب بهتر از اتصالات SSL و گواهی‌های امنیتی است.

علاوه بر این، اکنون کلاس‌های بیشتری مدیر زمینه را پیاده‌سازی می‌کنند تا از پاک‌سازی آسان و قابل‌اتکای منابع با استفاده از دستور with پشتیبانی کنند.

email

کاربردپذیری بسته‌ی email در پایتون ۳ عمدتاً با تلاش‌های گسترده‌ی R. David Murray اصلاح شده است. مشکل این بود که ایمیل‌ها معمولاً به شکل bytes و نه متن str خوانده و ذخیره می‌شوند و ممکن است یک ایمیل واحد شامل چندین کدگذاری باشد. بنابراین، بسته‌ی email باید توسعه می‌یافت تا پیام‌های ایمیل را در قالب بایت پارس و تولید کند.

  • توابع جدید message_from_bytes() و message_from_binary_file()، و کلاس‌های جدید BytesFeedParser و BytesParser امکان تجزیه داده‌های پیام دودویی به اشیای مدل را فراهم می‌کنند.

  • با ورود بایت‌ها به مدل، get_payload() به‌طور پیش‌فرض بدنه‌ی پیامی را که Content-Transfer-Encoding آن 8bit است، با استفاده از مجموعه‌نویسه‌ی مشخص‌شده در سرآیندهای MIME کدگشایی می‌کند و رشته‌ی حاصل را برمی‌گرداند.

  • در صورت ورود بایت‌ها به مدل، Generator بدنه‌های پیام را که Content-Transfer-Encoding از نوع 8bit دارند، تبدیل می‌کند تا در عوض Content-Transfer-Encoding 7bit داشته باشند.

    سرآیندهایی که بایت‌های کدگذاری‌نشده‌ی غیر اسکی دارند، در نظر گرفته می‌شوند که مطابق RFC 2047و با استفاده از مجموعه نویسه‌ی unknown-8bit کدگذاری شده باشند.

  • کلاس جدید BytesGenerator بایت‌ها را به‌عنوان خروجی تولید می‌کند و هر داده‌ی غیر اسکیِ تغییرنکرده‌ای را که در ورودیِ استفاده‌شده برای ساخت مدل وجود داشته است، حفظ می‌کند؛ از جمله بدنه‌های پیام با Content-Transfer-Encoding از نوع 8bit.

  • کلاس SMTP در smtplib اکنون برای آرگومان msg متد sendmail() یک رشته بایتی را می‌پذیرد، و یک متد جدید، send_message()، یک شیء Message را می‌پذیرد و می‌تواند نشانی‌های from_addr و to_addrs را به‌صورت اختیاری مستقیماً از شیء دریافت کند.

(پیشنهاد و پیاده‌سازی‌شده توسط R. David Murray، bpo-4661 و bpo-10321.)

elementtree

بسته‌ی xml.etree.ElementTree و همتای آن xml.etree.cElementTree به نسخه 1.3 به‌روزرسانی شده‌اند.

چندین تابع و متد جدید و مفید افزوده شده‌اند:

دو متد منسوخ شده‌اند:

  • xml.etree.ElementTree.getchildren() به‌جای آن از list(elem) استفاده کنید.

  • به‌جای xml.etree.ElementTree.getiterator() از Element.iter استفاده کنید.

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

(ارائه‌شده توسط Florent Xicluna و Fredrik Lundh، bpo-6472.)

functools

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

    برای مثال، افزودن یک دکوراتور نهانگاه به تابع پرس‌وجوی پایگاه داده می‌تواند برای جستجوهای پرطرفدار در دسترسی‌های پایگاه داده صرفه‌جویی کند:

    >>> import functools
    >>> @functools.lru_cache(maxsize=300)
    ... def get_phone_number(name):
    ...     c = conn.cursor()
    ...     c.execute('SELECT phonenumber FROM phonelist WHERE name=?', (name,))
    ...     return c.fetchone()[0]
    
    >>> for name in user_requests:
    ...     get_phone_number(name)        # cached lookup
    

    برای کمک به انتخاب اندازه‌ی مؤثر نهانگاه، تابع پوشیده‌شده به‌منظور پیگیری آمار نهانگاه ابزارگذاری شده است:

    >>> get_phone_number.cache_info()
    CacheInfo(hits=4805, misses=980, maxsize=300, currsize=300)
    

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

    >>> get_phone_number.cache_clear()
    

    (مشارکت‌شده توسط Raymond Hettinger و با تلفیق ایده‌های طراحی از Jim Baker، Miki Tebeka و Nick Coghlan؛ به دستورالعمل 498245, دستورالعمل 577479, bpo-10586 و bpo-10593 مراجعه کنید.)

  • دکوراتور @functools.wraps اکنون ویژگی __wrapped__ را که به تابع فراخوانی‌پذیر اصلی اشاره می‌کند، اضافه می‌کند. این کار امکان درون‌نگری توابع پوشش‌داده‌شده را فراهم می‌کند. همچنین __annotations__ را در صورت تعریف‌شدن کپی می‌کند. و اکنون همچنین با ظرافت از ویژگی‌های ناموجود مانند __doc__ که ممکن است برای فراخوانی‌پذیر پوشش‌داده‌شده تعریف نشده باشد، صرف‌نظر می‌کند.

    در مثال بالا، می‌توان با بازیابی تابع اصلی، نهانگاه را حذف کرد:

    >>> get_phone_number = get_phone_number.__wrapped__    # uncached function
    

    (توسط Nick Coghlan و Terrence Cole؛ bpo-9567، bpo-3445 و bpo-8814.)

  • برای کمک به نوشتن کلاس‌هایی با متدهای مقایسه‌ی غنی، دکوراتور جدید @functools.total_ordering با استفاده از متدهای برابری و نابرابری موجود، متدهای باقی‌مانده را تکمیل می‌کند.

    برای نمونه، فراهم کردن __eq__ و __lt__ به @~functools.total_ordering امکان می‌دهد تا __le__، __gt__ و __ge__ را تکمیل کند:

    @total_ordering
    class Student:
        def __eq__(self, other):
            return ((self.lastname.lower(), self.firstname.lower()) ==
                    (other.lastname.lower(), other.firstname.lower()))
    
        def __lt__(self, other):
            return ((self.lastname.lower(), self.firstname.lower()) <
                    (other.lastname.lower(), other.firstname.lower()))
    

    با دکوراتور total_ordering، متدهای مقایسه‌ی باقی‌مانده به‌طور خودکار تکمیل می‌شوند.

    (مشارکت Raymond Hettinger.)

  • برای کمک به انتقال برنامه‌ها از Python 2، تابع functools.cmp_to_key() یک تابع مقایسه با سبک قدیمی را به یک تابع کلید مدرن تبدیل می‌کند:

    >>> # locale-aware sort order
    >>> sorted(iterable, key=cmp_to_key(locale.strcoll))
    

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

    (مشارکت Raymond Hettinger.)

itertools

  • ماژول itertools دارای تابع جدید accumulate() است که از عملگر scan زبان APL و تابع accumulate در Numpy الگوبرداری شده است:

    >>> from itertools import accumulate
    >>> list(accumulate([8, 2, 50]))
    [8, 10, 60]
    
    >>> prob_dist = [0.1, 0.4, 0.2, 0.3]
    >>> list(accumulate(prob_dist))      # cumulative probability distribution
    [0.1, 0.5, 0.7, 1.0]
    

    برای مثالی که از accumulate() استفاده می‌کند، به مثال‌های ماژول random مراجعه کنید.

    (ارائه‌شده توسط Raymond Hettinger و با گنجاندن پیشنهادهای طراحی از Mark Dickinson.)

collections

  • کلاس collections.Counter اکنون دو شکل از تفریق درجا دارد، عملگر موجود -= برای تفریق اشباع و متد جدید subtract() برای تفریق معمولی. اولی برای چندمجموعه‌ها که فقط تعداد مثبت دارند مناسب است، و دومی برای موارد استفاده‌ای که در آن‌ها تعداد منفی مجاز است مناسب‌تر است:

    >>> from collections import Counter
    >>> tally = Counter(dogs=5, cats=3)
    >>> tally -= Counter(dogs=2, cats=8)    # saturating subtraction
    >>> tally
    Counter({'dogs': 3})
    
    >>> tally = Counter(dogs=5, cats=3)
    >>> tally.subtract(dogs=2, cats=8)      # regular subtraction
    >>> tally
    Counter({'dogs': 3, 'cats': -5})
    

    (مشارکت Raymond Hettinger.)

  • کلاس collections.OrderedDict متد جدیدی به نام move_to_end() دارد که یک کلید موجود را دریافت می‌کند و آن را به اولین یا آخرین موقعیت در دنباله مرتب منتقل می‌کند.

    پیش‌فرض این است که یک آیتم به آخرین جایگاه منتقل شود. این کار معادل تازه‌سازی یک ورودی با od[k] = od.pop(k) است.

    عملیات سریع انتقال به انتها (move-to-end) برای بازچینش ورودی‌ها مفید است. برای مثال، می‌توان از یک دیکشنری مرتب برای پیگیری ترتیب دسترسی استفاده کرد؛ به این صورت که ورودی‌ها از قدیمی‌ترین تا جدیدترینِ دسترسی‌ها کهنه می‌شوند.

    >>> from collections import OrderedDict
    >>> d = OrderedDict.fromkeys(['a', 'b', 'X', 'd', 'e'])
    >>> list(d)
    ['a', 'b', 'X', 'd', 'e']
    >>> d.move_to_end('X')
    >>> list(d)
    ['a', 'b', 'd', 'e', 'X']
    

    (مشارکت Raymond Hettinger.)

  • کلاس collections.deque دو متد جدید count() و reverse() به دست آورد که آن‌ها را برای اشیای list جایگزین‌پذیرتر می‌کند:

    >>> from collections import deque
    >>> d = deque('simsalabim')
    >>> d.count('s')
    2
    >>> d.reverse()
    >>> d
    deque(['m', 'i', 'b', 'a', 'l', 'a', 's', 'm', 'i', 's'])
    

    (مشارکت Raymond Hettinger.)

threading

ماژول threading یک کلاس همگام‌سازی جدید به نام Barrier دارد که برای منتظر نگه داشتن چندین نخ تا زمانی که همه‌ی آن‌ها به یک نقطه‌ی سد مشترک رسیده باشند، به کار می‌رود. سدها برای اطمینان از اینکه وظیفه‌ای با چندین پیش‌شرط تا زمانی که همه‌ی وظایف پیشین کامل نشده‌اند اجرا نمی‌شود، مفید هستند.

سد‌ها می‌توانند با تعداد دلخواهی از نخ‌ها کار کنند. این تعمیمی از Rendezvous است که تنها برای دو نخ تعریف شده است.

اشیاء Barrier که به‌صورت یک سد چرخه‌ای دوفازی پیاده‌سازی شده‌اند، برای استفاده در حلقه‌ها مناسب هستند. فازهای جداگانه‌ی پر شدن (filling) و تخلیه (draining) تضمین می‌کنند که همه‌ی نخ‌ها پیش از آنکه هر یک از آن‌ها بتواند به حلقه بازگردد و دوباره وارد سد شود، آزاد (تخلیه) شوند. سد پس از هر چرخه به‌طور کامل بازنشانی می‌شود.

نمونه‌ای از استفاده از سدها:

from threading import Barrier, Thread

def get_votes(site):
    ballots = conduct_election(site)
    all_polls_closed.wait()        # do not count until all polls are closed
    totals = summarize(ballots)
    publish(site, totals)

all_polls_closed = Barrier(len(sites))
for site in sites:
    Thread(target=get_votes, args=(site,)).start()

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

اگر ممکن است هر یک از وظایف پیشین معلق شود یا با تأخیر مواجه شود، می‌توان سدی با پارامتر اختیاری مهلت زمانی ایجاد کرد. سپس اگر مهلت زمانی پیش از رسیدن همه وظایف پیشین به نقطه سد سپری شود، همه نخ‌های در حال انتظار آزاد می‌شوند و استثنای BrokenBarrierError مطرح می‌شود:

def get_votes(site):
    ballots = conduct_election(site)
    try:
        all_polls_closed.wait(timeout=midnight - time.now())
    except BrokenBarrierError:
        lockbox = seal_ballots(ballots)
        queue.put(lockbox)
    else:
        totals = summarize(ballots)
        publish(site, totals)

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

برای مثال‌های بیشتر درباره‌ی نحوه‌ی استفاده از سد‌ها در محاسبات موازی، Barrier Synchronization Patterns را ببینید. همچنین، توضیحی ساده اما جامع درباره‌ی سد‌ها در The Little Book of Semaphores، بخش ۳.۶ آمده است.

(نوشته‌ی Kristján Valur Jónsson به‌همراه بازبینی API از سوی Jeffrey Yasskin در bpo-8777.)

datetime و time

  • ماژول datetime نوع جدیدی به نام timezone دارد که رابط tzinfo را با بازگرداندن آفست ثابت UTC و نام منطقه زمانی پیاده‌سازی می‌کند. این امر ایجاد اشیاء datetime آگاه از منطقه زمانی را آسان‌تر می‌کند:

    >>> import datetime as dt
    
    >>> dt.datetime.now(dt.timezone.utc)
    datetime.datetime(2010, 12, 8, 21, 4, 2, 923754, tzinfo=datetime.timezone.utc)
    
    >>> dt.datetime.strptime("01/01/2000 12:00 +0000", "%m/%d/%Y %H:%M %z")
    datetime.datetime(2000, 1, 1, 12, 0, tzinfo=datetime.timezone.utc)
    
  • همچنین، اشیاء timedelta اکنون می‌توانند در float ضرب شوند و بر اشیاء float و int تقسیم شوند. و اشیاء timedelta اکنون می‌توانند یکدیگر را تقسیم کنند.

  • متد datetime.date.strftime() دیگر به سال‌های بعد از ۱۹۰۰ محدود نیست. بازه‌ی جدید سال‌های پشتیبانی‌شده از ۱۰۰۰ تا ۹۹۹۹ به‌طور شامل است.

  • هرگاه از سال دو رقمی در تاپل زمانی استفاده شود، تفسیر آن توسط time.accept2dyear تعیین می‌شده است. مقدار پیش‌فرض True است؛ به این معنا که برای سال دو رقمی، قرن بر اساس قواعد POSIX حاکم بر قالب %y در strptime حدس زده می‌شود.

    از Py3.2 به بعد، استفاده از روش ابتکاری حدس قرن باعث انتشار هشدار DeprecationWarning خواهد شد. در عوض، توصیه می‌شود که time.accept2dyear بر روی False تنظیم شود تا بتوان از بازه‌های تاریخ بزرگ بدون حدس و گمان استفاده کرد:

    >>> import time, warnings
    >>> warnings.resetwarnings()      # remove the default warning filters
    
    >>> time.accept2dyear = True      # guess whether 11 means 11 or 2011
    >>> time.asctime((11, 1, 1, 12, 34, 56, 4, 1, 0))
    Warning (from warnings module):
      ...
    DeprecationWarning: Century info guessed for a 2-digit year.
    'Fri Jan  1 12:34:56 2011'
    
    >>> time.accept2dyear = False     # use the full range of allowable dates
    >>> time.asctime((11, 1, 1, 12, 34, 56, 4, 1, 0))
    'Fri Jan  1 12:34:56 11'
    

    محدوده‌های تاریخ چندین تابع اکنون به‌طور چشمگیری گسترش یافته‌اند. وقتی time.accept2dyear نادرست باشد، تابع time.asctime() هر سالی را که در یک int از C جا شود می‌پذیرد، در حالی که توابع time.mktime() و time.strftime() کل محدوده‌ای را که توابع متناظر سیستم‌عامل پشتیبانی می‌کنند، می‌پذیرند.

(مشارکت‌شده توسط Alexander Belopolsky و Victor Stinner در bpo-1289118، bpo-5094، bpo-6641، bpo-2706، bpo-1777412، bpo-8013 و bpo-10827.)

math

ماژول math با شش تابع جدید الهام‌گرفته از استاندارد C99 به‌روزرسانی شده است.

تابع isfinite() راهی مطمئن و سریع برای تشخیص مقادیر ویژه فراهم می‌کند. این تابع برای اعداد معمولی True و برای Nan یا Infinity مقدار False را برمی‌گرداند:

>>> from math import isfinite
>>> [isfinite(x) for x in (123, 4.56, float('Nan'), float('Inf'))]
[True, True, False, False]

تابع expm1() مقدار e**x-1 را برای مقادیر کوچک x محاسبه می‌کند، بدون آنکه دقتی را که معمولاً تفریق مقادیر تقریباً برابر به‌همراه دارد، از دست بدهد:

>>> from math import expm1
>>> expm1(0.013671875)   # more accurate way to compute e**x-1 for a small x
0.013765762467652909

تابع erf() یک انتگرال احتمال یا تابع خطای گاوسی را محاسبه می‌کند. تابع خطای مکمل، erfc()، برابر با 1 - erf(x) است:

>>> from math import erf, erfc, sqrt
>>> erf(1.0/sqrt(2.0))   # portion of normal distribution within 1 standard deviation
0.682689492137086
>>> erfc(1.0/sqrt(2.0))  # portion of normal distribution outside 1 standard deviation
0.31731050786291404
>>> erf(1.0/sqrt(2.0)) + erfc(1.0/sqrt(2.0))
1.0

تابع gamma() تعمیم پیوسته‌ای از تابع فاکتوریل است. برای جزئیات به https://en.wikipedia.org/wiki/Gamma_function مراجعه کنید. از آنجا که این تابع به فاکتوریل‌ها مربوط است، حتی برای مقادیر کوچک x نیز بزرگ می‌شود؛ بنابراین تابع lgamma() نیز برای محاسبه‌ی لگاریتم طبیعی تابع گاما وجود دارد:

>>> from math import gamma, lgamma
>>> gamma(7.0)           # six factorial
720.0
>>> lgamma(801.0)        # log(800 factorial)
4551.950730698041

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

abc

ماژول abc اکنون از @~abc.abstractclassmethod و @~abc.abstractstaticmethod پشتیبانی می‌کند.

این ابزارها امکان تعریف یک کلاس پایه انتزاعی را فراهم می‌کنند که پیاده‌سازی یک @classmethod یا @staticmethod خاص را الزامی می‌کند:

class Temperature(metaclass=abc.ABCMeta):
    @abc.abstractclassmethod
    def from_fahrenheit(cls, t):
        ...
    @abc.abstractclassmethod
    def from_celsius(cls, t):
        ...

(وصل ارائه‌شده توسط دانیل اوربان؛ bpo-5867.)

io

io.BytesIO متدی جدید به نام getbuffer() دارد که کارکردی مشابه memoryview() فراهم می‌کند. این متد بدون ایجاد کپی، نمای قابل‌ویرایشی از داده‌ها می‌سازد. دسترسی تصادفی بافر و پشتیبانی آن از نمادگذاری اسلایس، برای ویرایش درجا بسیار مناسب است:

>>> REC_LEN, LOC_START, LOC_LEN = 34, 7, 11

>>> def change_location(buffer, record_number, location):
...     start = record_number * REC_LEN + LOC_START
...     buffer[start: start+LOC_LEN] = location

>>> import io

>>> byte_stream = io.BytesIO(
...     b'G3805  storeroom  Main chassis    '
...     b'X7899  shipping   Reserve cog     '
...     b'L6988  receiving  Primary sprocket'
... )
>>> buffer = byte_stream.getbuffer()
>>> change_location(buffer, 1, b'warehouse  ')
>>> change_location(buffer, 0, b'showroom   ')
>>> print(byte_stream.getvalue())
b'G3805  showroom   Main chassis    '
b'X7899  warehouse  Reserve cog     '
b'L6988  receiving  Primary sprocket'

(مشارکت آنتوان پی‌ترو در bpo-5506.)

reprlib

هنگام نوشتن متد __repr__() برای یک ظرف سفارشی، به‌راحتی ممکن است فراموش کنید حالتی را مدیریت کنید که در آن عضوی به خودِ ظرف ارجاع می‌دهد. اشیاء توکار پایتون مانند list و set ارجاع به خود را با نمایش "..." در بخش بازگشتی رشته بازنمایی مدیریت می‌کنند.

برای کمک به نوشتن متدهای __repr__() از این دست، ماژول reprlib دکوراتور جدیدی به نام @~reprlib.recursive_repr دارد که فراخوانی‌های بازگشتی __repr__() را تشخیص می‌دهد و به‌جای آن رشته‌ای جای‌نگهدار قرار می‌دهد:

>>> class MyList(list):
...     @recursive_repr()
...     def __repr__(self):
...         return '<' + '|'.join(map(repr, self)) + '>'
...
>>> m = MyList('abc')
>>> m.append(m)
>>> m.append('x')
>>> print(m)
<'a'|'b'|'c'|...|'x'>

(ارائه‌شده توسط Raymond Hettinger در bpo-9826 و bpo-9840.)

گزارش‌گیری

علاوه بر پیکربندی مبتنی بر دیکشنری که در بالا توضیح داده شد، بسته‌ی logging بهبودهای بسیاری دیگر نیز دارد.

مستندات گزارش‌گیری با یک آموزش مقدماتی, یک آموزش پیشرفته, و یک کتاب آشپزی از دستورالعمل‌های گزارش‌گیری تکمیل شده است. این مستندات سریع‌ترین راه برای یادگیری گزارش‌گیری هستند.

به تابع راه‌اندازی logging.basicConfig() آرگومان style اضافه شد تا از سه نوع مختلف قالب‌بندی رشته پشتیبانی کند. این آرگومان به‌طور پیش‌فرض "%" است که برای قالب‌بندی سنتی با % به کار می‌رود؛ می‌توان آن را برای سبک جدید str.format() روی "{" تنظیم کرد، یا برای قالب‌بندی به سبک پوسته که توسط string.Template فراهم شده است، روی "$" تنظیم کرد. سه پیکربندی زیر معادل هستند:

>>> from logging import basicConfig
>>> basicConfig(style='%', format="%(name)s -> %(levelname)s: %(message)s")
>>> basicConfig(style='{', format="{name} -> {levelname} {message}")
>>> basicConfig(style='$', format="$name -> $levelname: $message")

اگر پیش از وقوع یک رویداد گزارش‌گیری، هیچ پیکربندی‌ای تنظیم نشده باشد، اکنون یک پیکربندی پیش‌فرض وجود دارد که برای رویدادهای سطح WARNING یا بالاتر، از یک StreamHandler هدایت‌شده به sys.stderr استفاده می‌کند. پیش‌تر، رویدادی که پیش از تنظیم پیکربندی رخ می‌داد، بسته به مقدار logging.raiseExceptions یا استثنایی ایجاد می‌کرد یا رویداد را بی‌صدا رها می‌کرد. هندلر پیش‌فرض جدید در logging.lastResort ذخیره شده است.

استفاده از فیلترها ساده‌سازی شده است. به‌جای ایجاد یک شیء Filter، محمول می‌تواند هر فراخوانی‌پذیر پایتونی باشد که True یا False را برگرداند.

تعدادی بهبود دیگر نیز وجود داشت که انعطاف‌پذیری را افزایش می‌دهند و پیکربندی را ساده می‌کنند. برای فهرست کامل تغییرات در پایتون 3.2، مستندات ماژول را ببینید.

csv

ماژول csv اکنون از گویش جدیدی به نام unix_dialect پشتیبانی می‌کند که علامت نقل‌قول را برای همه فیلدها اعمال می‌کند و سبک سنتی یونیکس را با '\n' به عنوان پایان‌دهنده سطر به کار می‌گیرد. نام گویش ثبت‌شده unix است.

کلاس csv.DictWriter متد جدیدی به نام writeheader() دارد که یک ردیف اولیه برای مستندسازی نام فیلدها می‌نویسد:

>>> import csv, sys
>>> w = csv.DictWriter(sys.stdout, ['name', 'dept'], dialect='unix')
>>> w.writeheader()
"name","dept"
>>> w.writerows([
...     {'name': 'tom', 'dept': 'accounting'},
...     {'name': 'susan', 'dept': 'Salesl'}])
"tom","accounting"
"susan","sales"

(گویش جدید پیشنهادشده توسط Jay Talbot در bpo-5975، و متد جدید پیشنهادشده توسط Ed Abraham در bpo-1537721.)

contextlib

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

برای سهولت، این قابلیت جدید توسط @~contextlib.contextmanager استفاده می‌شود تا برای پشتیبانی از هر دو نقش، نیازی به تلاش اضافی نباشد.

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

برای مثال، گاهی مفید است که توابع یا گروه‌هایی از دستورها را با یک گزارش‌گیر که می‌تواند زمان ورود و زمان خروج را پیگیری کند، دربربگیرید. به‌جای نوشتن هم یک دکوراتور تابع و هم یک مدیر زمینه برای این کار، @~contextlib.contextmanager هر دو قابلیت را در یک تعریف واحد فراهم می‌کند:

from contextlib import contextmanager
import logging

logging.basicConfig(level=logging.INFO)

@contextmanager
def track_entry_and_exit(name):
    logging.info('Entering: %s', name)
    yield
    logging.info('Exiting: %s', name)

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

with track_entry_and_exit('widget loader'):
    print('Some time consuming activity goes here')
    load_widget()

اکنون، می‌توان از آن به عنوان دکوراتور نیز استفاده کرد:

@track_entry_and_exit('widget loader')
def activity():
    print('Some time consuming activity goes here')
    load_widget()

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

در مثال بالا، هیچ راه تمیزی وجود ندارد که مدیر زمینه‌ی track_entry_and_exit بتواند یک نمونه‌ی گزارش‌گیری را برای استفاده در بدنه‌ی دستورهای دربرگرفته‌شده برگرداند.

(مشارکت‌شده توسط مایکل فورد در bpo-9110.)

decimal و fractions

مارک دیکینسون طرحی زیبا و کارآمد طراحی کرد تا تضمین کند نوع‌های داده عددی مختلف هرگاه مقادیر واقعی‌شان برابر باشد، مقدار هش یکسانی خواهند داشت (bpo-8188):

assert hash(Fraction(3, 2)) == hash(1.5) == \
       hash(Decimal("1.5")) == hash(complex(1.5, 0))

برخی از جزئیات هش‌کردن از طریق یک ویژگی جدید، sys.hash_info، در دسترس قرار می‌گیرند که عرض بیتی مقدار هش، پیمانه‌ی اول، مقادیر هش برای بی‌نهایت و nan، و ضریب استفاده‌شده برای بخش موهومی یک عدد را توصیف می‌کند:

>>> sys.hash_info
sys.hash_info(width=64, modulus=2305843009213693951, inf=314159, nan=0, imag=1000003)

تصمیم اولیه مبنی بر محدود کردن هم‌کنش‌پذیری نوع‌های عددی مختلف، تعدیل شده است. ترکیب ضمنی در عبارت‌های حسابی مانند Decimal('1.1') + float('1.1') همچنان پشتیبانی نمی‌شود (و توصیه هم نمی‌شود)، زیرا دومی در فرایند ساخت ممیز شناور دودویی، اطلاعات را از دست می‌دهد. با این حال، از آنجا که مقدار ممیز شناور موجود را می‌توان بدون افت به نمایش دهدهی یا گویا تبدیل کرد، منطقی است که آن‌ها به سازنده افزوده شوند و از مقایسه‌های بین نوع‌های مختلف پشتیبانی شود.

  • سازنده‌ی decimal.Decimal اکنون اشیاء float را مستقیماً می‌پذیرد، بنابراین دیگر نیازی به استفاده از متد from_float() نیست (bpo-8257).

  • مقایسه‌های بین انواع مختلف اکنون به‌طور کامل پشتیبانی می‌شوند، به‌طوری‌که اشیاء Decimal را می‌توان مستقیماً با float و fractions.Fraction مقایسه کرد (bpo-2531 و bpo-8188).

تغییرات مشابهی در fractions.Fraction اعمال شد تا متدهای from_float() و from_decimal() دیگر لازم نباشند (bpo-8294):

>>> from decimal import Decimal
>>> from fractions import Fraction
>>> Decimal(1.1)
Decimal('1.100000000000000088817841970012523233890533447265625')
>>> Fraction(1.1)
Fraction(2476979795053773, 2251799813685248)

یک تغییر مفید دیگر برای ماژول decimal این است که ویژگی Context.clamp اکنون عمومی است. این ویژگی در ایجاد زمینه‌هایی که با قالب‌های تبادلی ده‌دهی تعریف‌شده در IEEE 754 مطابقت دارند مفید است (به bpo-8540 مراجعه کنید).

(مشارکت از Mark Dickinson و Raymond Hettinger.)

ftp

کلاس ftplib.FTP اکنون از پروتکل مدیریت زمینه پشتیبانی می‌کند تا استثناهای socket.error را بی‌قید و شرط مصرف کند و پس از اتمام کار، اتصال FTP را ببندد:

>>> from ftplib import FTP
>>> with FTP("ftp1.at.proftpd.org") as ftp:
        ftp.login()
        ftp.dir()

'230 Anonymous login ok, restrictions apply.'
dr-xr-xr-x   9 ftp      ftp           154 May  6 10:43 .
dr-xr-xr-x   9 ftp      ftp           154 May  6 10:43 ..
dr-xr-xr-x   5 ftp      ftp          4096 May  6 10:43 CentOS
dr-xr-xr-x   3 ftp      ftp            18 Jul 10  2008 Fedora

سایر اشیاء شبه‌پرونده مانند mmap.mmap و fileinput.input() نیز مدیرهای زمینه‌ی خودبست‌شونده را دریافت کردند:

with fileinput.input(files=('log1.txt', 'log2.txt')) as f:
    for line in f:
        process(line)

(با مشارکت Tarek Ziadé و Giampaolo Rodolà در bpo-4972، و با مشارکت Georg Brandl در bpo-8046 و bpo-1286.)

کلاس FTP_TLS اکنون پارامتر context را می‌پذیرد که یک شیء ssl.SSLContext است و امکان تجمیع گزینه‌های پیکربندی SSL، گواهی‌ها و کلیدهای خصوصی را در یک ساختار واحد (که ممکن است عمر طولانی داشته باشد) فراهم می‌کند.

(مشارکت توسط Giampaolo Rodolà؛ bpo-8806.)

popen

توابع os.popen() و subprocess.Popen() اکنون از دستورهای with برای بستن خودکار توصیف‌گرهای پرونده پشتیبانی می‌کنند.

(مشارکت‌شده توسط Antoine Pitrou و Brian Curtin در bpo-7461 و bpo-10554.)

select

ماژول select اکنون یک ویژگی ثابت جدید به نام PIPE_BUF را در دسترس قرار می‌دهد که حداقل تعداد بایت‌هایی را مشخص می‌کند که تضمین می‌شود هنگامی که select.select() اعلام می‌کند پایپی برای نوشتن آماده است، مسدود نشوند.

>>> import select
>>> select.PIPE_BUF
512

(در سیستم‌های یونیکس در دسترس است. وصله توسط Sébastien Sablé در bpo-9862)

gzip و zipfile

gzip.GzipFile اکنون کلاس پایه انتزاعی io.BufferedIOBase را پیاده‌سازی می‌کند (به‌جز truncate()). این کلاس همچنین دارای متد peek() است و از اشیاء پرونده‌ی غیرقابل مکان‌یابی و همچنین اشیاء پرونده‌ی پرشده با صفر پشتیبانی می‌کند.

ماژول gzip همچنین توابع compress() و decompress() را برای فشرده‌سازی و بازفشرده‌سازی آسان‌تر در حافظه به دست می‌آورد. به یاد داشته باشید که متن باید پیش از فشرده‌سازی و بازفشرده‌سازی به صورت bytes کدگذاری شود:

>>> import gzip
>>> s = 'Three shall be the number thou shalt count, '
>>> s += 'and the number of the counting shall be three'
>>> b = s.encode()                        # convert to utf-8
>>> len(b)
89
>>> c = gzip.compress(b)
>>> len(c)
77
>>> gzip.decompress(c).decode()[:42]      # decompress and convert to text
'Three shall be the number thou shalt count'

(مشارکت‌شده توسط Anand B. Pillai در bpo-3488؛ و توسط Antoine Pitrou، Nir Aides و Brian Curtin در bpo-9962، bpo-1675951، bpo-7471 و bpo-2846.)

همچنین، کلاس zipfile.ZipExtFile به‌طور داخلی بازطراحی شده است تا پرونده‌های ذخیره‌شده درون یک آرشیو را نمایش دهد. پیاده‌سازی جدید به‌طور چشمگیری سریع‌تر است و برای دستیابی به سرعت بیشتر می‌تواند در یک شیء io.BufferedReader دربرگرفته شود. این کلاس همچنین مشکلی را برطرف می‌کند که در آن فراخوانی‌های متناوب read و readline نتایج نادرستی می‌دادند.

(این وصل توسط Nir Aides در bpo-7610 ارسال شده است.)

tarfile

کلاس TarFile اکنون می‌تواند به‌عنوان مدیر زمینه استفاده شود. علاوه بر این، متد add() آن گزینه‌ی جدیدی به نام filter دارد که کنترل می‌کند کدام پرونده‌ها به آرشیو افزوده شوند و اجازه می‌دهد فراداده‌ی پرونده ویرایش شود.

گزینه‌ی جدید filter جایگزین پارامتر قدیمی‌تر و کم‌انعطاف‌تر exclude می‌شود که اکنون منسوخ شده است. در صورت تعیین شدن، پارامتر اختیاری filter باید یک آرگومان کلیدواژه‌ای باشد. تابع فیلتر ارائه‌شده از سوی کاربر یک شیء TarInfo را می‌پذیرد و یک شیء TarInfo به‌روزرسانی‌شده برمی‌گرداند، یا اگر بخواهد پرونده کنار گذاشته شود، تابع می‌تواند None را برگرداند:

>>> import tarfile, glob

>>> def myfilter(tarinfo):
...     if tarinfo.isfile():             # only save real files
...         tarinfo.uname = 'monty'      # redact the user name
...         return tarinfo

>>> with tarfile.open(name='myarchive.tar.gz', mode='w:gz') as tf:
...     for filename in glob.glob('*.txt'):
...         tf.add(filename, filter=myfilter)
...     tf.list()
-rw-r--r-- monty/501        902 2011-01-26 17:59:11 annotations.txt
-rw-r--r-- monty/501        123 2011-01-26 17:59:11 general_questions.txt
-rw-r--r-- monty/501       3514 2011-01-26 17:59:11 prion.txt
-rw-r--r-- monty/501        124 2011-01-26 17:59:11 py_todo.txt
-rw-r--r-- monty/501       1399 2011-01-26 17:59:11 semaphore_notes.txt

(پیشنهاد شده توسط Tarek Ziadé و پیاده‌سازی شده توسط Lars Gustäbel در bpo-6856.)

hashlib

ماژول hashlib دو ویژگی ثابت جدید دارد که الگوریتم‌های هش را فهرست می‌کنند؛ الگوریتم‌هایی که تضمین شده در همه پیاده‌سازی‌ها حضور دارند و الگوریتم‌هایی که در پیاده‌سازی فعلی دسترس‌پذیرند:

>>> import hashlib

>>> hashlib.algorithms_guaranteed
{'sha1', 'sha224', 'sha384', 'sha256', 'sha512', 'md5'}

>>> hashlib.algorithms_available
{'md2', 'SHA256', 'SHA512', 'dsaWithSHA', 'mdc2', 'SHA224', 'MD4', 'sha256',
'sha512', 'ripemd160', 'SHA1', 'MDC2', 'SHA', 'SHA384', 'MD2',
'ecdsa-with-SHA1','md4', 'md5', 'sha1', 'DSA-SHA', 'sha224',
'dsaEncryption', 'DSA', 'RIPEMD160', 'sha', 'MD5', 'sha384'}

(پیشنهادشده توسط Carl Chenet در bpo-7418.)

ast

ماژول ast ابزاری عالی و همه‌منظوره برای ارزیابی ایمن رشته‌های عبارت با استفاده از سینتکس لفظی پایتون دارد. تابع ast.literal_eval() جایگزینی امن برای تابع توکار eval() به شمار می‌رود که به‌راحتی قابل سوءاستفاده است. پایتون 3.2 مقادیر لفظی bytes و set را به فهرست نوع‌های پشتیبانی‌شده اضافه می‌کند: رشته‌ها، بایت‌ها، اعداد، تاپل‌ها، فهرست‌ها، دیکشنری‌ها، مجموعه‌ها، مقادیر بولی و None.

>>> from ast import literal_eval

>>> request = "{'req': 3, 'func': 'pow', 'args': (2, 0.5)}"
>>> literal_eval(request)
{'args': (2, 0.5), 'req': 3, 'func': 'pow'}

>>> request = "os.system('do something harmful')"
>>> literal_eval(request)
Traceback (most recent call last):
  ...
ValueError: malformed node or string: <_ast.Call object at 0x101739a10>

(پیاده‌سازی‌شده توسط بنجامین پیترسون و گئورگ برندل.)

os

سیستم‌عامل‌های مختلف از کدگذاری‌های گوناگونی برای نام پرونده‌ها و متغیرهای محیطی استفاده می‌کنند. ماژول os دو تابع جدید، fsencode() و fsdecode()، برای کدگذاری و کدگشایی نام پرونده‌ها ارائه می‌دهد:

>>> import os
>>> filename = 'Sehenswürdigkeiten'
>>> os.fsencode(filename)
b'Sehensw\xc3\xbcrdigkeiten'

برخی سیستم‌عامل‌ها اجازه دسترسی مستقیم به بایت‌های کدگذاری‌شده در محیط را می‌دهند. اگر چنین باشد، ثابت os.supports_bytes_environ درست خواهد بود.

برای دسترسی مستقیم به متغیرهای محیطی کدگذاری‌شده (در صورت وجود)، از تابع جدید os.getenvb() استفاده کنید یا از os.environb استفاده کنید که نسخه‌ی بایتیِ os.environ است.

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

shutil

تابع shutil.copytree() دو گزینه‌ی جدید دارد:

  • ignore_dangling_symlinks: هنگامی که symlinks=False است و در نتیجه تابع به‌جای خودِ پیوند نمادین، پرونده‌ای را که پیوند نمادین به آن اشاره می‌کند کپی می‌کند. این گزینه خطای ایجادشده در صورت وجود نداشتن پرونده را سرکوب می‌کند.

  • copy_function: یک فراخوانی‌پذیر است که برای کپی کردن پرونده‌ها استفاده خواهد شد. به‌طور پیش‌فرض از shutil.copy2() استفاده می‌شود.

(مشارکت‌شده توسط Tarek Ziadé.)

علاوه بر این، ماژول shutil اکنون از عملیات آرشیو برای پرونده‌های zip، پرونده‌های tar فشرده‌نشده، پرونده‌های tar فشرده‌شده با gzip و پرونده‌های tar فشرده‌شده با bzip2 پشتیبانی می‌کند. و توابعی برای ثبت قالب‌های اضافی پرونده آرشیو وجود دارد (مانند پرونده‌های tar فشرده‌شده با xz یا قالب‌های سفارشی).

توابع اصلی عبارت‌اند از make_archive() و unpack_archive(). به‌صورت پیش‌فرض، هر دو روی پوشه‌ی جاری (که می‌توان آن را با os.chdir() تنظیم کرد) و روی هر زیرپوشه‌ای عمل می‌کنند. نام پرونده‌ی آرشیو باید با مسیرنام کامل مشخص شود. مرحله‌ی آرشیو‌سازی غیرمخرب است (پرونده‌های اصلی بدون تغییر باقی می‌مانند).

>>> import shutil, pprint

>>> os.chdir('mydata')  # change to the source directory
>>> f = shutil.make_archive('/var/backup/mydata',
...                         'zip')      # archive the current directory
>>> f                                   # show the name of archive
'/var/backup/mydata.zip'
>>> os.chdir('tmp')                     # change to an unpacking
>>> shutil.unpack_archive('/var/backup/mydata.zip')  # recover the data

>>> pprint.pprint(shutil.get_archive_formats())  # display known formats
[('bztar', "bzip2'ed tar-file"),
 ('gztar', "gzip'ed tar-file"),
 ('tar', 'uncompressed tar file'),
 ('zip', 'ZIP file')]

>>> shutil.register_archive_format(     # register a new archive format
...     name='xz',
...     function=xz.compress,           # callable archiving function
...     extra_args=[('level', 8)],      # arguments to the function
...     description='xz compression'
... )

(مشارکت‌شده توسط Tarek Ziadé.)

sqlite3

ماژول sqlite3 به pysqlite نسخه‌ی 2.6.0 به‌روزرسانی شد. این ماژول دو قابلیت جدید دارد.

  • اگر تراکنش فعالی برای تغییرات ثبت‌نشده وجود داشته باشد، ویژگی sqlite3.Connection.in_transit درست است.

  • متدهای sqlite3.Connection.enable_load_extension() و sqlite3.Connection.load_extension() به شما امکان می‌دهند افزونه‌های SQLite را از پرونده‌های «.so» بارگذاری کنید. یکی از افزونه‌های شناخته‌شده، افزونه‌ی جستجوی تمام‌متن است که همراه SQLite توزیع می‌شود.

(با مشارکت R. David Murray و Shashwat Anand؛ bpo-8845.)

html

ماژول جدید html با تنها یک تابع، escape()، معرفی شد که برای خنثی کردن نویسه‌های رزروشده در نشانه‌گذاری HTML استفاده می‌شود:

>>> import html
>>> html.escape('x > 2 && x < 7')
'x &gt; 2 &amp;&amp; x &lt; 7'

socket

ماژول socket دو بهبود جدید دارد.

  • اشیاء سوکت اکنون متد detach() را دارند که سوکت را بدون بستن واقعی توصیف‌گر پرونده‌ی زیرین، در وضعیت بسته قرار می‌دهد. سپس می‌توان از دومی برای مقاصد دیگر استفاده مجدد کرد. (افزوده‌شده توسط آنتوان پی‌ترو؛ bpo-8524.)

  • socket.create_connection() اکنون از پروتکل مدیریت زمینه پشتیبانی می‌کند تا استثناهای socket.error را به‌طور بی‌قید و شرط بگیرد و سوکت را پس از اتمام کار ببندد. (مشارکت‌شده توسط Giampaolo Rodolà؛ bpo-9794.)

ssl

ماژول ssl تعدادی قابلیت برای برآوردن نیازهای رایج اتصالات اینترنتی امن (رمزنگاری‌شده، احراز هویت‌شده) افزود:

  • کلاس جدیدی، SSLContext، به‌عنوان ظرفی برای داده‌های پایای SSL مانند تنظیمات پروتکل، گواهی‌ها، کلیدهای خصوصی و گزینه‌های مختلف دیگر عمل می‌کند. این کلاس یک wrap_socket() برای ایجاد سوکت SSL از یک زمینه SSL در بر می‌گیرد.

  • تابع جدید ssl.match_hostname() با پیاده‌سازی قواعد HTTPS (از RFC 2818) که برای پروتکل‌های دیگر نیز مناسب هستند، از راستی‌آزمایی هویت سرور برای پروتکل‌های سطح بالاتر پشتیبانی می‌کند.

  • تابع سازنده‌ی ssl.wrap_socket() اکنون آرگومان ciphers را می‌پذیرد. رشته‌ی ciphers الگوریتم‌های رمزنگاری مجاز را با استفاده از قالب توصیف‌شده در مستندات OpenSSL فهرست می‌کند.

  • هنگامی که با نسخه‌های اخیر OpenSSL پیوند داده شده باشد، ماژول ssl اکنون از توسعه‌ی Server Name Indication برای پروتکل TLS پشتیبانی می‌کند که امکان استفاده از چندین «میزبان مجازی» با گواهی‌های متفاوت روی یک پورت IP واحد را فراهم می‌کند. این توسعه فقط در حالت کلاینت پشتیبانی می‌شود و با ارسال آرگومان server_hostname به ssl.SSLContext.wrap_socket() فعال می‌شود.

  • گزینه‌های مختلفی به ماژول ssl اضافه شده‌اند، مانند OP_NO_SSLv2 که پروتکل ناامن و منسوخ SSLv2 را غیرفعال می‌کند.

  • ماژول توسعه‌ای اکنون تمام رمزها و الگوریتم‌های چکیده OpenSSL را بارگذاری می‌کند. اگر برخی از گواهی‌های SSL قابل تأیید نباشند، به‌صورت خطای «الگوریتم ناشناخته» گزارش می‌شوند.

  • نسخه‌ی OpenSSL مورد استفاده اکنون از طریق ویژگی‌های ماژول ssl.OPENSSL_VERSION (یک رشته)، ssl.OPENSSL_VERSION_INFO (یک تاپل ۵تایی) و ssl.OPENSSL_VERSION_NUMBER (یک عدد صحیح) دسترسی‌پذیر است.

(مشارکت‌شده توسط آنتوان پیترو در bpo-8850، bpo-1589، bpo-8322، bpo-5639، bpo-4870، bpo-8484 و bpo-8321.)

nntp

ماژول nntplib پیاده‌سازی بازطراحی‌شده‌ای با معناشناسی بهتر بایت و متن و همچنین APIهای کاربردی‌تر دارد. این بهبودها سازگاری با نسخه‌ی nntplib در پایتون 3.1 را از بین می‌برند؛ نسخه‌ای که خودِ آن نیز تا حدی معیوب بود.

پشتیبانی از اتصالات امن از طریق هر دو روش TLS ضمنی (با استفاده از nntplib.NNTP_SSL) و TLS صریح (با استفاده از nntplib.NNTP.starttls()) نیز اضافه‌شده است.

(با مشارکت Antoine Pitrou در bpo-9360 و Andrew Vant در bpo-1926.)

گواهی‌ها

http.client.HTTPSConnection، urllib.request.HTTPSHandler و urllib.request.urlopen() اکنون آرگومان‌های اختیاری می‌پذیرند تا امکان بررسی گواهی سرور در برابر مجموعه‌ای از مراجع صدور گواهی فراهم شود، همان‌طور که در استفاده‌های عمومی از HTTPS توصیه می‌شود.

(افزوده‌شده توسط Antoine Pitrou، bpo-9003.)

imaplib

پشتیبانی از TLS صریح در اتصال‌های استاندارد IMAP4 از طریق متد جدید imaplib.IMAP4.starttls اضافه شده است.

(ارائه‌شده توسط Lorenzo M. Catucci و Antoine Pitrou، bpo-4471.)

http.client

تعدادی بهبود کوچک در API ماژول http.client صورت گرفت. پاسخ‌های ساده‌ی قدیمی HTTP 0.9 دیگر پشتیبانی نمی‌شوند و پارامتر strict در تمام کلاس‌ها منسوخ شده است.

کلاس‌های HTTPConnection و HTTPSConnection اکنون پارامتر source_address را برای یک تاپل (host, port) دارند که نشان می‌دهد اتصال HTTP از کجا برقرار می‌شود.

پشتیبانی از بررسی گواهی و میزبان‌های مجازی HTTPS به HTTPSConnection افزوده شد.

متد request() روی اشیاء اتصال یک آرگومان اختیاری body را می‌پذیرفت تا بتوان از یک شیء پرونده برای تأمین محتوای درخواست استفاده کرد. به‌طور سودمند، آرگومان body اکنون یک شیء پیمایش‌پذیر را نیز می‌پذیرد، به شرط آنکه یک سرآیند Content-Length صریح در آن گنجانده شده باشد. این رابط توسعه‌یافته بسیار انعطاف‌پذیرتر از قبل است.

برای برقراری اتصال HTTPS از طریق یک سرور پراکسی، متد جدید set_tunnel() وجود دارد که میزبان و درگاه را برای تونل‌سازی HTTP Connect تنظیم می‌کند.

برای هم‌راستا شدن با رفتار http.server، کتابخانه‌ی کلاینت HTTP اکنون سرآیندها را با کدگذاری ISO-8859-1 (Latin-1) کدگذاری می‌کند. این کتابخانه پیش‌تر این کار را برای سرآیندهای ورودی انجام می‌داد، بنابراین اکنون رفتار برای هر دو ترافیک ورودی و خروجی سازگار است. (کار Armin Ronacher را در bpo-10980 ببینید.)

unittest

ماژول unittest تعدادی بهبود دارد که از کشف آزمون (test discovery) برای بسته‌ها، آزمایش آسان‌تر در اعلان تعاملی، متدهای جدید testcase، پیام‌های تشخیصی بهبودیافته برای شکست آزمون‌ها و نام‌های بهتر متدها پشتیبانی می‌کند.

  • فراخوانی خط فرمان python -m unittest اکنون می‌تواند به‌جای نام ماژول‌ها، مسیر پرونده‌ها را برای اجرای آزمون‌های خاص بپذیرد (bpo-10620). کشف آزمون جدید می‌تواند آزمون‌ها را درون بسته‌ها بیابد و هر آزمونی را که از پوشه‌ی سطح بالا قابل ایمپورت باشد، پیدا کند. می‌توان پوشه‌ی سطح بالا را با گزینه‌ی -t، الگوی تطبیق پرونده‌ها را با -p، و پوشه‌ی آغاز کشف را با -s مشخص کرد:

    $ python -m unittest discover -s my_proj_dir -p _test.py
    

    (مشارکت‌شده توسط Michael Foord.)

  • آزمایش در اعلان تعاملی اکنون آسان‌تر است، زیرا کلاس unittest.TestCase اکنون می‌تواند بدون آرگومان نمونه‌سازی شود:

    >>> from unittest import TestCase
    >>> TestCase().assertEqual(pow(2, 3), 8)
    

    (مشارکت‌شده توسط Michael Foord.)

  • ماژول unittest دو متد جدید دارد، assertWarns() و assertWarnsRegex()، برای راستی‌آزمایی اینکه نوع هشدار معین توسط کد تحت آزمون فعال می‌شود:

    with self.assertWarns(DeprecationWarning):
        legacy_function('XYZ')
    

    (با مشارکت آنتوان پی‌ترو در bpo-9754.)

    متد جدید دیگر، assertCountEqual() برای مقایسه‌ی دو پیمایش‌پذیر استفاده می‌شود تا تعیین کند که تعداد عناصر آن‌ها برابر است یا خیر (اینکه آیا همان عناصر با تعداد تکرار یکسان، بدون توجه به ترتیب، وجود دارند):

    def test_anagram(self):
        self.assertCountEqual('algorithm', 'logarithm')
    

    (مشارکت Raymond Hettinger.)

  • یکی از ویژگی‌های اصلی ماژول unittest، تلاشی برای تولید پیام‌های تشخیصی معنادار هنگام شکست یک آزمون است. در صورت امکان، شکست همراه با تفاوت (diff) خروجی ثبت می‌شود. این امر به‌ویژه برای تحلیل پرونده‌های گزارش اجراهای آزمون شکست‌خورده مفید است. با این حال، از آنجا که تفاوت‌ها گاهی می‌توانند حجیم باشند، ویژگی جدیدی به نام maxDiff وجود دارد که حداکثر طول تفاوت‌های نمایش‌داده‌شده را تعیین می‌کند.

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

    برای مثال، assertRegex() نام جدید assertRegexpMatches() است که نام‌گذاری‌اش نادرست بود، زیرا این آزمون از re.search() استفاده می‌کند، نه از re.match(). سایر متدهایی که از عبارت‌های باقاعده استفاده می‌کنند، اکنون با استفاده از شکل کوتاه «Regex» به‌جای «Regexp» نام‌گذاری شده‌اند -- این نام‌گذاری با نام‌های استفاده‌شده در پیاده‌سازی‌های دیگر unittest مطابقت دارد، با نام قدیمی پایتون برای ماژول re مطابقت دارد و نگارش شتری (camel-casing) آن بدون ابهام است.

    (ارائه‌شده توسط Raymond Hettinger و پیاده‌سازی‌شده توسط Ezio Melotti.)

  • برای بهبود سازگاری، برخی از نام‌های مستعار دیرینه‌ی متدها به نفع نام‌های ترجیحی منسوخ می‌شوند:

    نام قدیمی

    نام ترجیحی

    assert_()

    assertTrue()

    assertEquals()

    assertEqual()

    assertNotEquals()

    assertNotEqual()

    assertAlmostEquals()

    assertAlmostEqual()

    assertNotAlmostEquals()

    assertNotAlmostEqual()

    به همین ترتیب، انتظار می‌رود متدهای TestCase.fail* که در پایتون 3.1 منسوخ شده‌اند، در پایتون 3.3 حذف شوند.

    (ارائه‌شده توسط Ezio Melotti؛ bpo-9424.)

  • متد assertDictContainsSubset() منسوخ شد زیرا به‌نادرستی پیاده‌سازی شده بود و آرگومان‌ها به ترتیب اشتباه قرار گرفته بودند. این موضوع توهم‌های بصری‌ای دشوار برای اشکال‌زدایی ایجاد می‌کرد که در آن‌ها آزمون‌هایی مانند TestCase().assertDictContainsSubset({'a':1, 'b':2}, {'a':1}) با شکست مواجه می‌شدند.

    (مشارکت Raymond Hettinger.)

random

متدهای عدد صحیح در ماژول random اکنون کار بهتری در تولید توزیع‌های یکنواخت انجام می‌دهند. پیش‌تر، آن‌ها انتخاب‌ها را با int(n*random()) محاسبه می‌کردند که هرگاه n توانِ دو نبود، سوگیری جزئی داشت. اکنون، انتخاب‌های متعددی از بازه‌ای تا توانِ دوِ بعدی انجام می‌شود و انتخابی تنها زمانی نگه داشته می‌شود که در بازه 0 <= x < n قرار گیرد. توابع و متدهای متأثر عبارت‌اند از randrange()، randint()، choice()، shuffle() و sample().

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

poplib

کلاس POP3_SSL اکنون پارامتر context را می‌پذیرد که یک شیء ssl.SSLContext است و امکان گردآوری گزینه‌های پیکربندی SSL، گواهی‌ها و کلیدهای خصوصی را در یک ساختار واحد (بالقوه طولانی‌عمر) فراهم می‌کند.

(با مشارکت Giampaolo Rodolà؛ bpo-8807.)

asyncore

asyncore.dispatcher اکنون متد handle_accepted() را ارائه می‌دهد که یک جفت (sock, addr) را برمی‌گرداند و زمانی فراخوانی می‌شود که اتصالی واقعاً با یک پایانه‌ی راه دور جدید برقرار شده باشد. این متد قرار است به‌عنوان جایگزین handle_accept() قدیمی استفاده شود و کاربر را از فراخوانی مستقیم accept() بی‌نیاز می‌کند.

(با مشارکت Giampaolo Rodolà؛ bpo-6706.)

tempfile

ماژول tempfile یک مدیر زمینه جدید به نام TemporaryDirectory دارد که پاک‌سازی آسان و قطعی پوشه‌های موقت را فراهم می‌کند:

with tempfile.TemporaryDirectory() as tmpdirname:
    print('created temporary dir:', tmpdirname)

(مشارکت‌شده توسط Neil Schemenauer و Nick Coghlan؛ bpo-5178.)

inspect

  • ماژول inspect تابع جدیدی به نام getgeneratorstate() دارد که به‌سادگی وضعیت فعلی یک پیمایش‌گر تولیدگر را شناسایی می‌کند:

    >>> from inspect import getgeneratorstate
    >>> def gen():
    ...     yield 'demo'
    ...
    >>> g = gen()
    >>> getgeneratorstate(g)
    'GEN_CREATED'
    >>> next(g)
    'demo'
    >>> getgeneratorstate(g)
    'GEN_SUSPENDED'
    >>> next(g, None)
    >>> getgeneratorstate(g)
    'GEN_CLOSED'
    

    (مشارکت‌شده توسط Rodolpho Eckhardt و Nick Coghlan، bpo-10220.)

  • برای پشتیبانی از جستجوها بدون امکان فعال‌سازی یک ویژگی پویا، ماژول inspect تابع جدیدی به نام getattr_static() دارد. برخلاف hasattr()، این یک جستجوی واقعیِ فقط‌خواندنی است که تضمین می‌شود هنگام جستجو، وضعیت را تغییر نمی‌دهد:

    >>> class A:
    ...     @property
    ...     def f(self):
    ...         print('Running')
    ...         return 10
    ...
    >>> a = A()
    >>> getattr(a, 'f')
    Running
    10
    >>> inspect.getattr_static(a, 'f')
    <property object at 0x1022bd788>
    

(مشارکت‌شده توسط Michael Foord.)

pydoc

ماژول pydoc اکنون یک رابط وب‌سرور بسیار بهبود‌یافته و همچنین گزینه‌ی جدید خط فرمان -b برای باز کردن خودکار پنجره‌ی مرورگر به‌منظور نمایش آن سرور ارائه می‌دهد:

$ pydoc3.2 -b

(مشارکت‌شده توسط Ron Adam؛ bpo-2001.)

dis

ماژول dis دو تابع جدید برای بررسی کد به دست آورد: code_info() و show_code(). هر دو اطلاعات مفصل شیء کد را برای تابع، متد، رشته کد منبع یا شیء کد داده‌شده فراهم می‌کنند. اولی یک رشته را برمی‌گرداند و دومی آن را چاپ می‌کند:

>>> import dis, random
>>> dis.show_code(random.choice)
Name:              choice
Filename:          /Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/random.py
Argument count:    2
Kw-only arguments: 0
Number of locals:  3
Stack size:        11
Flags:             OPTIMIZED, NEWLOCALS, NOFREE
Constants:
   0: 'Choose a random element from a non-empty sequence.'
   1: 'Cannot choose from an empty sequence'
Names:
   0: _randbelow
   1: len
   2: ValueError
   3: IndexError
Variable names:
   0: self
   1: seq
   2: i

علاوه بر این، تابع dis() اکنون آرگومان‌های رشته‌ای می‌پذیرد، به‌طوری‌که می‌توان اصطلاح رایج dis(compile(s, '', 'eval')) را به dis(s) کوتاه کرد:

>>> dis('3*x+1 if x%2==1 else x//2')
  1           0 LOAD_NAME                0 (x)
              3 LOAD_CONST               0 (2)
              6 BINARY_MODULO
              7 LOAD_CONST               1 (1)
             10 COMPARE_OP               2 (==)
             13 POP_JUMP_IF_FALSE       28
             16 LOAD_CONST               2 (3)
             19 LOAD_NAME                0 (x)
             22 BINARY_MULTIPLY
             23 LOAD_CONST               1 (1)
             26 BINARY_ADD
             27 RETURN_VALUE
        >>   28 LOAD_NAME                0 (x)
             31 LOAD_CONST               0 (2)
             34 BINARY_FLOOR_DIVIDE
             35 RETURN_VALUE

در مجموع، این بهبودها کاوش در چگونگی پیاده‌سازی سی‌پایتون و اینکه خودتان ببینید سینتکس زبان در پشت صحنه چه می‌کند را آسان‌تر می‌کنند.

(مشارکت‌شده توسط Nick Coghlan در bpo-9147.)

dbm

همه ماژول‌های پایگاه داده اکنون از متدهای get() و setdefault() پشتیبانی می‌کنند.

(پیشنهاد ری آلن در bpo-9523.)

ctypes

یک نوع جدید، ctypes.c_ssize_t، نمایانگر نوع داده‌ی ssize_t در C است.

site

ماژول site سه تابع جدید دارد که برای گزارش‌دهی جزئیات یک نصب مشخص پایتون مفید هستند.

  • getsitepackages() همه‌ی پوشه‌های سراسری site-packages را فهرست می‌کند.

  • getuserbase() درباره‌ی پوشه‌ی پایه‌ی کاربر که می‌توان داده‌ها را در آن ذخیره کرد، گزارش می‌دهد.

  • getusersitepackages() مسیر پوشه‌ی site-packages مخصوص کاربر را نشان می‌دهد.

>>> import site
>>> site.getsitepackages()
['/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/site-packages',
 '/Library/Frameworks/Python.framework/Versions/3.2/lib/site-python',
 '/Library/Python/3.2/site-packages']
>>> site.getuserbase()
'/Users/raymondhettinger/Library/Python/3.2'
>>> site.getusersitepackages()
'/Users/raymondhettinger/Library/Python/3.2/lib/python/site-packages'

به‌طور مناسب، برخی از قابلیت‌های site مستقیماً از خط فرمان در دسترس هستند:

$ python -m site --user-base
/Users/raymondhettinger/.local
$ python -m site --user-site
/Users/raymondhettinger/.local/lib/python3.2/site-packages

(مشارکت‌شده توسط Tarek Ziadé در bpo-6693.)

sysconfig

ماژول جدید sysconfig کشف مسیرهای نصب و متغیرهای پیکربندی‌ای را که در پلتفرم‌ها و نصب‌های گوناگون متفاوت‌اند، ساده می‌سازد.

این ماژول توابع دسترسی ساده‌ای برای اطلاعات پلتفرم و نسخه ارائه می‌دهد:

  • get_platform() که مقادیری مانند linux-i586 یا macosx-10.6-ppc را برمی‌گرداند.

  • get_python_version() یک رشته نسخه پایتون مانند "3.2" را بازمی‌گرداند.

همچنین دسترسی به مسیرها و متغیرهای مربوط به یکی از هفت طرح‌واره‌ی نام‌دار که توسط distutils استفاده می‌شوند را فراهم می‌کند. این طرح‌واره‌ها شامل posix_prefix، posix_home، posix_user، nt، nt_user، os2 و os2_home هستند:

  • get_paths() دیکشنری‌ای می‌سازد که شامل مسیرهای نصب برای طرح‌واره نصب فعلی است.

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

همچنین یک رابط خط فرمان کارآمد وجود دارد:

C:\Python32>python -m sysconfig
Platform: "win32"
Python version: "3.2"
Current installation scheme: "nt"

Paths:
        data = "C:\Python32"
        include = "C:\Python32\Include"
        platinclude = "C:\Python32\Include"
        platlib = "C:\Python32\Lib\site-packages"
        platstdlib = "C:\Python32\Lib"
        purelib = "C:\Python32\Lib\site-packages"
        scripts = "C:\Python32\Scripts"
        stdlib = "C:\Python32\Lib"

Variables:
        BINDIR = "C:\Python32"
        BINLIBDEST = "C:\Python32\Lib"
        EXE = ".exe"
        INCLUDEPY = "C:\Python32\Include"
        LIBDEST = "C:\Python32\Lib"
        SO = ".pyd"
        VERSION = "32"
        abiflags = ""
        base = "C:\Python32"
        exec_prefix = "C:\Python32"
        platbase = "C:\Python32"
        prefix = "C:\Python32"
        projectbase = "C:\Python32"
        py_version = "3.2"
        py_version_nodot = "32"
        py_version_short = "3.2"
        srcdir = "C:\Python32"
        userbase = "C:\Documents and Settings\Raymond\Application Data\Python"

(از Distutils توسط Tarek Ziadé منتقل شد.)

pdb

ماژول اشکال‌زدای pdb تعدادی بهبود در قابلیت استفاده به دست آورد:

  • pdb.py اکنون گزینه‌ی -c دارد که دستورات را همان‌طور که در یک پرونده اسکریپت .pdbrc داده می‌شوند اجرا می‌کند.

  • یک پرونده اسکریپت .pdbrc می‌تواند شامل دستورات continue و next باشد که اشکال‌زدایی را ادامه می‌دهند.

  • سازنده‌ی کلاس Pdb اکنون آرگومان nosigint را می‌پذیرد.

  • دستورهای جدید: l(list)، ll(long list) و source برای نمایش کد منبع.

  • دستورهای جدید: display و undisplay برای نمایش یا پنهان‌کردن مقدار یک عبارت در صورتی که تغییر کرده باشد.

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

  • نقطه‌های توقف را می‌توان بر اساس شماره‌ی نقطه‌ی توقف پاک‌سازی کرد.

(مشارکت‌شده توسط Georg Brandl، Antonio Cuni و Ilya Sandler.)

configparser

ماژول configparser تغییر کرد تا کاربردپذیری و پیش‌بینی‌پذیری پارسر پیش‌فرض و سینتکس INI مورد پشتیبانی آن بهبود یابد. کلاس قدیمی ConfigParser حذف شد و به‌جای آن SafeConfigParser قرار گرفت که به نوبه خود به ConfigParser تغییر نام یافته است. پشتیبانی از کامنت‌های درون‌خطی اکنون به‌صورت پیش‌فرض غیرفعال است و تکرار بخش‌ها یا گزینه‌ها در یک منبع پیکربندی واحد مجاز نیست.

پارسرهای پیکربندی یک API جدید مبتنی بر پروتکل نگاشت به دست آوردند:

>>> parser = ConfigParser()
>>> parser.read_string("""
... [DEFAULT]
... location = upper left
... visible = yes
... editable = no
... color = blue
...
... [main]
... title = Main Menu
... color = green
...
... [options]
... title = Options
... """)
>>> parser['main']['color']
'green'
>>> parser['main']['editable']
'no'
>>> section = parser['options']
>>> section['title']
'Options'
>>> section['title'] = 'Options (editable: %(editable)s)'
>>> section['title']
'Options (editable: no)'

API جدید بر پایه‌ی API کلاسیک پیاده‌سازی شده است، بنابراین زیرکلاس‌های سفارشی پارسر باید بتوانند بدون هیچ تغییری از آن استفاده کنند.

ساختار پرونده INI که پارسرهای پیکربندی می‌پذیرند، اکنون قابل سفارشی‌سازی است. کاربران می‌توانند جداکننده‌های جایگزین گزینه/مقدار و پیشوندهای کامنت را تعیین کنند، نام بخش DEFAULT را تغییر دهند یا سینتکس درون‌یابی را عوض کنند.

پشتیبانی از درون‌یابی قابل اتصال وجود دارد، از جمله یک هندلر درون‌یابی اضافی ExtendedInterpolation:

>>> parser = ConfigParser(interpolation=ExtendedInterpolation())
>>> parser.read_dict({'buildout': {'directory': '/home/ambv/zope9'},
...                   'custom': {'prefix': '/usr/local'}})
>>> parser.read_string("""
... [buildout]
... parts =
...   zope9
...   instance
... find-links =
...   ${buildout:directory}/downloads/dist
...
... [zope9]
... recipe = plone.recipe.zope9install
... location = /opt/zope
...
... [instance]
... recipe = plone.recipe.zope9instance
... zope9-location = ${zope9:location}
... zope-conf = ${custom:prefix}/etc/zope.conf
... """)
>>> parser['buildout']['find-links']
'\n/home/ambv/zope9/downloads/dist'
>>> parser['instance']['zope-conf']
'/usr/local/etc/zope.conf'
>>> instance = parser['instance']
>>> instance['zope-conf']
'/usr/local/etc/zope.conf'
>>> instance['zope9-location']
'/opt/zope'

تعدادی از قابلیت‌های کوچک‌تر نیز معرفی شدند، مانند پشتیبانی از تعیین کدگذاری در عملیات خواندن، تعیین مقادیر جایگزین برای توابع get، یا خواندن مستقیم از دیکشنری‌ها و رشته‌ها.

(تمام تغییرات توسط Łukasz Langa ارائه شده است.)

urllib.parse

تعدادی بهبود کاربردپذیری برای ماژول urllib.parse انجام شد.

تابع urlparse() اکنون از نشانی‌های IPv6 مطابق شرح RFC 2732 پشتیبانی می‌کند:

>>> import urllib.parse
>>> urllib.parse.urlparse('http://[dead:beef:cafe:5417:affe:8FA3:deaf:feed]/foo/')
ParseResult(scheme='http',
            netloc='[dead:beef:cafe:5417:affe:8FA3:deaf:feed]',
            path='/foo/',
            params='',
            query='',
            fragment='')

تابع urldefrag() اکنون یک تاپل نام‌دار را برمی‌گرداند:

>>> r = urllib.parse.urldefrag('http://python.org/about/#target')
>>> r
DefragResult(url='http://python.org/about/', fragment='target')
>>> r[0]
'http://python.org/about/'
>>> r.fragment
'target'

و تابع urlencode() اکنون بسیار انعطاف‌پذیرتر است و نوع رشته یا bytes را برای آرگومان query می‌پذیرد. اگر رشته باشد، پارامترهای safe، encoding و error برای کدگذاری به quote_plus() ارسال می‌شوند:

>>> urllib.parse.urlencode([
...      ('type', 'telenovela'),
...      ('name', '¿Dónde Está Elisa?')],
...      encoding='latin-1')
'type=telenovela&name=%BFD%F3nde+Est%E1+Elisa%3F'

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

>>> urllib.parse.urlparse(b'http://www.python.org:80/about/')
ParseResultBytes(scheme=b'http', netloc=b'www.python.org:80',
                 path=b'/about/', params=b'', query=b'', fragment=b'')

(کاری از Nick Coghlan، Dan Mahn و Senthil Kumaran در bpo-2987، bpo-5468 و bpo-9873.)

mailbox

به لطف تلاش هماهنگ R. David Murray، ماژول mailbox برای Python 3.2 اصلاح شده است. چالش این بود که mailbox در اصل با یک رابط متنی طراحی شده بود، اما پیام‌های ایمیل به بهترین شکل با bytes نمایش داده می‌شوند، زیرا بخش‌های مختلف یک پیام ممکن است کدگذاری‌های متفاوتی داشته باشند.

این راه‌حل از پشتیبانی دودویی بسته‌ی email برای تجزیه‌ی پیام‌های ایمیل دلخواه بهره گرفت. علاوه بر این، این راه‌حل نیازمند تعدادی تغییر در API بود.

همان‌طور که انتظار می‌رفت، متد add() برای اشیاء mailbox.Mailbox اکنون ورودی دودویی را می‌پذیرد.

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

پشتیبانی از خروجی دودویی نیز وجود دارد. متد get_file() اکنون پرونده‌ای را در حالت دودویی برمی‌گرداند (در حالی که قبلاً به‌طور نادرست پرونده را به حالت متنی تنظیم می‌کرد). همچنین متد جدید get_bytes() وجود دارد که بازنمایی bytes از پیامی متناظر با یک کلید داده‌شده را برمی‌گرداند.

هنوز هم می‌توان با استفاده از متد get_string() از API قدیمی، خروجی غیردودویی دریافت کرد، اما این رویکرد چندان مفید نیست. در عوض، بهتر است پیام‌ها را از یک شیء Message استخراج کنید یا آن‌ها را از ورودی دودویی بارگذاری کنید.

(مشارکت‌شده توسط R. David Murray، با تلاش‌های Steffen Daode Nurpmeso و وصل اولیه از Victor Stinner در bpo-9124.)

turtledemo

کد نمایشی ماژول turtle از پوشه‌ی Demo به کتابخانه‌ی اصلی منتقل شد. این کد شامل بیش از یک دوجین اسکریپت نمونه با نمایش‌های زنده و پویا است. از آنجا که در sys.path قرار دارد، اکنون می‌توان آن را مستقیماً از خط فرمان اجرا کرد:

$ python -m turtledemo

(منتقل‌شده از پوشه Demo توسط Alexander Belopolsky در bpo-10199.)

چندنخی

  • مکانیزم سری‌سازی اجرای نخ‌های پایتون در حال اجرای همزمان (که عموماً با نام GIL یا قفل مفسر سراسری شناخته می‌شود) بازنویسی شده است. از جمله اهداف این بازنویسی، بازه‌های تعویض قابل‌پیش‌بینی‌تر و کاهش سربار ناشی از رقابت بر سر قفل و تعداد فراخوانی‌های سیستمی متعاقب بود. مفهوم «بازه‌ی بررسی» (check interval) که تعویض نخ‌ها را ممکن می‌کرد، کنار گذاشته شده و با یک مدت زمان مطلق برحسب ثانیه جایگزین شده است. این پارامتر از طریق sys.setswitchinterval() قابل تنظیم است. مقدار پیش‌فرض آن در حال حاضر ۵ میلی‌ثانیه است.

    جزئیات بیشتر درباره‌ی پیاده‌سازی را می‌توان از یک پیام فهرست پستی python-dev خواند (البته، «درخواست‌های اولویت» که در این پیام مطرح شده‌اند، برای گنجاندن حفظ نشده‌اند).

    (مشارکت آنتوان پی‌ترو.)

  • قفل‌های معمولی و بازگشتی اکنون یک آرگومان اختیاری مهلت زمانی برای متد acquire() خود می‌پذیرند. (مشارکت از سوی Antoine Pitrou؛ bpo-7316.)

  • به‌طور مشابه، threading.Semaphore.acquire() نیز آرگومان مهلت زمانی دریافت کرد. (مشارکت‌شده توسط Torsten Landschoff؛ bpo-850728.)

  • به‌دست‌آوردن قفل‌های معمولی و بازگشتی اکنون می‌تواند در پلتفرم‌هایی که از Pthreads استفاده می‌کنند، توسط سیگنال‌ها قطع شود. این بدان معناست که می‌توان برنامه‌های پایتونی را که هنگام به‌دست‌آوردن قفل‌ها دچار بن‌بست می‌شوند، با ارسال مکرر سیگنال SIGINT به فرایند (با فشردن Ctrl+C در بیشتر پوسته‌ها) با موفقیت خاتمه داد. (مشارکت‌کرده: Reid Kleckner؛ bpo-8844.)

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

تعدادی بهبود کوچک در کارایی اضافه شده است:

  • بهینه‌ساز پنجره‌ای (peephole optimizer) پایتون اکنون الگوهایی مانند x in {1, 2, 3} را به‌عنوان آزمون عضویت در مجموعه‌ای از ثابت‌ها تشخیص می‌دهد. بهینه‌ساز set را به frozenset تبدیل می‌کند و ثابت پیش‌ساخته را ذخیره می‌کند.

    اکنون که جریمه‌ی سرعت از میان رفته است، عملی است که نوشتن آزمون‌های عضویت را با استفاده از نماد مجموعه آغاز کنید. این سبک هم از نظر معنایی روشن است و هم از نظر عملیاتی سریع:

    extension = name.rpartition('.')[2]
    if extension in {'xml', 'html', 'xhtml', 'css'}:
        handle(name)
    

    (وصل و آزمون‌های اضافی توسط دیو مالکوم ارائه شده‌اند؛ bpo-6690).

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

    (با مشارکت Alexandre Vassalotti، Antoine Pitrou و تیم Unladen Swallow در bpo-9410 و bpo-3873.)

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

    (وصل توسط Daniel Stutzbach در bpo-9915.)

  • هرگاه رشته‌ی یکسانی برای چندین کلید تکرار شود، کارایی کدگشایی JSON بهبود می‌یابد و مصرف حافظه کاهش می‌یابد. همچنین، کدگذاری JSON اکنون هنگامی که آرگومان sort_keys برابر true باشد، از تسریع‌کننده‌های C استفاده می‌کند.

    (مشارکت‌شده توسط آنتوان پی‌ترو در bpo-7451 و توسط ریموند هتینگر و آنتوان پی‌ترو در bpo-10314.)

  • قفل‌های بازگشتی (که با API تابع threading.RLock() ساخته می‌شوند) اکنون از یک پیاده‌سازی C بهره می‌برند که آن‌ها را به اندازه‌ی قفل‌های معمولی سریع و بین ۱۰ تا ۱۵ برابر سریع‌تر از پیاده‌سازی خالص پایتون قبلی‌شان می‌کند.

    (نوشته‌ی آنتوان پی‌ترو؛ bpo-3001.)

  • الگوریتم جست‌وجوی سریع (fast-search) در stringlib اکنون توسط متدهای split()، rsplit()، splitlines() و replace() روی اشیاء bytes، bytearray و str استفاده می‌شود. به همین ترتیب، این الگوریتم توسط rfind()، rindex()، rsplit() و rpartition() نیز استفاده می‌شود.

    (وصل توسط Florent Xicluna در bpo-7622 و bpo-7462.)

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

    (bpo-6713 توسط Gawain Bolton، Mark Dickinson و Victor Stinner.)

چندین بهینه‌سازی جزئی دیگر نیز وجود داشت. تفریق مجموعه اکنون زمانی که یکی از عملوندها بسیار بزرگ‌تر از دیگری باشد، سریع‌تر اجرا می‌شود (وصل توسط Andress Bennetts در bpo-8685). متد array.repeat() پیاده‌سازی سریع‌تری دارد (bpo-1569291 توسط Alexander Belopolsky). BaseHTTPRequestHandler بافر کردن کارآمدتری دارد (bpo-3709 توسط Andrew Schaaf). تابع operator.attrgetter() سریع‌تر شده است (bpo-10160 توسط Christos Georgiou). و ConfigParser آرگومان‌های چندسطری را کمی سریع‌تر بارگذاری می‌کند (bpo-7113 توسط Łukasz Langa).

یونیکد

پایتون به Unicode 6.0.0 به‌روزرسانی شده است. این به‌روزرسانی استاندارد، بیش از ۲۰۰۰ نویسه‌ی جدید از جمله نمادهای ایموجی که برای تلفن‌های همراه اهمیت دارند، اضافه می‌کند.

علاوه بر این، استاندارد به‌روزشده ویژگی‌های دو نویسه‌ی کانادا (U+0CF1, U+0CF2) و یک نویسه‌ی عددی تای لوی جدید (New Tai Lue) (U+19DA) را تغییر داده است؛ به‌طوری‌که نویسه‌های کانادا واجد شرایط استفاده در شناسه‌ها می‌شوند، در حالی که نویسه‌ی تای لوی جدید از این شرایط خارج می‌شود. برای اطلاعات بیشتر، تغییرات پایگاه داده‌ی نویسه‌های یونیکد را ببینید.

کدک‌ها

پشتیبانی از کدگذاری cp720 DOS عربی اضافه شد (bpo-1616979).

کدگذاری MBCS دیگر آرگومان هندلر خطا را نادیده نمی‌گیرد. در حالت سخت‌گیرانه‌ی پیش‌فرض، هنگام مواجهه با دنباله‌ی بایتی غیرقابل کدگشایی، UnicodeDecodeError و برای نویسه‌ی غیرقابل کدگذاری، UnicodeEncodeError ایجاد می‌کند.

کدک MBCS هندلرهای خطای 'strict' و 'ignore' را برای کدگشایی و 'strict' و 'replace' را برای کدگذاری پشتیبانی می‌کند.

برای شبیه‌سازی کدگذاری MBCS در Python3.1، هندلر 'ignore' را برای کدگشایی و هندلر 'replace' را برای کدگذاری انتخاب کنید.

در Mac OS X، پایتون آرگومان‌های خط فرمان را به‌جای کدگذاری locale با 'utf-8' کدگشایی می‌کند.

به‌طور پیش‌فرض، tarfile از کدگذاری 'utf-8' در ویندوز (به‌جای 'mbcs') و هندلر خطای 'surrogateescape' در تمام سیستم‌عامل‌ها استفاده می‌کند.

مستندات

مستندات همچنان بهبود می‌یابد.

  • جدولی از پیوندهای سریع به بالای بخش‌های طولانی مانند Built-in Functions افزوده شده است. در مورد itertools، این پیوندها با جدول‌هایی از خلاصه‌های به سبک برگه‌ی تقلب (cheatsheet) همراه هستند تا بدون نیاز به خواندن تمام مستندات، نمای کلی و یادآوری فراهم کنند.

  • در برخی موارد، کد منبع پایتون خالص می‌تواند مکمل سودمندی برای مستندات باشد؛ بنابراین اکنون بسیاری از ماژول‌ها دارای پیوندهای سریعی به آخرین نسخه‌ی کد منبع هستند. برای مثال، مستندات ماژول functools در بالای خود پیوند سریعی دارد که با این عنوان برچسب‌گذاری شده است:

    کد منبع Lib/functools.py.

    (مشارکت‌شده توسط ری‌موند هتینگر؛ برای دیدن دلایل مراجعه کنید.)

  • مستندات اکنون مثال‌ها و دستورالعمل‌های (recipes) بیشتری را در بر می‌گیرند. به‌طور خاص، ماژول re بخش گسترده‌ای دارد، نمونه‌های عبارت باقاعده. به همین ترتیب، ماژول itertools همچنان با دستورپخت‌های Itertools جدید به‌روزرسانی می‌شود.

  • ماژول datetime اکنون یک پیاده‌سازی کمکی در پایتون خالص دارد. هیچ کارکردی تغییر نکرد. این صرفاً یک پیاده‌سازی جایگزینِ خواناتر فراهم می‌کند.

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

  • پوشه‌ی Demo که نگهداری نمی‌شد، حذف شده است. برخی از دموها در مستندات ادغام شدند، برخی به پوشه‌ی Tools/demo منتقل شدند و بقیه نیز به‌کلی حذف شدند.

    (مشارکت Georg Brandl در bpo-7962.)

IDLE

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

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

  • IDLE در Mac OS X اکنون با هر دو Carbon AquaTk و Cocoa AquaTk کار می‌کند.

    (با مشارکت Kevin Walzer، Ned Deily و Ronald Oussoren؛ bpo-6075.)

مخزن کد

علاوه بر مخزن کد Subversion موجود در https://svn.python.org اکنون یک مخزن Mercurial در https://hg.python.org/ وجود دارد.

پس از انتشار نسخه 3.2، برنامه‌هایی برای مهاجرت به Mercurial به‌عنوان مخزن اصلی وجود دارد. این سیستم کنترل نسخه توزیع‌شده باید ایجاد و اشتراک‌گذاری مجموعه‌های تغییرات (changeset) خارجی را برای اعضای کامیونیتی آسان‌تر کند. برای جزئیات، PEP 385 را ببینید.

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

تغییرات ساخت و API زبان C

تغییرات در فرایند ساخت پایتون و در C API عبارت‌اند از:

  • اسکریپت‌های idle، pydoc و 2to3 اکنون هنگام اجرای make altinstall با پسوند مخصوص نسخه نصب می‌شوند (bpo-10679).

  • توابع C که به پایگاه داده یونیکد دسترسی دارند، اکنون حتی در ساخت‌های باریک یونیکد نیز نویسه‌هایی از کل محدوده یونیکد را می‌پذیرند و برمی‌گردانند (Py_UNICODE_TOLOWER، Py_UNICODE_ISDECIMAL و موارد دیگر). یک تفاوت قابل مشاهده در پایتون این است که unicodedata.numeric() اکنون مقدار صحیح را برای نقطه‌کدهای بزرگ برمی‌گرداند و repr() ممکن است نویسه‌های بیشتری را قابل چاپ در نظر بگیرد.

    (گزارش‌شده توسط Bupjoe Lee و رفع‌شده توسط Amaury Forgeot D'Arc؛ bpo-5127.)

  • گوتوهای محاسبه‌شده (computed gotos) اکنون به‌طور پیش‌فرض در کامپایلرهای پشتیبانی‌شده (که توسط اسکریپت configure تشخیص داده می‌شوند) فعال هستند. همچنان می‌توان با مشخص کردن --without-computed-gotos آن‌ها را به‌صورت انتخابی غیرفعال کرد.

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

  • گزینه --with-wctype-functions حذف شد. اکنون پایگاه داده‌ی یونیکد توکار برای همه‌ی توابع استفاده می‌شود.

    (مشارکت‌شده توسط Amaury Forgeot D'Arc؛ bpo-9210.)

  • مقادیر هش اکنون مقادیری از نوع جدید Py_hash_t هستند که هم‌اندازه‌ی یک اشاره‌گر تعریف شده است. پیش‌تر آن‌ها از نوع long بودند که در برخی سیستم‌عامل‌های ۶۴ بیتی همچنان تنها ۳۲ بیت طول دارد. در نتیجه‌ی این اصلاح، set و dict اکنون می‌توانند در نسخه‌های ساخته‌شده (builds) با اشاره‌گرهای ۶۴ بیتی بیش از 2**32 ورودی را نگه دارند (پیش‌تر، آن‌ها می‌توانستند به آن اندازه رشد کنند، اما کارایی‌شان به‌طور فاجعه‌باری افت می‌کرد).

    (پیشنهاد Raymond Hettinger و پیاده‌سازی Benjamin Peterson؛ bpo-9778.)

  • ماکرو جدید Py_VA_COPY وضعیت فهرست آرگومان‌های متغیر را کپی می‌کند. این ماکرو معادل va_copy در C99 است، اما در همه‌ی پلتفرم‌های پایتون در دسترس است (bpo-2443).

  • تابع جدید PySys_SetArgvEx() در C API به مفسر تعبیه‌شده اجازه می‌دهد sys.argv را بدون اینکه sys.path را نیز تغییر دهد، تنظیم کند (bpo-5753).

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

  • تابع جدیدی به نام PyLong_AsLongLongAndOverflow() وجود دارد که مشابه PyLong_AsLongAndOverflow() است. هر دو برای تبدیل int پایتون به یک نوع بومی با عرض ثابت به کار می‌روند و هم‌زمان تشخیص مواردی را که تبدیل در آن‌ها جا نمی‌شود فراهم می‌کنند (bpo-7767).

  • تابع PyUnicode_CompareWithASCIIString() اکنون در صورتی که رشته‌ی پایتون با تهی پایان یافته باشد، نتیجه‌ی نابرابری را برمی‌گرداند.

  • تابع جدیدی به نام PyErr_NewExceptionWithDoc() وجود دارد که مانند PyErr_NewException() است، اما اجازه می‌دهد یک رشته مستند برای آن تعیین شود. این امر به استثناهای C اجازه می‌دهد همان قابلیت‌های خودمستندسازی همتایان پایتون خالص خود را داشته باشند (bpo-7033).

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

  • قالب O? از توابع PyArg_Parse حذف شد. این قالب دیگر استفاده نمی‌شود و هرگز مستند نشده بود (bpo-8837).

تعدادی تغییر کوچک دیگر نیز در C-API وجود داشت. برای مشاهده‌ی فهرست کامل، پرونده‌ی Misc/NEWS را ببینید.

همچنین، تعدادی به‌روزرسانی در ساخت‌ Mac OS X انجام شده است؛ برای جزئیات، Mac/BuildScript/README.txt را ببینید. برای کاربرانی که ساخت‌ ۳۲/۶۴ بیتی را اجرا می‌کنند، مشکل شناخته‌شده‌ای با Tcl/Tk پیش‌فرض در Mac OS X 10.6 وجود دارد. بر این اساس، توصیه می‌کنیم جایگزین به‌روزی نصب کنید، مانند ActiveState Tcl/Tk 8.5.9. برای جزئیات بیشتر به https://www.python.org/download/mac/tcltk/ مراجعه کنید.

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

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

  • در ماژول configparser تعدادی پاک‌سازی انجام شده است. تغییر اصلی، جایگزینی کلاس قدیمی ConfigParser با جایگزین دیرینه و ترجیحی SafeConfigParser است. علاوه بر این، تعدادی ناسازگاری کوچک‌تر نیز وجود دارد:

    • سینتکس درون‌یابی اکنون در عملیات get() و set() اعتبارسنجی می‌شود. در طرح‌واره‌ی درون‌یابی پیش‌فرض، تنها دو توکن دارای علامت درصد معتبرند: %(name)s و %% که دومی یک علامت درصد خنثی‌شده است.

    • متدهای set() و add_section() اکنون راستی‌آزمایی می‌کنند که مقادیر، رشته‌های واقعی باشند. پیش‌تر، نوع‌های پشتیبانی‌نشده می‌توانستند به‌طور ناخواسته وارد شوند.

    • بخش‌ها یا گزینه‌های تکراری از یک منبع واحد اکنون یکی از خطاهای DuplicateSectionError یا DuplicateOptionError را ایجاد می‌کنند. پیش‌تر، موارد تکراری، ورودی قبلی را به‌صورت بی‌صدا بازنویسی می‌کردند.

    • کامنت‌های درون‌خطی اکنون به‌طور پیش‌فرض غیرفعال شده‌اند، بنابراین اکنون می‌توان از نویسه‌ی ; در مقادیر به‌طور ایمن استفاده کرد.

    • کامنت‌ها اکنون می‌توانند تورفتگی داشته باشند. در نتیجه، برای آنکه ; یا # در ابتدای سطری از مقادیر چندسطری ظاهر شود، باید درون‌یابی شود. این امر مانع می‌شود که نویسه‌های پیشوند کامنت در مقادیر به اشتباه به‌عنوان کامنت تلقی شوند.

    • "" اکنون یک مقدار معتبر است و دیگر به‌طور خودکار به رشته خالی تبدیل نمی‌شود. برای رشته‌های خالی، از "option =" در یک سطر استفاده کنید.

  • ماژول nntplib به‌طور گسترده بازنویسی شده است، به این معنا که API‌های آن اغلب با API‌های نسخه‌ی 3.1 ناسازگار هستند.

  • از اشیاء bytearray دیگر نمی‌توان به‌عنوان نام پرونده استفاده کرد؛ در عوض، باید به bytes تبدیل شوند.

  • متدهای array.tostring() و array.fromstring() برای شفافیت بیشتر به array.tobytes() و array.frombytes() تغییر نام داده شده‌اند. نام‌های قدیمی منسوخ شده‌اند. (به bpo-8990 مراجعه کنید.)

  • توابع PyArg_Parse*():

    • قالب "t#" حذف شده است: به جای آن از "s#" یا "s*" استفاده کنید

    • قالب‌های "w" و "w#" حذف شده‌اند: به جای آن‌ها از "w*" استفاده کنید

  • نوع PyCObject که در نسخه‌ی 3.1 منسوخ شده بود، حذف شده است. برای پوشش دادن اشاره‌گرهای مات C در اشیاء پایتون، باید به‌جای آن از API مربوط به PyCapsule استفاده کرد؛ نوع جدید رابطی خوش‌تعریف برای انتقال اطلاعات ایمنی نوع و امضایی ساده‌تر برای فراخوانی مخرب دارد.

  • تابع sys.setfilesystemencoding() حذف شد، زیرا طراحی آن معیوب بود.

  • تابع و متد random.seed() اکنون بذرهای رشته‌ای را با یک تابع هش sha512 نمک‌گذاری می‌کنند. برای دسترسی به نسخه‌ی قبلی seed به‌منظور بازتولید دنباله‌های Python 3.1، آرگومان version را برابر 1 قرار دهید، random.seed(s, version=1).

  • تابع string.maketrans() که پیش‌تر منسوخ شده بود، حذف شد و جای خود را به متدهای ایستای bytes.maketrans() و bytearray.maketrans() داد. این تغییر، سردرگمی درباره‌ی نوع‌هایی را که ماژول string از آن‌ها پشتیبانی می‌کرد، برطرف می‌کند. اکنون، str، bytes و bytearray هر یک متدهای maketrans و translate خود را به همراه جدول‌های ترجمه‌ی میانی از نوع مناسب دارند.

    (مشارکت توسط Georg Brandl؛ bpo-5675.)

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

    with open('mylog.txt') as infile, open('a.out', 'w') as outfile:
        for line in infile:
            if '<critical>' in line:
                outfile.write(line)
    

    (مشارکت‌شده توسط Georg Brandl و Mattias Brändström؛ appspot issue 53094.)

  • تابع struct.pack() اکنون برای کد بسته‌بندی رشته‌ای s تنها بایت‌ها را مجاز می‌داند. سابقاً، این تابع آرگومان‌های متنی را می‌پذیرفت و آن‌ها را به‌طور ضمنی با استفاده از UTF-8 به بایت‌ها کدگذاری می‌کرد. این موضوع مشکل‌ساز بود؛ هم به این دلیل که فرض‌هایی درباره کدگذاری صحیح داشت، و هم به این دلیل که کدگذاری با طول متغیر ممکن است هنگام نوشتن در بخشی با طول ثابت از یک ساختار شکست بخورد.

    کدی مانند struct.pack('<6sHHBBB', 'GIF87a', x, y) باید بازنویسی شود تا به جای متن از بایت‌ها استفاده کند: struct.pack('<6sHHBBB', b'GIF87a', x, y).

    (کشف‌شده توسط دیوید بیزلی و رفع‌شده توسط ویکتور استینر؛ bpo-10783.)

  • کلاس xml.etree.ElementTree اکنون هنگامی که تجزیه شکست می‌خورد، xml.etree.ElementTree.ParseError ایجاد می‌کند. پیش‌تر xml.parsers.expat.ExpatError ایجاد می‌کرد.

  • مقدار جدید و طولانی‌تر str() روی اعداد اعشاری ممکن است doctestهایی را که به قالب خروجی قدیمی متکی هستند، بشکند.

  • در subprocess.Popen، مقدار پیش‌فرض close_fds اکنون در یونیکس True است؛ در ویندوز، این مقدار در صورتی که سه جریان استاندارد روی None تنظیم شده باشند True و در غیر این صورت False است. پیش‌تر، close_fds همیشه به‌صورت پیش‌فرض False بود که هنگام نشت توصیف‌گرهای پرونده‌ی باز به فرایند فرزند، موجب اشکال‌هایی می‌شد که حل آن‌ها دشوار بود یا شرایط رقابت ایجاد می‌کرد.

  • پشتیبانی از HTTP 0.9 قدیمی در urllib.request و http.client حذف شده است. چنین پشتیبانی همچنان در سمت سرور (در http.server) وجود دارد.

    (مشارکت‌شده توسط Antoine Pitrou، bpo-10711.)

  • سوکت‌های SSL در حالت مهلت زمانی اکنون هنگام وقوع مهلت زمانی، استثنای socket.timeout را ایجاد می‌کنند، نه یک SSLError عمومی.

    (مشارکت‌کرده توسط Antoine Pitrou، bpo-10272.)

  • توابع گمراه‌کننده PyEval_AcquireLock() و PyEval_ReleaseLock() رسماً منسوخ شده‌اند. به جای آن‌ها باید از APIهای آگاه از وضعیت نخ (مانند PyEval_SaveThread() و PyEval_RestoreThread()) استفاده کرد.

  • به دلیل خطرات امنیتی، asyncore.handle_accept() منسوخ شده است و تابع جدیدی به نام asyncore.handle_accepted() برای جایگزینی آن اضافه شده است.

    (مشارکت‌شده توسط Giampaolo Rodola در bpo-6706.)

  • به دلیل پیاده‌سازی جدید GIL، دیگر نمی‌توان PyEval_InitThreads() را پیش از Py_Initialize() فراخوانی کرد.