Python 3.8

Python 3.8.0 (סופית) שוחררה ב-14 באוקטובר 2019. התכונות עבור 3.8 מוגדרות ב-PEP 569 ותיאור מפורט של השינויים ניתן למצוא ב-What’s New in Python 3.8.

תכונות

סטטוס

PEP 570

ארגומנטים מיקומיים-בלבד

PEP 572

ביטויי השמה

הושלם

PEP 574

פרוטוקול Pickle 5 עם נתונים מחוץ-לתחום (out-of-band)

PEP 578

ווי ביקורת בזמן ריצה (Runtime audit hooks)

PEP 587

תצורת אתחול של Python

PEP 590

Vectorcall: פרוטוקול קריאה מהיר ל-CPython

שונות

f-strings תומכות ב-= לביטויים מתעדים-עצמית ולניפוי באגים

הושלם

שינויים נוספים בשפה:

הצהרת continue הייתה אסורה בסעיף finally בשל בעיה במימוש. ב-Python 3.8 הגבלה זו הוסרה

הושלם

לטיפוסים bool, int ו-fractions.Fraction יש כעת מתודה as_integer_ratio() כמו זו הקיימת ב-float וב-decimal.Decimal

הבנאים של int, float ו-complex ישתמשו כעת במתודה המיוחדת __index__(), אם היא זמינה והמתודה המתאימה __int__(), __float__() או __complex__() אינה זמינה

נוספה תמיכה ב-escapes מסוג N{name} בביטויים רגולריים

Dict ו-dictviews ניתנים כעת לאיטרציה בסדר הכנסה הפוך באמצעות reversed()

התחביר המותר עבור שמות מילות מפתח בקריאות לפונקציות הוגבל עוד יותר. בפרט, f((keyword)=arg) אינו מותר עוד

פריקה (unpacking) כללית של איטרבילים בהצהרות yield ו-return אינה דורשת עוד סוגריים עוטפים

כאשר חסר פסיק בקוד כגון [(10, 20) (30, 40)], המהדר מציג SyntaxWarning עם הצעה מועילה

פעולות אריתמטיות בין תת-מחלקות של datetime.date או datetime.datetime לבין אובייקטי datetime.timedelta מחזירות כעת מופע של תת-המחלקה, ולא של מחלקת הבסיס

כאשר מפרש Python נקטע על ידי Ctrl-C (SIGINT) וחריגת ה-KeyboardInterrupt הנובעת מכך אינה נתפסת, תהליך Python יוצא כעת באמצעות אות SIGINT או עם קוד היציאה הנכון כך שהתהליך הקורא יכול לזהות שהוא מת עקב Ctrl-C

כמה סגנונות תכנות מתקדמים דורשים עדכון של אובייקט types.CodeType עבור פונקציה קיימת

עבור מספרים שלמים, הצורה בעלת שלושת הארגומנטים של הפונקציה pow() מתירה כעת למעריך להיות שלילי במקרה שבו הבסיס זר יחסית למודולוס

השמות dict (dict comprehensions) סונכרנו עם ליטרלי dict כך שהמפתח מחושב ראשון והערך שני

המתודה object.__reduce__() יכולה כעת להחזיר tuple באורך של שניים עד שישה איברים

שינויים במודולים מובנים:

asyncio

asyncio.run() עברה מ-API זמני ל-API יציב

הושלם

הרצת python -m asyncio מפעילה REPL אסינכרוני מקורי

החריגה asyncio.CancelledError יורשת כעת מ-BaseException ולא מ-Exception ואינה יורשת עוד מ-concurrent.futures.CancelledError

הושלם

נוספה asyncio.Task.get_coro() לקבלת ה-coroutine העטוף בתוך asyncio.Task

ניתן כעת לתת שמות למשימות asyncio, על ידי העברת ארגומנט מילת המפתח name ל-asyncio.create_task() או למתודת לולאת האירועים create_task(), או על ידי קריאה למתודה set_name() על אובייקט המשימה

נוספה תמיכה ב-Happy Eyeballs ל-asyncio.loop.create_connection(). כדי לציין את ההתנהגות, נוספו שני פרמטרים חדשים: happy_eyeballs_delay ו-interleave.

gc

get_objects() יכולה כעת לקבל פרמטר generation אופציונלי המציין דור שממנו לקבל אובייקטים. (שימו לב, עם זאת, שלמרות ש-gc היא מובנית, get_objects() אינה ממומשת ב-MicroPython)

math

נוספה פונקציה חדשה math.dist() לחישוב מרחק אוקלידי בין שתי נקודות

הורחבה הפונקציה math.hypot() לטיפול במספר ממדים

נוספה פונקציה חדשה, math.prod(), כפונקציה אנלוגית ל-sum() המחזירה את המכפלה של ערך ”start“ (ברירת מחדל: 1) כפול איטרביל של מספרים

נוספו שתי פונקציות קומבינטוריות חדשות math.perm() ו-math.comb()

נוספה פונקציה חדשה math.isqrt() לחישוב שורשים ריבועיים שלמים מדויקים ללא המרה לנקודה צפה

הפונקציה math.factorial() אינה מקבלת עוד ארגומנטים שאינם דמויי-int

הושלם

sys

נוספה פונקציה חדשה sys.unraisablehook() שניתן לדרוס כדי לשלוט כיצד מטופלות ”חריגות שאינן ניתנות להעלאה“