תסריט פיתון להחלפת namespace של Boost.

ב־24.5.2009, מאת ארתיום; פורסם תחת: תכנה חופשית, פיתוח, תכנה ומחשבים, C++‎‏, Boost‏; ‏12 תגובות

הכנתי תסריט קטן שמאפשר שינוי גורף של Namespace עץ הקוד של Boost ל־Namespace חילופי כדי למנוע התנגשות בין גרסאות Boost שונות: http://art-blog.no-ip.info/files/rename.py.

הרצה: ./rename.py /path/to/boost/tree new_namespace_name

עכשיו כל ה־defineים וכל הסימבולים יימצא ב־namespace אחר ואפשר יהיה לבנות רכיבים ללא תלות בגרסת Boost.

הערות:

  1. השימוש על אחריותכם, גם אם זה יאכל לכם את החתול או יהרוס את כל הקוד במחשב שלכם.
  2. הוא עדיין די ראשוני, אבל הצלחתי לקמפל רוב הספריות החשובות ולהריץ כמה regression tests.

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

תגובות

מאיר, ב־24.5.2009, 15:18

מספר הערות מקריאה ראשונית, נקווה שתהיה ביקורת בונה:

  1. אמנם לא קשור, אך השימוש בטאבים חורג מהקונבנציה בעולם הפייתון (ויקשה גם על פאצ'ים). הנוהג הנפוץ (המוחלט ?) הוא 4 תווים לאינדנטציה.
  2. אין צורך בשימוש ב במשהו בסגנון: line=self.input.readline() while line: .... line=self.input.readline()

    מאחר והקובץ הוא כבר איטרטור. במקום מספיק:

     for line in file:
    

    זה כבר כולל גם את ה-\n האחרון בשורה בתור צ'ופר (לדעתי ניתן להשתמש בו כאן).

  3. גם הקטע הבא: for suffix in ['.hpp','.h','.ipp','.cpp','.c','.inl','inc','.SUNWCCh','.cxx','.cc' ]: if name.endswith(suffix): return True לא יעיל, מאחר וזה מבצע לולאה בכל פעם. תן ל-in שלך פייתון לעבוד עבורך. spiltted = name.rspilt('.', 1) if len(splitted > 1) and splitted[-1] in suffix: return True ומכל הכניסות ב-suffix ניתן להסיר את הנקודה.
  4. גם השימוש ב-StringIO והעברתו למחלקה מיותרים. אפשר פשוט להחזיר רשימה (ללא צורך ב-buffer כלשהו) ולכתוב לקובץ את ה-join של רשימת המחרוזות.
  5. אפשר להשתמש ב-raw string, כך ה-esacapes לא יפורשו, מה שמונע את הצורך בחזרה עליהם.

     print 'a\nb'
     a
     b
    
     print r'a\nb'
     a\nb
    

בטוח שה-markdown חרבש לי את העסק, מתנצל מראש.

ארתיום, ב־24.5.2009, 15:39

נקווה שתהיה ביקורת בונה

תודה רבה, באמת, חיכיתי לזה :)

אין צורך בשימוש ב במשהו בסגנון: line=self.input.readline()‎; while

השאלה האם אני יכול לקרוא עוד פעם readline באמצע לולאה: קרי

for line in file:
    something
    if need_next_line:
         line=file
         # do somethig with line

כלומר, האם אפשר לקרוא לאיטרטור באמצע לולאת for כדי לקדם אותו? אם כן, כיצד?

לא יעיל, מאחר וזה מבצע לולאה בכל פעם

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

גם השימוש ב-StringIO והעברתו למחלקה מיותרים.

פשוט, רציתי API אחיד, כי אולי אני ארצה להשתמש ב־rename ולשמור ישר לקובץ אחר. StringIO נותן לי אבסטרקציה של ערוץ פלט כלשהו אם זה buffer בזיכרון או אם זה file. אולי אני חושב יותר מידי C++‎־י (בו הייתי משתמש ב־std::ostringstream).

אפשר להשתמש ב-raw string, כך ה-esacapes לא יפורשו, מה שמונע את הצורך בחזרה עליהם.

כן, אני יודע, פשוט ב־vim כרציתי לכתוב r'\'‎ הוא התבלבל בתחביר. כך שהחלטתי לשמור על '\', אבל כן, אני מכיר את האופציה.

אם כך, המצב שלי בפיתון לא רע ;)

טוח שה-markdown חרבש לי את העסק, מתנצל מראש.

לא נורא, סידרתי, חוץ מזה, בדיוק בשביל זה יש "תצוגה מקדימה"

בעולם הפייתון (ויקשה גם על פאצ'ים). הנוהג הנפוץ (המוחלט ?) הוא 4 תווים לאינדנטציה.

האם יש דרך להגיד ל־VIM שאם הוא עורך קובץ python אז שיהפוך את ה־tab ל־4 רווחים? כל בכל שאר המקרים אני תמיד משתמש ב־tab=8 וב־tab אמתי, כך שאני לא הייתי רוצה להשנות את כל ההגדרות רק עבור Python.

מישהו, ב־24.5.2009, 15:57

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

ארתיום, ב־24.5.2009, 16:10

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

תודה! תיקנתי.

ik_5, ב־24.5.2009, 18:31

האם יש דרך להגיד ל־VIM שאם הוא עורך קובץ python אז שיהפוך את ה־tab ל־4 רווחים? כל בכל שאר המקרים אני תמיד משתמש ב־tab=8 וב־tab אמתי, כך שאני לא הייתי רוצה להשנות את כל ההגדרות רק עבור Python.

ברור שאפשר, אתה מוזמן להסתכל ב vimrc שלי http://ik.homelinux.org/projects/files/vimrc :)

(ד"א אני שונא markdown, תמיד יש משהו שאני לא מצליח ליישם בו, הפעם קישורים)

ארתיום, ב־24.5.2009, 18:37

עידו, יש לך קישור ל־Syntax יש לך קישור לתצוגה מקדימה. אגב, פשוט שמים קישור בין סימנים "<" ו־">".

היתרון הגדול של Markdown הוא נייטרלי לכיווניות ודטרמיניסטי, בניגוד של WYSIWYG

תודה על הקישור.

ארתיום, ב־24.5.2009, 22:38

אגב, אחרי שיניתי ל־tab=4 הבנתי למה אני אוהב tab=8... כי זה פשוט הרבה יותר קריא

מאיר, ב־25.5.2009, 9:07

אל תכנס לשם, מלחמות עולם התחילו על פחות מזה. לגבי קביעת הגדרות העורך: ניתן גם להשתמש ב-modelines של vim ולהטמיע בקובץ את ההגדרות. כך גם מי שיערוך את העסק ישתמש בהגדרות הנכונות (בהנחה שזה מופעל אצלו). עורכים נוספים תומכים ב-modelines של vim. לדרכים השונים: http://wiki.python.org/moin/ViImproved%20(Vim)

לגבי raw strings, צביעת התחביר אצלי ב-vim עובדת כראוי.

לגבי הלולאה, זה לא רק עסק של יעילות, אלא גם בהירות הקוד. כאשר קוראים את הקוד זה ברור הרבה יותר מה מבקשים שם. כמו כן עדיף מאוד להשתמש ב-os.path.splitext, ואז זה בכלל ברור יותר.

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

כמו כן, אין לך בעיה לקבל את הערך הבא מהאיטרטור ע"ׁי שימוש ב-next‏: In [11]: f = open('/etc/fstab')

In [12]: f.next()
Out[12]: '# \n'

In [13]: f.next()
Out[13]: '# /etc/fstab: static file system information\n'

נ.ב. לגבי ה-markdown, כמובן שהשתמשתי ב-preview, אך לא משנה מה עשיתי, מה שהיה שם זה המיטב שהגעתי אליו, תודה על העריכה. בדוק את wmd, יכול להיות תוספת יפה למערכת (בהנחה שלא החלטת עדיין על שם חדש עבורה): http://wmd-editor.com/

ארתיום, ב־25.5.2009, 10:46

אל תכנס לשם, מלחמות עולם התחילו על פחות מזה.

אני יודע... אבל זה עדיין מגעיל.

אתה חושב יותר מדי C++. במקרה כזה

אולי אני הייתי אומר, אני חושב יותר מידי כמו Finite State Machine. אני מחקה בפענוח הטקסט את התנהגות ה־FSM.

(תנועה קדימה/אחורה בתוכן הקובץ)

זאת הנקודה, יש תנועה רק קדימה

לקרוא את הקובץ לתוך רשימת מחרוזות.

אין לי כל־כך משמעות לרשימת מחרוזות "כשורות", כי איך הולך הקוד שלי: הוא מושך tockenים אחד אחד, שכל tocken יכול להיות:

  1. הערה שמתפרסת על יותר משורה אחת
  2. מזהה שאני צריך לטפל בו כמו has_boost_foo.‏
  3. מחרוזת שגם היא מתפרסת ליותר משורה אחת.

אני צריך לעבד את כל אחד מהם בצורה שונה, כך למשל, אסור לי לשנות הערות, כי יש שם רישיון של Boost שחייב להישאר הרישיון המקורי.

למעשה, מה שאני עושה זה:

  1. מחלק את הקובץ ל־tockenים בעזרת FSM אחד
  2. מעדכן את כל ה־tockenים לפי ההקשר בעזרת FSM אחר.

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

כמו כן, אין לך בעיה לקבל את הערך הבא מהאיטרטור ע"ׁי שימוש ב-next‏:

תודה רבה, פשוט לא ידעתי...

ארתיום, ב־25.5.2009, 10:50

בדוק את wmd, יכול להיות תוספת יפה למערכת

תודה, זה בטח משהו חדש? כי בפעם האחרונה שבדקתי, לא ראיתי פתרון markdown ב־JavaScript שהוא תחת רישיון חופשי.

מאיר, ב־25.5.2009, 20:52

אז מה הבעיה, זה אפילו קל יותר, העבר את כל הקובץ בתור מחרוזת אחת (read יעשה זאת עבורך). בכל מקרה בשתי הצורות אתה מרוויח תנועה.

לגבי wmd, זה לא כל כך חדש. שים לב שהוא עדיין לא תחת רישיון חופשי, לפי האתר הגרסה הבאה אמורה להיות תחת MIT.

ארתיום, ב־25.5.2009, 21:37

לגבי wmd, זה לא כל כך חדש. שים לב שהוא עדיין לא תחת רישיון חופשי,

או קיי... אז זה באמת אחד שאני זוכר, בגלל זה לא לקחתי אותו

הוסף תגובה:

 
 כתובת דוא"ל לא תוצג
 

ניתן לכתוב תגובות עם שימוש בתחביר Markdown.

חובה לאפשר JavaScript כדי להגיב.

דפים

נושאים