א. בשלושת הפונקציות, אתה בודק האם האובייקט ריק (כל הif בקוד, כולם). זה מיותר, אתה יכול ישירות לבצע את הפעולה, אם הוא ריק תהיה תוצאה ריקה ואפס סיבובים בלולאה
ב. בפונקציה filter_templates אתה משתמש בלולאת for אלגנטית. בשני הפונקציות האחרות אתה משתמש בwhile, אתה יכול להשתמש באותה לולאת for
ג. בפונקציה filter_templates אתה אוסף את התוצאות לתוך מערך (או list לא יודע איך קוראים לזה בפייתון)
אתה יכול להשתמש עם yield, זה פשוט מזין כל תוצאה בתורה ללולאת for שאתה כותב בפונקציה הקוראת
דוגמה לקוד של filter_templates אחרי התיקונים הנ"ל:
def filter_templates(string): parsed = mwparserfromhell.parse(string) for template in parsed.filter_templates(parsed.RECURSE_OTHERS): template_str = "".join([str(param) for param in template.params]) yield [str(template), template.name.strip(), template_str]כמו"כ כדאי להשתמש עם אובייקטים במקום מערך בתוצאה, משהו כזה:
def filter_templates(string): parsed = mwparserfromhell.parse(string) for template in parsed.filter_templates(parsed.RECURSE_OTHERS): template_str = "".join(map(str, template.params)) yield { "template": str(template), "name": template.name.strip(), "template_str": template_str, }ובקוד המשתמש צריך לפנות לi["name"] במקום למיקום מספרי.
לגופה של לוגיקה אני אל יודע בדיוק אם הקוד עושה מה שצריך, זה אתה יכול לבדוק יותר טוב ממני.