Dedent your multiline string

Dedent your multiline string

วันที่ 2 ของ #PythonTricksEveryday นะครับ ไหนๆ ก็เป็นวันสุดท้ายของการทำงานก่อนจะถึงวันหยุดยาว ขอแนะนำด้วย Tricks เล็กๆ ที่จะช่วยให้การทำงานกับ Multiline String เราดีขึ้นครับ

สมมติว่าเรามี String ยาวๆ ที่ต้องมี Indent สวยๆ เช่น Email หรือ Code snippet อย่างในภาพ แล้วเราต้องการนำมันไปใช้งานเช่นส่งอีเมล์หรือ Print report อะไรแบบนี้

จะเห็นว่าพอ print ค่าออกมาแล้ว string ที่เราเก็บไว้มี space ติดมาด้วย

สิ่งที่เกิดขึ้นคือ Multiline String ของ Python จะนับ tab ที่เราเว้นไว้ทางซ้ายด้วย เหมือนในฟังก์ชั่น process_something() ซึ่งถ้าเราไม่อยากให้มันเยื้องแล้ว Print ออกมาสวยๆ เราก็ต้องทิ้งเยื้องไป เหมือนในฟังก์ชั่น process_something_without_padding() ซึ่งพอเราทำแบบนี้ ผมว่าทุกคนน่าจะรู้สึกทันทีว่า เออมันเวิร์คนะแต่ Indent มั่วไปหมดเลย พ้น definition ของ function ไปอีก ยิ่งถ้าเป็น Method ที่อยู่ใน class ยิ่งไม่อยากจะคิดเลย

ถ้าจะกำจัด space ข้างหน้า string เราวิธีทั่วไปก็ทำแบบนี้ครับ

ทีนี้ถ้าเรายังอยากเก็บ Multiline String โดยที่ยังรักษา indent ของ function เราให้เป็นไปในทางเดียวกันอยู่ เราก็มีตัวเลือกหลายทางครับเช่น เอาไปเก็บแยกเป็นตัวแปรไว้ข้างนอก function ไปเลย หรือโหลดจากไฟล์อื่นเข้ามาอ่านก็ได้ แต่ผมคิดว่าการทำแบบนั้นมันเป็นแค่การเลี่ยงปัญหา ไม่ใช่การแก้ปัญหาจริงๆ

Python มีวิธีในการแก้ปัญหาเรื่องนี้ครับ โดยใน standard library ที่ติดตัวมากับภาษามี Library ตัวนึงที่ชื่อว่า textwrap เอาไว้ทำงานเกี่ยวกับเรื่องแนวนี้ ซึ่งสิ่งที่เราต้องการก็คือ method ที่ชื่อว่า dedent ครับ เมื่อเราครอบ Multiline String ด้วย textwrap.dedent() เนี่ย สิ่งที่มันทำก็คือ มันจะลบ Leading space ออกจาก string ของเราทุกบรรทัดครับ ซึ่งทำให้เรากลับมาเขียน Multiline String สวยๆ ได้แบบฟังก์ชั่น process_something_with_dedent() เลยครับ

แบบใช้ textwrap.dedent() จะเห็นว่า space ข้างหน้าถูกลบหายไป แล้วยังรักษา indent ถัดมาอยู่ด้วย

จริงๆ textwrap library นี่ยังทำอะไรได้อีกหลายอย่างเลยนะครับ สนใจก็คลิกไปอ่าน Official document ได้ที่นี่เลยครับ

textwrap — Text wrapping and filling — Python 3.7.12 documentation

Original post at: https://yothinix.medium.com/dedent-your-multiline-string-b7fc8f41b286