ประเภทในภาษาไพธอน
บทความนี้อธิบายเกี่ยวกับประเภทในภาษาไพธอน
YouTube Video
ประเภทในภาษาไพธอน
โมดูล typing
ในภาษาไพธอนถูกใช้เพื่อเพิ่มตัวบ่งชี้ประเภท (type hints) เข้าสู่ภาษาไพธอน มันถูกแนะนำครั้งแรกใน Python 3.5 และถูกใช้เพื่อปรับปรุงความเข้าใจง่ายและความคงทนของโค้ด ตัวบ่งชี้ประเภทไม่ส่งผลต่อการรันโค้ด แต่ช่วยในการตรวจสอบประเภทด้วย IDEs และเครื่องมือวิเคราะห์แบบคงที่
พื้นฐานของตัวบ่งชี้ประเภท
ตัวบ่งชี้ประเภทช่วยให้เข้าใจเจตนาของโค้ดได้ดียิ่งขึ้นโดยการระบุประเภทของฟังก์ชันและตัวแปรอย่างชัดเจน ในตัวอย่างด้านล่าง มีการระบุประเภทสำหรับอาร์กิวเมนต์และค่าที่คืนกลับมา
1def add_numbers(a: int, b: int) -> int:
2 return a + b
3
4result: int = add_numbers(5, 10)
5print(result) # 15
ในโค้ดด้านบน ค่า a
และ b
เป็นประเภทเลขจำนวนเต็ม (int
) และค่าที่ฟังก์ชันคืนกลับมาก็ถูกระบุชัดเจนว่าเป็นเลขจำนวนเต็ม แม้จะมีตัวบ่งชี้ประเภทแล้วก็ตาม ประเภทก็ยังไม่ได้ถูกบังคับใช้อย่างเข้มงวด แต่จะมีการแสดงคำเตือนระหว่างการพัฒนา หากมีการไม่สอดคล้องของประเภท
ตัวบ่งชี้ประเภทที่สำคัญ
โมดูล typing
ในภาษาไพธอนมีคลาสและฟังก์ชันหลากหลายสำหรับการกำหนดตัวบ่งชี้ประเภท ด้านล่างนี้คือลิสต์ของตัวบ่งชี้ประเภทที่พบบ่อย
int
: ตัวเลขจำนวนเต็มstr
: สตริงfloat
: จำนวนทศนิยมbool
: ค่าบูลีนList
: รายการ (ลิสต์)Dict
: ดิกชันนารีTuple
: ทัพเพิลSet
: เซ็ต
ประเภท List
ประเภทของลิสต์ถูกกำหนดโดยใช้คลาส List
คุณยังสามารถกำหนดประเภทขององค์ประกอบในลิสต์อย่างชัดเจนได้
1from typing import List
2
3def sum_list(numbers: List[int]) -> int:
4 return sum(numbers)
5
6print(sum_list([1, 2, 3])) # 6
ในตัวอย่างนี้ องค์ประกอบทั้งหมดของลิสต์คาดว่าจะเป็นประเภท int
ประเภท Dict
ประเภทของดิคชันนารีถูกกำหนดโดยใช้ Dict
ประเภทของคีย์และค่าในดิคชันนารีสามารถกำหนดได้
1from typing import Dict
2
3def get_student_age(students: Dict[str, int], name: str) -> int:
4 return students.get(name, 0)
5
6students = {"Alice": 23, "Bob": 19}
7print(get_student_age(students, "Alice")) # 23
ในตัวอย่างนี้ ดิคชันนารีใช้ประเภท str
เป็นคีย์และ int
เป็นค่า
ประเภท Tuple
ทัปเปิลถูกกำหนดโดยใช้ประเภท Tuple
คุณสามารถกำหนดประเภทของแต่ละองค์ประกอบในทัปเปิลได้อย่างอิสระ
1from typing import Tuple
2
3def get_person() -> Tuple[str, int]:
4 return "Alice", 30
5
6name, age = get_person()
7print(name, age) # Alice 30
ในที่นี้ ฟังก์ชัน get_person
แสดงการคืนค่าทัปเปิลที่มีสตริงและจำนวนเต็ม
ประเภท Union
ประเภท Union
ใช้เพื่อระบุอย่างชัดเจนว่าสามารถใช้หลายประเภทได้
1from typing import Union
2
3def process_value(value: Union[int, float]) -> float:
4 return value * 2.0
5
6print(process_value(10)) # 20.0
7print(process_value(3.5)) # 7.0
ในตัวอย่างนี้ ฟังก์ชัน process_value
ยอมรับค่าเป็น int
หรือ float
และคืนค่าผลลัพธ์ประเภท float
ประเภท Optional
ประเภท Optional
ใช้เมื่อค่าตัวแปรอาจเป็น None
มันถูกจัดเตรียมให้เป็นทางลัดสำหรับ Union[Type, None]
1from typing import Optional
2
3def greet(name: Optional[str] = None) -> str:
4 if name is None:
5 return "Hello, Guest!"
6 return f"Hello, {name}!"
7
8print(greet()) # Hello, Guest!
9print(greet("Alice")) # Hello, Alice!
ในที่นี้ แสดงให้เห็นว่าเมื่อไม่ได้ระบุ name
ค่า name
จะถือว่าเป็น None
ประเภททั่วไป (Generic Types)
ประเภททั่วไปเป็นวิธีในการแสดงประเภทขององค์ประกอบในโครงสร้างข้อมูลแบบนามธรรม ในโมดูล typing
คุณสามารถกำหนดประเภททั่วไปโดยใช้ TypeVar
1from typing import TypeVar, List
2
3T = TypeVar('T')
4
5def get_first_element(elements: List[T]) -> T:
6 return elements[0]
7
8print(get_first_element([1, 2, 3])) # 1
9print(get_first_element(["a", "b", "c"])) # a
ในตัวอย่างนี้ get_first_element
เป็นฟังก์ชันที่คืนค่าองค์ประกอบแรกของลิสต์ และสามารถทำงานได้ไม่ว่าลิสต์จะมีประเภทใด
ชนิดข้อมูลแบบย่อ (Type Aliases)
ชนิดข้อมูลแบบย่อเป็นวิธีทำให้คำจำกัดความของประเภทที่ซับซ้อนง่ายขึ้นโดยการตั้งชื่อที่ชัดเจน
1from typing import List, Tuple
2
3Coordinates = List[Tuple[int, int]]
4
5def get_coordinates() -> Coordinates:
6 return [(0, 0), (1, 1), (2, 2)]
7
8print(get_coordinates()) # [(0, 0), (1, 1), (2, 2)]
ในตัวอย่างนี้ ชนิดข้อมูลแบบย่อ Coordinates
ถูกกำหนดขึ้นเพื่อแสดงประเภทที่มีทัปเปิลอยู่ภายในลิสต์อย่างง่ายดาย
สรุป
โมดูล typing
ใน Python มีประโยชน์มากสำหรับการปรับปรุงความอ่านง่ายและความสามารถในการบำรุงรักษาของโค้ด ด้วยการใช้คำใบ้ประเภท (type hints) อย่างเหมาะสม คุณสามารถช่วยป้องกันปัญหาประเภทไม่ตรงกันและข้อบกพร่อง โดยเฉพาะในโครงการขนาดใหญ่หรือการพัฒนาร่วมกันในทีม ประเภทเป็นเพียงเครื่องมือสนับสนุนการพัฒนาและไม่มีผลต่อพฤติกรรมขณะรันไทม์ ทำให้คงความยืดหยุ่นของโค้ดไว้
คุณสามารถติดตามบทความข้างต้นโดยใช้ Visual Studio Code บนช่อง YouTube ของเรา กรุณาตรวจสอบช่อง YouTube ด้วย