source code ที่ดี ไม่ใช่แค่ทำงานลื่นไหล ไม่ติดขัด แต่ยังต้องเขียนให้คนอื่นอ่านรู้เรื่อง เข้าใจง่ายๆ ด้วย ไม่อย่างนั้นก็ถือว่าเป็น spaghetti code ที่แก้ทีก็ลำบากที กว่าจะเข้าใจว่าต้องปรับอะไรตรงไหน

blog นี้เลยอยากจะเล่าถึงสองสิ่งง่ายๆ ที่เราทำได้ทันที เพื่อให้ code มีคุณภาพมากขึ้นฮะ ตามที่หลายๆ คนเคยได้ยินจากคนรู้จักหรือ blog อื่นๆ ว่า ถ้าเราทำให้ code มันอธิบายตัวมันเองได้ ก็จะทุ่นเวลาเขียน document ไปเยอะทีเดียวเชียว


Variable type annotation

ทุกคนน่าจะเขียน function และ control flow structure กันเป็นอยู่แล้วเนอะ ทีนี้ Variable type annotation หรือเรียกอีกอย่างว่า "Type hints" เนี่ยมีส่วนช่วยเราเวลาเขียนพวกนั้นว่าตัวแปรที่เราจะใช้มันมี type เป็นอะไร จะได้เก็ทง่ายขึ้น แล้วเขียนได้ไวขึ้นนั้นเองฮะ

Type annotation มีเขียนไว้ใน PEP (Python Enhancement Proposals) ซึ่งเป็น guideline เพื่อเขียน Python ได้อย่างมีประสิทธิภาพ และคุณภาพฮะ

PEP 526 – Syntax for Variable Annotations | peps.python.org
Python Enhancement Proposals (PEPs)

Type annotation เนี่ย ไม่มีผลอะไรกับการ run program เลยนะ เขียนไปก็ไม่ช่วยให้ program run ผ่าน ไร้ bug แต่ประการใด แต่มันช่วยให้ developer ทำงานง่ายขึ้น เพราะเขียนไปแล้วว่าตรงนี้ใช้งานแบบไหน ไม่ต้องเสียเวลามาบอกกล่าวซ้ำซากฮะ

สมมติว่าเรามี function ตัวนึง ทีรับ argument สองตัว คือ num และ text อ่านแค่ชื่อก็เดาได้แล้วใช่มั้ยฮะว่า มันจะต้องเป็น integer กับ string แน่ๆ แค่นี้หมูๆ

แต่ถ้าเกิดว่า มันมี argument แปะชื่อว่า unit ขึ้นมาล่ะ เอ มันควรเป็นอะไรดีนะ integer ก็ได้เพราะ unit หมายถึงจำนวนหน่วย คิดอีกที เป็น string ก็ได้อีก อย่างเช่น "centimetre" หรือ "boxes"

ยกตัวอย่างให้เห็นภาพขึ้น ให้ encryption function มาแบบนี้

argument มีสองตัว คือ text อันนี้ string ชัดเจน แต่ offset คืออะไรอ่ะ แล้ว function นี้ส่งค่ากลับเป็นอะไร ค่อนข้างเข้าใจยากอยู่ใช่มั้ยฮะ

ไหนลองเขียนเป็นแบบนี้ซิ

แบบนี้แหละ เรียกว่า variable type annotation ทำให้อ่านเข้าใจง่ายขึ้นเยอะเลยฮะ

ทีนี้ ตอนเรากำลังเขียนเรียก function เราจะเห็น IDE มันช่วยแสดง argument ที่ function นี้ต้องการแบบนี้เลย

ไม่ใช้ type annotation
ใช้ type annotation

ต่อไปนี้ คือ ตัวอย่างการใช้ annotation ในแต่ละสถานการณ์ฮะ

Primitive types

Primitive types คือพวก int, float, bool, และ str เราใช้พวกนี้บ่อยสุด และเป็นพื้นฐานสุดแล้วล่ะฮะ

ก็แค่เติม colon : แล้วตามด้วย variable type ส่วน Return type ก็วางไว้หลังเครื่องหมาย  ->

Default value

บางทีเราก็ต้องการให้มันมี default value หรือค่าเริ่มต้นให้เลย กำหนดด้วยเครื่องหมาย = ฮะ

ตัวแปรนี้มีหลาย type

ถ้าใช้ python 3.10 อยู่สามารถเขียน type แล้วคั่นด้วย pipe ( | )  ได้เลยฮะ เพื่อบอกว่าตัวแปรนี้นะ สามารถเป็น type ไหนได้บ้าง

แต่ถ้า version ต่ำกว่านั้น สามารถใช้ typing.Union module แทนได้ฮะ

สำหรับ typing module เข้าไปอ่านเพิ่มเติมตามลิงก์ด้านล่างได้ฮะ

typing — Support for type hints
Source code: Lib/typing.py This module provides runtime support for type hints. For the original specification of the typing system, see PEP 484. For a simplified introduction to type hints, see PE…

Collection type

ถ้า argument เป็นพวก list, tuple, set แนวๆ นี้ เราใช้วงเล็บเหลี่ยม [] กำหนดตัวแปรข้างในได้ฮะ แบบนี้

Control flow variable

ถ้าเราจะเขียน loop แล้ว ต้องการประกาศประเภทตัวแปร เราไม่สามารถใช้ : ตอนประกาศ loop ได้นะฮะ เราต้องประกาศประเภทตัวแปรก่อน loop ฮะ หลังจากนั้น ก็จะสามารถใช้  auto-complete เติม attribute ของตัวแปรนั้นได้

unpack ก็เช่นเดียวกันฮะ unpack คือ การเขียน shorthand เพื่อแกะ collection ออกมาแล้ว assign ค่าลงตัวแปรแยกกัน เราก็ต้องประกาศประเภทตัวแปรก่อน unpack ฮะ

ตรงส่วนนี้ ผมได้ความรู้มาจาก stackoverflow อันนี้ https://stackoverflow.com/a/41641489.


Docstring

เอาล่ะ มาถึง docstring กันแล้ว

docstring เป็นเหมือนคำบรรยายใต้ function อธิบายว่า function นี้ทำอะไร รับอะไร ส่งค่าอะไรกลับไปบ้าง และมันก็ยังถูกเขียนไว้ใน PEP เหมือนกันฮะ

PEP 257 – Docstring Conventions | peps.python.org
Python Enhancement Proposals (PEPs)

ถ้าใช้ IDE สมัยใหม่ เช่น VSCode มันมี intellisense ที่ช่วยเราเติม auto-completion ให้ ผมก็อยากแนะนำ plugin สำหรับ VSCode ที่ช่วยสร้าง docstring แล้วเราก็แค่เติมที่เหลือไป แล้วก็เสร็จเลย

plugin ตัวนี้มีชื่อว่า "Docstring" ที่อๆ งี้แหละฮะ

autoDocstring - Python Docstring Generator - Visual Studio Marketplace
Extension for Visual Studio Code - Generates python docstrings automatically

พอติดตั้ง plugin แล้ว อยากจะใช้งาน ก็แค่พิมพ์ """ มันก็จะมี submenu มาให้พร้อม

หรือจะเรียกใช้ ผ่าน palette ( cmd + shift + P) ก็ได้เหมือนกันนะ

เมื่อเราเขียน docstring ให้กับ function แล้ว ตอนเราจะเรียก function นั้น แค่พิมพ์ชื่อ ตัว IDE ก็จะเด้ง popup แสดง docstring มาตามที่เราเขียนเลยฮะ สะดวก รวดเร็วดีจริงๆ

มีให้ปรับแต่งตั้งค่าที่หน้า Settings

แล้วก็มี docstring format ให้เลือกหลายแบบด้วย

ผมรวบรวม format ของ docstring มาเป็นตัวอย่างทุกแบบตามข้างล่างนี้แล้วฮะ