2012/6/22 Shai Berger <[email protected]>

> On Thursday 21 June 2012, Daniel Vim wrote:
> > אני רוצה להעלות את הדעה
> > ש@property<http://docs.python.org/library/functions.html#property>
> > יכול
> > לייצור בלבול כאשר משתמשים בו בקוד שאמור להעשות בו שימוש על ידי צד שלישי
> > כlibrary ועדיף להמנע ממנו.
> >
> > הבעיות מתחלקות לשתיים:
> > 1. המשתמש לא מבין שמדובר למעשה ב method וכתוצאה עלול לעשות שימוש לא יעיל
> > (קחו דוגמה לא קיצונית שנעשית בכל גישה עבודה בסיבוכיות של O(n) z).
> > 2. המשתמש עלול לטעות לחשוב שהספרייה עושה עבודה לא יעילה לשווא (חישובים או
> > שימוש במשאבים לפני שהיה צורך אמיתי כדי לאתחל מה שנראה כproperty סטנדרטי).
> >
> > מה אתם חושבים?
> >
> ...שכללים מוחלטים כאלה מנוגדים לרוחה של פייתון ולתפיסת ה־consenting adults
> שמנחה אותה.
>
> כן, ליצור ממשקים קלים עבור פעולות כבדות זה בד״כ לא מומלץ. אבל יש הרבה מקרים
> שבהם ה־property הוא קל – מבצע בדיקות תקינות על השמה, למשל, או auditing של
> קריאה, וכדומה.
>
> אם אתה כבר בעניין הזה אז כדאי לזכור ש־property הוא לא הדרך היחידה בפייתון
> לגרום לקוד שלך להיקרא כאשר המשתמש כותב קוד שנראה כמו גישה פשוטה לאיבר.
> קיימות
> גם „מתודות הקסם” __getattr__ (ל־class־ים ישנים) ו־__getattribute__
> (לחדשים),
> וכן פרוטוקול ה־descriptor ש־property הוא רק מקרה פרטי שלו.
>
>
מה שאמרו חברי המלומדים למעלה...

אני רוצה לנצל הזדמנות זו כדי להזכיר את המקרה שבו מספיק לבצע את החישוב פעם
אחת, ורוצים שאח"כ החבר יהפוך להיות attribute רגיל. נראה לי שזה שימושי אפילו
יותר מ- property "רגיל", אבל משום מה לא נמצא בספריה הסטנדרטית (שלא לדבר על
builtins...). מצד שני, אנשים שונים כותבים לעצמם cached_property - במימושים
כמעט זהים:

1. אצלנו בויקי: http://wiki.python.org.il/Code_Snippets_en

2. בספריה של רם רחום:
https://github.com/cool-RR/python_toolbox/blob/master/python_toolbox/caching/cached_property.py

3. ואפילו בקוד של Werkzeug אפשר למצוא :
https://github.com/mitsuhiko/werkzeug/blob/master/werkzeug/utils.py

(אם תחפשו ברשת תתקלו בעוד מימושים - חלקם (רובם?) ממומשים בצורה מסובכת ו/או
לא יעילה).
למעשה, התחושה שלי היא שכאשר נתקלים בטיפוס עם קונסטרקטור גדול ומסובך, שקורא
לכל מיני פונקציות init, בד"כ ניתן לפשט את הקוד (ובמקרים מסוימים גם ליעל
אותו) ע"י חישוב lazy בעזרת cprops מסוג זה.

אולי הגיע הזמן להכניס את זה לספריה הסטנדרטית?
מישהו מתנדב לכתוב ל- python-devel? או אולי PEP?

עא
_______________________________________________
Python-il mailing list
[email protected]
http://hamakor.org.il/cgi-bin/mailman/listinfo/python-il

לענות