היום למדתי: מחיקת אינדנטציה בפייתון
אחד הסימנים האהובים עליי ברובי הוא ~ בשימוש שלו בכתיבת מחרוזות מרובות שורות. הוא גורם לרובי למחוק את הרווחים שבאים בתחילת כל שורה במחרוזת וכך אנחנו יכולים לשים אינדנטציה בקוד שלא משפיעה על תוכן המחרוזת. הקוד הזה ברובי:
query = <<~END
SELECT name, email
FROM users
WHERE active = true
END
puts query
מדפיס:
SELECT name, email
FROM users
WHERE active = true
אני מודה שבפייתון תקופה ארוכה פשוט וויתרתי על האינדנטציה כשכתבתי מחרוזות מרובות שורות. כן אפשר להוריד את הסוף וההתחלה עם strip אבל זה לא מה שרציתי, כלומר הקוד הזה:
query = """
SELECT name, email
FROM users
WHERE active = true
""".strip()
print(query)
מדפיס את זה:
SELECT name, email
FROM users
WHERE active = true
היום למדתי על מודול מובנה בפייתון בשם textwrap שיודע לעשות בדיוק את הטריק שאני אוהב מרובי. כך נראה קוד פייתון שמשתמש בו:
import textwrap
query = textwrap.dedent("""
SELECT name, email
FROM users
WHERE active = true
""").strip()
print(query)
והתוצאה:
SELECT name, email
FROM users
WHERE active = true
שימו לב שה strip צריך להופיע אחרי הקריאה ל dedent אחרת האינדנטציה הלא שווה מבלבלת את המודול.
בכל מקרה לא כדאי להתרגל אליו כי ממש מעבר לפינה מחכה לנו PEP822 עם תחילית d למחרוזת שמורידה אינדנטציה אוטומטית, כלומר פייתון 3.15 כבר יאפשר לנו לכתוב:
query = d"""
SELECT name, email
FROM users
WHERE active = true
"""
print(query)
ולקבל את אותו פלט. לפי התיעוד הם מורידים את האינדנטציה המשותפת לכל השורות כולל שורת הסיום (עם השלושה סימני מרכאות האחרונה) אבל לא כולל שורת הפתיחה ושורות ריקות - כך שכל עוד נקפיד שהשורה האחרונה תקבל את אותה אינדנטציה כמו כל הבלוק דברים אמורים לעבוד בסדר.
ב PEP תוכלו למצוא עוד המון דוגמאות מה יעבור ומה לא יעבוד עם הכתיב החדש: https://peps.python.org/pep-0822/