- เพิ่มความสามารถในการอ่าน: ด้วย type hints ทำให้ชนิดของตัวแปรและฟังก์ชันถูกระบุอย่างชัดเจน จึงช่วยให้นักพัฒนาคนอื่นเข้าใจโค้ดได้ง่ายขึ้น
- การตรวจพบบั๊กตั้งแต่เนิ่นๆ: โดยใช้เครื่องมืออย่าง
mypyคุณสามารถตรวจจับความไม่ตรงกันของชนิดข้อมูลได้ก่อนการรันโค้ด - เพิ่มประสิทธิภาพในการพัฒนา: เมื่อทำงานร่วมกับฟังก์ชันการเติมคำอัตโนมัติของเอดิเตอร์ จะช่วยให้การเขียนโค้ดดำเนินไปอย่างราบรื่นยิ่งขึ้น
目次
2. วิธีเขียน Type Hint ขั้นพื้นฐาน
Type Hint เป็นฟีเจอร์ที่ถูกเพิ่มอย่างเป็นทางการตั้งแต่ Python 3.5 ทำให้สามารถระบุชนิดข้อมูลในโค้ดได้อย่างชัดเจน ซึ่งช่วยให้นักพัฒนาทำความเข้าใจพฤติกรรมของโค้ดได้ชัดเจนยิ่งขึ้นวิธีใส่ Type Hint ให้กับตัวแปร
การใส่ Type Hint ให้ตัวแปรทำได้ไม่ยาก เพียงระบุชนิดข้อมูลต่อท้ายชื่อตัวแปรดังตัวอย่างต่อไปนี้x: int = 10
y: float = 3.14
name: str = "John"Type Hint สำหรับอาร์กิวเมนต์และค่าที่คืนกลับของฟังก์ชัน
ในฟังก์ชัน เราสามารถใส่ Type Hint ให้กับอาร์กิวเมนต์และค่าที่คืนกลับได้เช่นกัน ตัวอย่างเช่น ฟังก์ชันด้านล่างระบุไว้อย่างชัดเจนว่าอาร์กิวเมนต์aเป็นชนิดint และค่าที่คืนกลับเป็นชนิดstrdef greet(age: int) -> str:
return f"Your age is {age}"Type Hint ไม่ส่งผลต่อการทำงานขณะรันไทม์ แต่ช่วยให้อ่านโค้ดได้ง่ายขึ้น และเมื่อทำงานร่วมกับระบบเติมโค้ดอัตโนมัติของเอดิเตอร์ก็จะช่วยเพิ่มประสิทธิภาพการพัฒนา
Ad
3. การใช้งานโมดูล typing
โมดูล typing ของ Python ใช้เพื่อแสดงชนิดข้อมูลที่ซับซ้อนมากขึ้น ต่อไปนี้คือชนิดข้อมูลที่นิยมใช้กันทั่วไปบางส่วนตัวอย่างการใช้งานชนิดข้อมูล List
หากต้องการกำหนดชนิดให้กับลิสต์ ให้ใช้ List ตัวอย่างต่อไปนี้แสดงลิสต์ของชนิด int:from typing import List
numbers: List[int] = [1, 2, 3, 4, 5]ตั้งแต่ Python 3.9 ขึ้นไป สามารถใช้ list แทน List ได้numbers: list[int] = [1, 2, 3, 4, 5]การใช้งานชนิดข้อมูล Dict
ชนิดดิกชันนารีก็สามารถใส่ type hint ได้เช่นกัน ตัวอย่างต่อไปนี้คือดิกชันนารีที่คีย์เป็น str และค่ามีชนิด int:from typing import Dict
inventory: Dict[str, int] = {"apple": 10, "banana": 5}การใช้ Union
เมื่อมีความเป็นไปได้ว่าจะมีหลายชนิด ให้ใช้ Union ตัวอย่างด้านล่างแสดงว่าพารามิเตอร์อาจเป็นชนิด str หรือ int:from typing import Union
def process(value: Union[int, str]) -> None:
if isinstance(value, int):
print(f"Integer: {value}")
else:
print(f"String: {value}")ดังนั้น การใช้โมดูล typing ช่วยให้ใส่ type hint ได้ยืดหยุ่นและเข้าใจง่ายยิ่งขึ้น4. ตัวอย่างการใช้ type hint ขั้นสูง
Type hint รองรับโครงสร้างข้อมูลและฟังก์ชันที่ซับซ้อนมากขึ้นด้วย ในที่นี้เราจะแนะนำฟังก์ชันที่มีค่าที่ส่งกลับหลายค่าและวิธีสร้างชนิดแบบกำหนดเองการระบุชนิดของค่าที่ส่งกลับหลายค่า
เมื่อฟังก์ชันส่งกลับหลายค่า ให้ใช้tuple เพื่อระบุชนิดของค่าที่ส่งกลับdef get_coordinates() -> tuple[float, float]:
return 35.6895, 139.6917การทำเช่นนี้ช่วยระบุชนิดของค่าที่ส่งกลับอย่างชัดเจน และเพิ่มความอ่านง่ายของโค้ดการกำหนดชนิดแบบกำหนดเอง
การใช้NewType จะช่วยให้สามารถสร้างชนิดแบบกำหนดเองได้ ตัวอย่างเช่น ในตัวอย่างต่อไปนี้ได้กำหนดชนิดใหม่ที่ชื่อว่า UserIdfrom typing import NewType
UserId = NewType('UserId', int)
def get_user(user_id: UserId) -> str:
return f"User ID is {user_id}"การกำหนดชนิดแบบกำหนดเองช่วยให้ความหมายของโค้ดชัดเจนขึ้น และสื่อเจตนาได้ง่ายขึ้นAd
5. วิธีใช้เครื่องมือตรวจสอบชนิดข้อมูล
นอกจากการใช้ type hint แล้ว การใช้เครื่องมือตรวจสอบชนิดแบบสถิตจะช่วยให้เขียนโค้ดที่เชื่อถือได้มากขึ้น เครื่องมือที่นิยมได้แก่mypyและPylance。mypy การติดตั้งและการใช้งาน
mypy เป็นหนึ่งในเครื่องมือตรวจสอบชนิด โดยจะตรวจสอบข้อผิดพลาดตาม type hint ที่อยู่ในโค้ด Python ก่อนอื่นให้ติดตั้งก่อน。pip install mypyจากนั้นให้รันการตรวจสอบชนิดmypy script.pyด้วยวิธีนี้ หากมีความไม่สอดคล้องของชนิดข้อมูลหรือมีปัญหา จะมีการแจ้งเตือนPylance สำหรับการตรวจสอบชนิดแบบเรียลไทม์
ส่วนขยายของ VSCode อย่างPylance รองรับการตรวจสอบชนิดแบบเรียลไทม์ ตัวอย่างเช่น จะมีการแสดงข้อความข้อผิดพลาดในตัวแก้ไขตาม type hint และสามารถแก้ไขปัญหาได้ทันทีdef add_numbers(a: int, b: int) -> str:
return a + b # ตรงนี้จะแสดงข้อผิดพลาดและแนะนำให้แก้ไขเนื่องจากสามารถตรวจสอบข้อผิดพลาดแบบเรียลไทม์ได้ ความเร็วในการพัฒนาจึงเพิ่มขึ้น และช่วยป้องกันบั๊กได้ตั้งแต่เนิ่นๆ6. การใช้ไทป์ฮินต์ในโปรเจ็กต์จริง
ไทป์ฮินต์มีประโยชน์อย่างยิ่งในโปรเจ็กต์จริงด้วยเช่นกัน ที่นี่เราจะแนะนำตัวอย่างการใช้งานจริงในโปรเจ็กต์ความสำคัญของไทป์ฮินต์ในการพัฒนาทีม
ไทป์ฮินต์มีประสิทธิภาพอย่างยิ่งในงานพัฒนาทีมและโปรเจ็กต์โอเพ่นซอร์ส ตัวอย่างโค้ดด้านล่างเป็นฟังก์ชันที่ดึงข้อมูลจาก API แล้วนำไปประมวลผลfrom typing import Dict, Any
def fetch_data() -> Dict[str, Any]:
return {"status": 200, "data": {"user": "Alice", "age": 30}}ดังที่เห็น เมื่อใช้ไทป์ฮินต์เพื่อทำให้โครงสร้างข้อมูลชัดเจนขึ้น นักพัฒนาคนอื่นๆ จะเข้าใจโค้ดได้ง่ายขึ้นการตรวจสอบความถูกต้องโดยใช้ไทป์ฮินต์
ไทป์ฮินต์ยังช่วยในการตรวจสอบความถูกต้องของข้อมูลด้วย ฟังก์ชันด้านล่างตรวจสอบว่าองค์ประกอบทุกตัวของลิสต์เป็นสตริงfrom typing import List
def validate_strings(values: List[str]) -> bool:
return all(isinstance(v, str) for v in values)การใช้ไทป์ฮินต์ช่วยเพิ่มความถูกต้องของโค้ดและป้องกันบั๊กได้ตั้งแต่เนิ่นๆความสะดวกในการรีแฟกเตอร์โดยใช้ไทป์ฮินต์
การใช้ไทป์ฮินต์มีประโยชน์มากในช่วงรีแฟกเตอร์โค้ด รีแฟกเตอร์คือการปรับปรุงโค้ดโดยไม่เปลี่ยนการทำงานของโปรแกรม โดยเฉพาะเมื่อเป็นฟังก์ชันที่มีอาร์กิวเมนต์หรือค่าที่ส่งกลับจำนวนมาก หรือจัดการกับโครงสร้างข้อมูลที่ซับซ้อน ไทป์ฮินต์จะเป็นแนวทางช่วยป้องกันความผิดพลาด ตัวอย่างเช่น มาดูโค้ดต่อไปนี้def process_data(data: dict) -> None:
# เนื้อหาการประมวลผล
passโค้ดนี้เป็นฟังก์ชันที่รับดิกชันนารีแบบง่ายเท่านั้น แต่หากโครงสร้างข้อมูลซับซ้อนขึ้น หรืออาจได้รับข้อมูลคนละชนิด ก็มีความเสี่ยงที่จะทำการเปลี่ยนแปลงผิดพลาดระหว่างการรีแฟกเตอร์ การระบุชนิดให้ชัดเจนด้วยไทป์ฮินต์ดังต่อไปนี้ จะช่วยให้สามารถรีแฟกเตอร์ได้อย่างปลอดภัยแม้มีการเปลี่ยนแปลงโค้ดfrom typing import Dict, Union
def process_data(data: Dict[str, Union[str, int]]) -> None:
# เนื้อหาการประมวลผล
passในกรณีนี้ มีการกำหนดชนิดเป็น Dict[str, Union[str, int]] ดังนั้นแม้จะรีแฟกเตอร์ ระบบตรวจสอบชนิดข้อมูล (เช่น mypy) จะช่วยตรวจพบข้อผิดพลาดล่วงหน้าและป้องกันบั๊กที่ไม่คาดคิดได้Ad
7. สรุป
type hint ของ Python เป็นเครื่องมือที่ทรงพลังมาก โดยเฉพาะอย่างยิ่งในโปรเจ็กต์ขนาดใหญ่และการพัฒนาของทีม ช่วยเพิ่มความสามารถในการอ่านและการบำรุงรักษา การใช้ประโยชน์จาก type hint ช่วยป้องกันบั๊กตั้งแต่เนิ่นๆ และยกระดับคุณภาพของโค้ด นอกจากนี้ การใช้เครื่องมือตรวจสอบชนิดแบบสถิตอย่างmypyและPylanceจะช่วยตรวจจับข้อผิดพลาดของชนิดล่วงหน้าในกระบวนการพัฒนา และแก้ไขได้อย่างมีประสิทธิภาพ。 โดยเฉพาะอย่างยิ่ง type hint มีประโยชน์ในด้านต่อไปนี้。- เพิ่มความสามารถในการอ่านของโค้ด ทำให้นักพัฒนาคนอื่นเข้าใจได้รวดเร็วยิ่งขึ้น。
- สามารถทำรีแฟกเตอร์ได้อย่างปลอดภัย จึงคงคุณภาพของโค้ดไว้ได้เมื่อโปรเจ็กต์ดำเนินไป。
- ด้วยการใช้ประโยชน์จากเครื่องมือตรวจสอบชนิดแบบสถิต สามารถค้นพบและแก้ไขข้อผิดพลาดได้ตั้งแต่เนิ่นๆ。



