ווטסאפ - לינוקס, BSD, קוד פתוח ותוכנה חופשית בעברית. Whatsup - Linux, BSD, open source and free software in Hebrew

 
 
  כניסת חברים · רישום · שכחתי סיסמה  
tux the penguin
תגובה לנושא
צפיה בנושא הבא Printable version התחבר כדי לבדוק הודעות פרטיות צפיה בנושא הקודם
omriלא בפורום כעת ת.הצטרפות: 24/11/2003 · הודעות: 1148 ·
 

הודעה פורסם: 05/02/2013 - 22:06
נושא ההודעה: פרוייקט REST API ללוחות Relay שהתחלתי

שלום חברים,

כבר הרבה זמן שאני מתעסק בכל הנושא של בית חכם DIY. באוגוסט פינגווין 2011 נחשפתי לכמה הפרוייקטים הללו מושכים אנשים מהקהילה (התפתח דיון בין היושבים בהרצאה של יוני קופל לאחריה)

כבר הרבה זמן שמתבשל לי בראש פרוייקט לפתח מערכת שתהפוך את כל הנושא הזה לפשוט יותר, לפני כמה ימים התחלתי לכתוב וכבר יש מה לראות.

אתם מוזמנים לעבור על הקוד ב Github. אשמח לשמוע תגובות ורעיונות.

אם תהיה התעניינות אשקול להרצות על הנושא באוגוסט פינגווין הקרוב (רחוק)...

בברכה,
עומרי בהומי.

_________________
Sure linux is user-friendly, it's just picky about who its friends are Smile
 
 צפיה בפרופיל המשתמש שלח הודעה פרטית ביקור באתר המפרסם  
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
ik_5לא בפורום כעת ת.הצטרפות: 16/04/2002 · הודעות: 3027 · מיקום: ישראל
 

הודעה פורסם: 05/02/2013 - 22:57
נושא ההודעה:

עמרי, מספר שאלות שאשמח לקבל עליהן תשובות בנוגע לקוד (התחלתי לעבור עליו)

1. יש לך מימוש מחדש של exceptions שלא כל כך ברור לי לשם מה צריך אותם ולמה לא להשתמש באלו הקיימים ב stdlib של פיתון.

אשמח לדעת כמובן מדוע יצרת אותם.

2. יש לך המון "חילול" namespace בקוד (כלומר הכוכבית), לא ברור לי כל כך למה אתה לא מנסה לשמור על ה namespace

3. יש לך בקוד שורות של "משפט" ואז תנאי בהמשך שלו, עד כמה שאני יודע, זה לא מקובל בפיתון, אשמח לדעת אם אני טועה.

4. יש תחושה כי ישנן מחלקות שנוצרו בשביל לסמן "v" אבל אין להן שימוש אמיתי, אתה זורק exception אם מנסים להשתמש במתודות שלהן.
האם לא עדיף להימנע מלכתוב כאלו מחלקות עד שיש לך קוד לשים בהם ?

הסיבה לשאלות היא פשוטה, התחלתי ללמוד פיתון עכשיו, ואני מנסה להבין כמה שאפשר את החשיבה בשפה.
 
 צפיה בפרופיל המשתמש שלח הודעה פרטית ביקור באתר המפרסם  
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
אורח · ·
 

הודעה פורסם: 05/02/2013 - 23:31
נושא ההודעה:

1. בגדול, יש Exception "אב" - SmartHomeException, שכל שאר ה Exceptions בקוד שלי יורשים ממנו. יותר קל לי להסביר עם דוגמא:
קוד:

class MyException(Exception):
    pass

class MySubException(MyException):
    pass

try:
    raise MySubException()
except MySubException:
    print 'MySubException was caught'
except MyException:
    print 'MyException was caught'
except Exception:
    print 'Exception was caught'

try:
    raise MySubException()
except MyException:
    print 'MyException was caught'
except Exception:
    print 'Exception was caught'

try:
    raise MySubException()
except Exception:
    print 'Exception was caught'


אם תריץ את הקוד הנ"ל, אתה תראה ש ב try...except block ה exception הכי ספציפי נתפס. ככה, אם אתה רוצה לתפוס exception ספציפי בקוד אתה תתפוס את MySubException. אם כל exception שנזרק מהקוד שלי מעניין אותך, אתה תתפוס את MyException. כל השאר הם תחת Exception.

לגבי למה לא השתמשתי ב Exceptions הקיימים הסיבה היא פשוטה: אין יותר מדי כאלה. אם יש אחד שמתאים לצרכים שלי - פספסתי אותו. אשמח אם תציין זאת בפניי.
שים לב שמשהו נוסף שאני עושה בו שימוש הוא constructor שונה ל class של ה Exception בחלק מ ה Exceptions. במקום להעביר את ה error כ string ל constructor, אני מעביר פרמטרים ובונה את ההודעה בתוך המחלקה שיורשת מ Exception.

2. לא הבנתי. האם התכוונת ל import * from module ?
אם אתה מתכוון שהשימוש הנכון הוא import A,B,C from module - אתה צודק. אולי אשנה את זה בהמשך.
אם התכוונת שאני אשתמש ב import module ואז module.A אז עד כמה שידוע לי, זה לא מקובל. אני לא ראיתי הרבה קוד שמשתמש ב full class names. זה פשוט לא נוח...

3. זה ה syntax של inline if בפייתון... מקבל ל condition ? truepart : falsepart בשפות כמו C ו Java.
http://stackoverflow.com/questions/11880430/python-inline-if-statement

4. זאת הדרך שבה בחרתי לממש Abstract Classes בפייתון. מסתבר שזאת לא הדרך הנכונה. הדרך הנכונה מצויינת פה:
http://www.doughellmann.com/PyMOTW/abc/
אני כנראה אשנה את זה. תודה
 
   
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
ik_5לא בפורום כעת ת.הצטרפות: 16/04/2002 · הודעות: 3027 · מיקום: ישראל
 

הודעה פורסם: 06/02/2013 - 00:37
נושא ההודעה:

תודה על התשובה

Anonymous :
1. בגדול, יש Exception "אב" - SmartHomeException, שכל שאר ה Exceptions בקוד שלי יורשים ממנו. יותר קל לי להסביר עם דוגמא:

אם תריץ את הקוד הנ"ל, אתה תראה ש ב try...except block ה exception הכי ספציפי נתפס. ככה, אם אתה רוצה לתפוס exception ספציפי בקוד אתה תתפוס את MySubException. אם כל exception שנזרק מהקוד שלי מעניין אותך, אתה תתפוס את MyException. כל השאר הם תחת Exception.

לגבי למה לא השתמשתי ב Exceptions הקיימים הסיבה היא פשוטה: אין יותר מדי כאלה. אם יש אחד שמתאים לצרכים שלי - פספסתי אותו. אשמח אם תציין זאת בפניי.
שים לב שמשהו נוסף שאני עושה בו שימוש הוא constructor שונה ל class של ה Exception בחלק מ ה Exceptions. במקום להעביר את ה error כ string ל constructor, אני מעביר פרמטרים ובונה את ההודעה בתוך המחלקה שיורשת מ Exception.



ראיתי את הירושה, אבל הנה מספר exceptions שהיית יכול להשתמש בהם:
במקום InvalidSubclassException היית יכול להשתמש ב TypeError

במקום MethodMissingException היית יכול להשתמש ב NameError שהיה קופץ בכל מקרה.

כמו כן, יש לך את NotImplementedError בדיוק עבור מחלקות/מתודות שהן abstract.

פשוט היום התעסקתי הרבה בתעוד של הנושא, בגלל זה, זה קפץ לי לעין.

אני פשוט עצלן כמתכנת, ומעדיף לא לממש דברים שכבר מישהו עשה אותם, ואם הם כבר ב stdlib אז בכלל, מה טוב Smile

ציטוט:

2. לא הבנתי. האם התכוונת ל import * from module ?
אם אתה מתכוון שהשימוש הנכון הוא import A,B,C from module - אתה צודק. אולי אשנה את זה בהמשך.
אם התכוונת שאני אשתמש ב import module ואז module.A אז עד כמה שידוע לי, זה לא מקובל. אני לא ראיתי הרבה קוד שמשתמש ב full class names. זה פשוט לא נוח...


אני מתכוון כי עד כמה שאני הבנתי לפחות, נהוג בד"כ לעשות
קוד:
import bla


ורק כאשר יש צורך אמיתי "לחלל" את ה namespace.
בערך כמו ברעיון של ג'אווה. גם ה zen of python מדבר על זה בשורה של:
ציטוט:

Explicit is better than implicit.


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

ציטוט:

3. זה ה syntax של inline if בפייתון... מקבל ל condition ? truepart : falsepart בשפות כמו C ו Java.
http://stackoverflow.com/questions/11880430/python-inline-if-statement


פעם ראשונה שראיתי קוד פיתון אשר משתמש בהם, ולא ידעתי שהם קיימות, או אם זה מקובל בכלל. נחמד לראות גישה של ternary שונה Smile

ציטוט:

4. זאת הדרך שבה בחרתי לממש Abstract Classes בפייתון. מסתבר שזאת לא הדרך הנכונה. הדרך הנכונה מצויינת פה:
http://www.doughellmann.com/PyMOTW/abc/
אני כנראה אשנה את זה. תודה


תודה לך על התשובות
 
 צפיה בפרופיל המשתמש שלח הודעה פרטית ביקור באתר המפרסם  
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
mksoftלא בפורום כעתSite Admin ת.הצטרפות: 17/03/2002 · הודעות: 10514 · מיקום: כדור הארץ
 

הודעה פורסם: 06/02/2013 - 01:28
נושא ההודעה:

אני עם עידו בנוגע ל-exceptions.

פחות אוהב את ה-if שיש כמו כאן:
קוד:

            output_instance = output_class(
                    relays=module['relays'], **(module['module_parameters']
                        if 'module_parameters' in module else {}))


זה גורם לשורות ארוכות, ומקשה על קריאה ובהירות הקוד. אני מעדיף משהו כמו:

קוד:
params = {'relays': module['relays']}
if 'module_parameters' in module:
     params.update(module[''module_parameters''])
output_instance = output_class(**params)


או החביב עלי יותר:
קוד:
params = {'relays': module['relays']}
params.update(module.get('module_parameters', {}))
output_instance = output_class(**params)



גם משהו כזה פחות אהוב עלי, מעדיף פחןת else ןפחות nesting:

קוד:
    if not hasattr(lib.input, module['module']):
        print >>sys.stderr, 'Unable to find module %r' % (module['module'])
        sys.exit(1)
    else:
        input_class = getattr(lib.input, module['module'])
        input_instance = input_class(
                output_container=output_container,
                **(module['module_parameters']
                    if 'module_parameters' in module else {}))
        input_instance.run()


אני מעדיף:
קוד:
input_class = getattr(lib.input, module['module'], None)
if not input_class:
    sys.exit('Unable to find module %r' % module['module'])

input_instance = input_class(
...

_________________
הבלוג שלי
 
 צפיה בפרופיל המשתמש שלח הודעה פרטית שלח דוא\ ביקור באתר המפרסם  
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
omriלא בפורום כעת ת.הצטרפות: 24/11/2003 · הודעות: 1148 ·
 

הודעה פורסם: 06/02/2013 - 09:14
נושא ההודעה:

תודה לשניכם על ה code review Smile
חשוב לעשות את השינויים האלה כשהקוד עוד בחיתולים...

בנוגע למה שכתבתם:

1. אשנה את ה Exceptions (לפחות אלה שעידו ציין)

2. בנוגע ל if nesting. אני גם פעם חשבתי כמוך מאיר בנוגע לקטע של אם עושים sys.exit() או return אין צורך ב else, אבל היום אני חושב שזה יותר קריא ככה.
בנוגע ל inline if, קיבלתי. לא ידעתי שיש פרמטר שלישי ל getattr() ושכחתי מקיומו של dict.get(key, default_value). זה באמת יותר מתאים פה. אני אשנה את הקוד היום

3. עידו - לגבי ה namespacing, אני חושב שעדיף להשתמש ב import X from Y ולא import X; X.Y. במיוחד כשאתה לא משתמש בשמות ג'נריים...
זו גם הדרך המקובלת עד כמה שידוע לי. מאיר?

שוב תודה,
עומרי.

_________________
Sure linux is user-friendly, it's just picky about who its friends are Smile
 
 צפיה בפרופיל המשתמש שלח הודעה פרטית ביקור באתר המפרסם  
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
הצגת הודעות מלפני:     
מעבר אל:  
כל הזמנים הם GMT + 2 שעות
תגובה לנושא
צפיה בנושא הבא Printable version התחבר כדי לבדוק הודעות פרטיות צפיה בנושא הקודם
PNphpBB2 © 2003-2004 

תוכן הדיון

  1. omri
  2. ik_5
  3. אורח
  4. ik_5
  5. mksoft
  6. omri