به نظرم جالبترین نسخهای که چندین وقت منتظرش بودم بالاخره منتظر شد. نسخه پایتون ۳.۱۴! شباهت این نسخه به عدد معروف پی (π) یکی از جذابترین اتفاقهای برنامه نویسی بود. جالب تر اینکه در این نسخه میتونید به معنای واقعی از کاراکترهای یونانی برای محاسبات خودتون استفاده کنید. جذابه درسته؟ حالا بریم در این مقاله از سایت کداکسپلور، آخرین تغییرات این نسخه جذاب رو بررسی کنیم.
هشدار
اول بگیم که این نسخه، نهایی و stable نیست. پس اگه قصد تست کردن دارید، برای production استفاده نکنید.
آنچه در این مقاله میخونید:
- خلاصهای از تغییرات
- ویژگیهای جدید
- بهبودهایی ارور
- بهبودها
- منسوخ شدهها
- حذف شدهها
خلاصهای از تغییرات:
بیاید اول نگاهی به خلاصهای از تغییرات بندازیم.
- PEP 649: deferred evaluation of annotations
- PEP 741: Python Configuration C API
- PEP 761: Discontinuation of PGP signatures
ارزیابی تعویقی حاشیهنویسیها، رابط برنامهنویسی پیکربندی پایتون به زبان C و توقف استفاده از امضاهای PGP از تغییرات اصلی این نسخه هست. در ادامه، به صورت کاملتر هر کدوم رو بررسی میکنیم.
ویژگیهای جدید:
ارزیابی تعویقی حاشیهنویسیها
حاشیهنویسیها دیگه بهصورت فوری اجرا نمیشن! یعنی حالا این قابلیت مثل یه دوست صبور منتظر میمونه تا وقتی لازم شد، دست به کار بشه. نتیجه؟ اجرای سریعتر برنامهها، بدون هیچ افت سرعت. حالا چطور این اتفاق افتاده؟
اینجا پای یه ماژول جدید به اسم annotationlib وسطه که حاشیهنویسیها رو تو سه فرمت جالب ارائه میده:
• VALUE: اجرا مثل گذشته، یعنی به مقادیر واقعی تبدیل میشه.
• FORWARDREF: برای موقعیتهایی که هنوز اسمها تعریف نشدن، با یه علامت خاص جایگزین میکنه.
• STRING: حاشیهنویسیها رو به شکل رشتهای ساده نشون میده.
from annotationlib import get_annotations, Format def func(arg: Undefined): pass get_annotations(func, format=Format.VALUE) # اوه نه! خطا: NameError: name 'Undefined' is not defined get_annotations(func, format=Format.FORWARDREF) # {'arg': ForwardRef('Undefined')} get_annotations(func, format=Format.STRING) # {'arg': 'Undefined'}
حالا چی یاد گرفتیم؟ دیگه لازم نیست برای Forward References حاشیهنویسیها رو توی رشتهها بزاریم. یا حتی از from future import annotationsاستفاده کنیم. خلاصه اینکه کدتون تمیزتر و جذابتر میشه!
بهبود متنهای ارور.
ظاهرا تیم توسعه پایتون قصد داره سردرد کمتری برای برنامهنویسانش درست کنه. بهبود متنهای ارور کمک میکنه سریع تر و بهتر بتونید باگ رو پیدا کنید و از شرش خلاص بشید!
فرض کنید توی باز کردن مقادیر (Unpacking) یه اشتباه کوچولو کردید:
x, y, z = 1, 2, 3, 4 # خطا: # ValueError: too many values to unpack (expected 3, got 4)
حالا به این پیام نگاه کنید! خیلی واضح بهتون میگه که چه اشتباهی کردید و چند مقدار اضافه وارد کردید. حسابی کارتون رو راحت میکنه.
یه نکته مهم
اگه هنوز از from __future__ import annotations استفاده میکنید، خبر خوب اینه که این نسخه هنوز این دستور رو پشتیبانی میکنه. اما یادتون باشه که این قابلیت قراره در آینده حذف بشه (بعد از 2029). پس وقتشه کدهای قدیمیتون رو بهروز کنید.
PEP 741: رابط C برای پیکربندی پایتون
حالا یه API جدید به اسم PyInitConfig معرفی شده که دیگه نیازی به ساختارهای پیچیده C نداره و در عین حال اجازه میده تغییرات آینده به صورت ABI-compatible باقی بمونن. یعنی چی؟ یعنی پیکربندی سادهتر، با انعطاف بیشتر برای تغییرات بعدی.
چند قابلیت مهم که اضافه شدن:
• تابع ()PyInitConfig_AddModule:
این تابع جدید بهتون اجازه میده ماژولهای داخلی (همون چیزی که قبلاً بهش “inittab” میگفتیم) رو اضافه کنید.
• توابع ()PyConfig_Get و ()PyConfig_Set:
برای گرفتن یا تنظیم پیکربندی فعلی در زمان اجرا.
پس این PEP 741 چیکار میکنه؟
این PEP تمام تنظیمات اولیه و پیشتنظیمات (Preinitialization) پایتون رو توی یه API واحد یکپارچه میکنه. از طرف دیگه، دیگه خبری از انتخاب دوگانه “Python” و “Isolated” که تو PEP 587 وجود داشت، نیست. اینطوری همهچی سادهتر و جمعوجورتر شده.
البته API پایینردهی PEP 587 PyConfig همچنان برای اونایی که نیاز به کنترل بیشتری روی جزئیات CPython دارن، باقی مونده.
باقی تغییرات
حالا بریم سراغ بقیه تغییرات جذاب:
پرچم strict برای ()map
حالا تابع ()map یه پرچم جدید به اسم strict داره. این پرچم بررسی میکنه که همهی iterableها طول یکسان داشته باشن.
تشخیص استفاده اشتباه از await
حالا حتی اگه کدتون با فلگ -O بهینهسازی شده باشه، استفاده اشتباه از await شناسایی میشه. مثلاً این کد الان خطا میده:
python -O -c 'assert await 1' # SyntaxError: invalid syntax
حفاظت از debug
اگه بخواید به طور اشتباه توی کد به __debug__ مقدار بدید، حتی تو حالت -O هم جلوتون گرفته میشه.
قوانین جدید برای محاسبات real و complex
قوانین محاسبات ترکیبی real و complex، بر اساس استانداردهای C99 حالا تو پایتون پیادهسازی شدن.
پشتیبانی از همه کدپیجهای ویندوز
دیگه همه کدپیجهای ویندوز (مثل cpXXX) به طور کامل پشتیبانی میشن. این یعنی آزادی بیشتر برای کار با متون خاص.
pickle کردن super
از این به بعد میتونید اشیای super رو pickle یا کپی کنید.
تغییرات regex
الان \B توی regex میتونه رشته خالی رو هم مچ کنه و همیشه مخالف \b باشه.
تغییرات macOS و iOS
حالا میتونید خروجیهای stdout و stderr رو توی system log اپهای macOS و iOS بفرستید. جذابه مگه نه؟!
استریم خروجی تست در iOS
تستبِد iOS حالا میتونه خروجی تستها رو همزمان با اجرای تست استریم کنه. حتی میتونید ازش برای تست پروژههایی غیر از CPython هم استفاده کنید.
ماژول جدید
برای بررسی و واکاوی حاشیهنویسیها (annotations) استفاده میشه. برای جزئیات بیشتر، PEP 749 رو ببینید.
ماژولهای بهبودیافته
- argparse
- ast
- calendar
- concurrent.futures
- ctypes
- datetime
- decimal
- dis
- errno
- fractions
- functools
- getopt
- http
- inspect
- io
- json
- mimetypes
- multiprocessing
- operator
- os
- pathlib
- pdb
- pickle
- platform
- pydoc
- ssl
- symtable
- sys
- sys.monitoring
- threading
- tkinter
- unicodedata
- unittest
- urllib
- uuid
- zipinfo
ماژولهای بهینه سازی شده
- asyncio
- base64
- io
- uuid
منسوخ شده
argparse
: استفاده از آرگومان کلیدی مستند نشدهی prefix_chars توی تابع ()add_argument_group دیگه منسوخ شده. نوع argparse.FileType هم منسوخ شده. مدیریت منابع باید بعد از اینکه آرگومانها تجزیه شدن انجام بشه.
سیستم سیاست asyncio منسوخ شده و در نسخه Python 3.16 حذف میشود. این شامل کلاسها و توابع زیر است:
asyncio.AbstractEventLoopPolicy asyncio.DefaultEventLoopPolicy asyncio.WindowsSelectorEventLoopPolicy asyncio.WindowsProactorEventLoopPolicy asyncio.get_event_loop_policy() asyncio.set_event_loop_policy() asyncio.set_event_loop()
بهتره از ()asyncio.run یا asyncio.Runner با loop_factory برای انتخاب نوع لوپ مورد نظر استفاده کنید.
asyncio
: استفاده از ()asyncio.iscoroutinefunction منسوخ شده و در نسخه Python 3.16 حذف خواهد شد. به جای آن از ()inspect.iscoroutinefunction استفاده کنید.
builtins
: دیگه نمیشه عدد مختلط (complex number) رو به عنوان آرگومانهای real یا imag به سازندهی ()complex پاس داد. باید بهصورت یه آرگومان واحد فرستاده بشه.
functools
: اگه توی ()functools.reduce از function یا sequence به عنوان آرگومان کلیدی استفاده میکنید، بدونید که دیگه منسوخ شده.
os
: استفاده از توابع ()os.popen و *os.spawn دیگه پیشنهاد نمیشه. برای کد جدید بهتره از ماژول subprocess استفاده کنید.
symtable
: متد ()symtable.Class.get_methods هم به دلیل کمبود استفاده، منسوخ شده.
urllib.parse
: توی توابع ()parse_qsl و ()parse_qs، دیگه نمیشه از اشیایی با مقادیر False (مثل 0 و []) استفاده کرد. فقط رشتههای خالی، بایتها و None قبول میشن.
حذف شدهها
argparse
حذف پارامترهای type، choices و metavar از argparse.BooleanOptionalAction. اینها از نسخه 3.12 به بعد منسوخ شده بودند. فراخوانی ()add_argument_group در یک گروه آرگومان، یا فراخوانی add_argument_group() یا ()add_mutually_exclusive_group در یک گروه متقابل اکنون استثنا ایجاد میکند. این ویژگیها از نسخه 3.11 به بعد منسوخ شده بودند.
ast
حذف کلاسهای ast.Bytes، ast.Ellipsis، ast.NameConstant، ast.Num و ast.Str که از نسخه 3.8 منسوخ شده بودند. به جای آنها باید از ast.Constant استفاده کرد.
asyncio
حذف کلاسها و توابع مرتبط با asyncio که از نسخه 3.12 به بعد منسوخ شده بودند، از جمله ()asyncio.get_child_watcher و ()asyncio.set_child_watcher. حذف ایجاد ضمنی حلقه رویداد با ()asyncio.get_event_loop. اکنون اگر حلقه رویداد جاری وجود نداشته باشد، RuntimeError ایجاد میشود.
collections.abc
حذف collections.abc.ByteString که از نسخه 3.12 به بعد منسوخ شده بود.
حذف پارامتر isdst از ()email.utils.localtime.
importlib
حذف کلاسهای منسوخشده importlib.abc.ResourceReader و importlib.abc.Traversable، که باید به importlib.resources.abc تغییر پیدا کنند.
itertools
حذف پشتیبانی از عملیات کپی، deepcopy و pickle در itertools.
pathlib
حذف پشتیبانی از ارسال آرگومانهای اضافی به pathlib.Path.
pkgutil
حذف ()pkgutil.get_loader و ()pkgutil.find_loader که از نسخه 3.12 به بعد منسوخ شده بودند.
pty
حذف ()pty.master_open و ()pty.slave_open. باید از ()pty.openpty به جای آنها استفاده کرد.
sqlite3
حذف version و version_info از sqlite3. ممنوع بودن استفاده از یک دنباله پارامترها با نامهای جایگزین در sqlite3، که در نسخههای قبلی باعث ایجاد هشدار میشد.
typing
حذف typing.ByteString که از نسخه 3.12 به بعد منسوخ شده بود.
urllib
حذف کلاسهای منسوخشده Quoter از urllib.parse و URLopener و FancyURLopener از urllib.request.
جذابترین فیچر اضافه شده
شاید یکی از جذابترین چیزهایی که به پایتون داره اضافه میشه استفاده از حروف یونانیه.
from math import pi as π def circumference(radius: float) -> float: return 2 * π * radius print(circumference(6378.137)) # 40075.016685578485
حرف آخر
به صورت کامل سعی کردیم به تغییرات نسخه پایتون ۳.۱۴ بپردازیم. اگه پیشنهادی دارید یا حس میکنید چیزی از قلم افتاده حتما برامون کامنت بزارید.