August 7, 2023

פייתון 3.12 - מה חדש


מה חדש

שגיאות ברורות יותר

פייתון 3.11 הביאה איתה שיפור בשגיאות מדויקות יותר.
פייתון 3.12 משפרת את תצוגת השגיאות גם בפן השמי.

  • טעיתם בשם המודול
  • טעיתם בשם משתנה פנימי
  • שכחתם לייבא מודול
1
2
3
4
from collections import chainmap
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: cannot import name 'chainmap' from 'collections'. Did you mean: 'ChainMap'?

תחביר חדש לפורמט מחרוזות

כמה שיפורים לשימוש בפורמט:

ניתן לכתוב כל ביטוי בתוך הסוגריים:

1
2
f"""{f'''{f'{f"{1+1}"}'}'''}"""
'2'

ניתן להשתמש בתווים מיוחדים כמו ה-backslash.

1
print(f"This is the playlist: {"\n".join(songs)}")
1
2
3
This is the playlist: Take me back to Eden
Alkaline
Ascensionism

וגם בשימוש בפורמט השגיאות השתפרו:

1
2
3
4
5
my_string = f"{x z y}" + f"{1 + 1}"
File "<stdin>", line 1
my_string = f"{x z y}" + f"{1 + 1}"
^^^
SyntaxError: invalid syntax. Perhaps you forgot a comma?

תיקון קיצור איטרציה בשימוש עם מילונים

אם אתם רוצים להשתמש במילון כדי לרוץ כעת ניתן להשתמש ב-locals() על מנת לייעל את התהליך ולהימנע משגיאות.

1
keys = list(locals()); [k for k in keys]

למידע נוסף

באפר לכל אובייקט!

באפר בפייתון הם בדרך כלל אובייקטים מסוג bytearray או bytes.

כל אובייקט יכול להתנהג כמו באפר עם מימוש 2 מתודות:

  • __buffer__
  • __release__buffer__

כדי לממש את פונקציית הבאפר יש להחזיר אובייקט מסוג memoryview.

https://docs.python.org/3.12/reference/datamodel.html#object.__buffer__

GIL - עבור כל מפרש

כל מפרש של פייתון רץ עם GIL.
במידה ויש כמה מפרשים אז כולם ייחלקו lock גלואבלי.
מה שלא מאפשר באמת הרצה של קוד מקבילי.

עבור פייתון 4 עושים מאמצים רבים כדי לשחרר את המפרש מהנועל הגלובאלי.

כרגע קיים רק קונפיגורציה לשפת C אך בפייתון 3.13 יתווסף גם קונפיגורציה בפייתון.

התנהגות חדשה ב-TypeHints

שימוש ב-unpack כאשר משתמשים ב-**kwargs:

1
2
3
4
5
6
7
from typing import TypedDict, Unpack

class Movie(TypedDict):
name: str
year: int

def foo(**kwargs: Unpack[Movie]): ...

דקורטור חדש בשם override

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from typing import override

class Cube:
def size(self) -> int:
return 0

class SixCube(Cube):
@override # ok - overrides size
def size(self) -> int:
return 6

class EightCube(Base):
@override # bad - no sizee (typo)
def sizee(self) -> int:
return 8

למה בכלל צריך את זה?
כדי לחזק את כתיבת ה-API בבדיקות שאכן אנחנו משתמשים בפונקציות הנכונות.
זו אחת המגרעות הגדולות בשפות דינאמיות - ממש חרב פיפיות.

סוג משתנה גנרי בתחביר פשוט יותר

לפני:

1
2
3
4
5
from typing import TypeAlias

_T = TypeVar("_T")

ListOrSet: TypeAlias = list[_T] | set[_T]

אחרי:

1
type ListOrSet[T] = list[T] | set[T]

השימוש במילה type תגדיר לנו את המשתנה גנרי במקום הצורך להגדיר בעזרת TypeVar בעצמנו!

ועוד כמה שיפורים

  • ביצועי רשת בasyncio השתפרו!
  • Calender - עכשיו נוסף גם Month ו -Day.
  • itertools עכשיו מאפשר להשתמש ב- itertools.batched() כדי לבצע חלוקה ל-batchים.
  • pathlib - הוספת walk כדי לרוץ על עצים.
  • tempfile.NamedTemporaryFile מאפשר הוספת פרמטר למחיקה כאשר זה נסגר
  • unittest מאפשר להשתמש ב---durations כדי להציג את הטסטים הכי איטיים.
  • שיפור ביצועים בפתיחת asyncio.Task.
  • שיפור ביצועים ב-re.sub

Change log

לכל השינויים ב-Change log

Change log


תודה על הקריאה!

על הפוסט

הפוסט נכתב על ידי Ilya, רישיון על ידי CC BY-NC-ND 4.0.

שתפו את הפוסט

Email Facebook Linkedin Print

קנו לי קפה

#Software#Python