φυβλαςのβλογ
บล็อกของ phyblas



การเขียนบอกใบ้ชนิดข้อมูลตัวแปรใน python
เขียนเมื่อ 2024/02/22 00:56
แก้ไขล่าสุด 2024/02/23 18:42
 

บทความนี้ว่าด้วยการใช้ความสามารถบอกใบ้ชนิด (type hint) ในการเขียนประกาศตัวแปรในไพธอนโดยระบุชัดชนิดของข้อมูลตัวแปร ซึ่งเป็นไวยากรณ์เสริมส่วนหนึ่งของภาษาไพธอนที่แม้จะไม่ได้ถึงกับจำเป็นแต่ก็มีการใช้งานจริง จึงน่าศึกษาเอาไว้



ภาพรวม

ภาษาไพธอนนั้นเป็นภาษาที่เวลาจะใช้ตัวแปรอะไรเราไม่จำเป็นต้องมาประกาศล่วงหน้าก่อน จู่ๆก็ใช้ได้ทันทีเลย ชนิดของตัวแปรก็ไม่ต้องกำหนดแน่ชัด แถมยังเปลี่ยนกลางคันได้ด้วย ทำให้ใช้งานสะดวกคล่องตัวดีมาก นอกจากไพธอนแล้ว ก็ยังมีอีกหลายภาษาที่เป็นแบบนี้เช่นกัน เช่น php, รูบี, IDL, ฯลฯ

ซึ่งต่างจากบางภาษาเช่นภาษา C, C++, C#, ฟอร์แทรน, ดาร์ต, ฯลฯ ซึ่งต้องประกาศตัวแปรล่วงหน้า และยังต้องระบุชนิดของตัวแปรให้ชัดเจน และจะเปลี่ยนภายหลังก็ไม่ได้ด้วย หรืออย่างจาวาสคริปต์ที่มีการประกาศตัวแปรก่อน แต่ไม่ต้องระบุชนิดตัวแปร และยังเปลี่ยนกลางคันได้

การที่ไม่ต้องประกาศตัวแปรและระบุชนิดตัวแปรก่อนนั้นก็มีข้อดี แต่ก็มีข้อเสียเช่นกัน แบบไหนดีกว่ากันนั้นก็แล้วแต่งานหรือคนที่นำไปใช้ ความคิดเห็นต่างกันไป

ภาษาไพธอนนั้นแม้ว่าโดยพื้นฐานแล้วจะไม่จำเป็นต้องประกาศและระบุชนิดตัวแปร แต่ว่าถ้าหากต้องการก็สามารถทำได้เช่นกัน ตัวไวยากรณ์ภาษาไพธอนเองรองรับให้ทำแบบนั้นได้อยู่ แม้ว่าจะมีรูปแบบวิธีการเขียนที่เข้าใจยากเพราะต่างจากภาษาอื่นส่วนใหญ่ก็ตาม

ความสามารถตรงนี้ไม่ได้มีอยู่ในภาษาไพธอนตั้งแต่แรก แต่เริ่มถูกนำมาใช้ตั้งแต่เวอร์ชัน 3.5 (ปี 2015) เป็นต้นมา แต่ว่าในระยะแรกความสามารถตรงนี้ยังไม่สมบูรณ์ เขียนยาก จึงไม่ค่อยมีการใช้งานจริงกว้างขวาง แต่ว่าในเวอร์ชันต่อๆมาก็ได้มีการปรับปรุง วิธีการเขียนก็เปลี่ยนไปเรื่อยๆ เขียนง่ายขึ้นมา และมีการนำไปใช้งานจริงมากขึ้น

เนื่องจากรูปแบบการเขียนมีการเปลี่ยนแปลงไปตามแต่ละเวอร์ชัน ทำให้ถ้าอ่านโค้ดที่ถูกเขียนขึ้นในช่วงเวลาต่างกันออกไปก็จะพบการเขียนที่ต่างกันไป ชวนให้สับสนได้

สำหรับที่จะอธิบายต่อไปนี้เป็นการใช้ในเวอร์ชัน 3.11 เป็นหลัก แต่ก็จะอธิบายวิธีการเขียนของเวอร์ชันเก่ากว่านั้นเอาไว้ด้วยตอนท้าย เพื่อให้เข้าใจถ้าเจอโค้ดแบบเก่า




การใช้งานเบื้องต้น

ปกติแล้วเวลาจะประกาศและใช้ตัวแปรในภาษาไพธอนเราก็เขียนขึ้นมาลอยๆแล้วก็ใช้ได้เลย เช่น
a = 7
b = 3.5
print(a+b) # ได้ 10.5

ในที่นี้ a จะเป็นข้อมูลชนิด int และ b จะเป็น float ไปโดยอัตโนมัติ เราไม่จำเป็นต้องไประบุอะไรเป็นพิเศษ

อย่างไรก็ตาม เราสามารถเขียนแบบนี้ได้ด้วย
a: int = 7
b: float = 3.5
print(a+b) # ได้ 10.5

แบบนี้เรียกว่าเป็นการเขียนโดยมีการบอกใบ้ชนิดตัวแปร ซึ่งผลที่ได้ก็เหมือนเดิม ไม่มีอะไรเปลี่ยนแปลง แค่เขียนยาวขึ้นเท่านั้นเอง และยังทำให้อ่านเข้าใจยากขึ้นด้วยสำหรับคนที่ชินกับการเขียนไพธอนแบบดั้งเดิมและยังไม่ชินกับการเขียนแบบนี้

แต่ว่าสำหรับคนที่เคยชินกับการเขียนภาษาที่ต้องระบุชนิดตัวแปรชัดแล้ว น่าจะดีใจกับการเขียนแบบนี้ เพราะช่วยให้เข้าใจง่ายกว่า และดูรัดกุมกว่า เพราะมีชื่อชนิดตัวแปรเขียนระบุชัดอยู่แบบนี้

สรุปรูปแบบการเขียนก็คือ
ชื่อตัวแปร: ชนิดข้อมูลตัวแปร = ค่าตั้งต้น

ส่วนที่เพิ่มเข้ามาก็คือ : ชนิดข้อมูลตัวแปร แทรกตรงกลาง นอกนั้นก็เหมือนเวลาแทนค่าตั้งต้นให้ตัวแปรตามปกติ

นอกจากนี้แล้ว อาจประกาศตัวแปรก่อนแล้วค่อยแทนค่าทีหลังก็ได้เช่นกัน ไม่จำเป็นตัวประกาศตัวแปรแล้วแทนค่าทันที
a: int
b: float
a = 7
b = 3.5

ชนิดของข้อมูลที่ระบุจะเป็นอะไรก็ได้ ทั้งชนิดข้อมูลพื้นฐาน หรือคลาสที่ได้จากมอดูลเสริม หรือคลาสที่เราเขียนขึ้นมาเอง

ตัวอย่างการใช้ข้อมูลชนิดอื่นๆ
bbb: bool = True
ccc: complex = 1j
sss: str = 'ข้าว'
lll: list = [1,2]
ttt: tuple = (1,2,3)
ddd: dict = {'ก': 1, 'ข': 2}

from datetime import datetime,timedelta
dt: datetime = datetime.now()
td: timedelta = timedelta(hours=1)

import numpy as np
arr: np.ndarray = np.array([[3,4],[5,6]])




ผลบังคับใช้

จากที่อธิบายมาข้างต้น การบอกใบ้ชนิดข้อมูลทำให้เรารู้ชัดว่าตัวแปรนั้นเป็นชนิดอะไร จะนำไปใช้ยังไง อย่างไรก็ตาม จริงๆแล้วต่อให้เราไม่ได้ใช้ตัวแปรตามที่ประกาศเอาไว้ ก็ไม่ได้มีอะไรเกิดขึ้นแต่อย่างใด เช่น
x: str = 2.2

ในที่นี้ระบุว่าเป็น str แต่กลับแทนค่าเป็น float ไปอย่างหน้าตาเฉย โปรแกรมก็ไม่ได้ฟ้องข้อผิดพลาดอะไร ยังคงทำงานต่อไปได้

ดังนั้นจริงๆแล้วการบอกใบ้ชนิดตัวแปรในที่นี้แค่ใส่ไปเพื่อให้รู้เฉยๆ เป็นแค่การ "บอกใบ้" (hint) ไม่ใช่การนิยามหรือตั้งข้อจำกัดขึ้นจริงๆ ไม่ได้มีผลบังคับใช้จริงในกรณีทั่วไป ดังนั้นจึงยังคงต้องระวังด้วยตัวเองอยู่ดี

อย่างไรก็ตาม ถ้าอยากให้การบอกใบ้ชนิดตัวแปรนี้มีผลบังคับใช้จริงก็สามารถทำได้ ซึ่งมีอยู่หลายวิธี แต่ที่มักได้รับการแนะนำมากที่สุดคือโดยการติดตั้งแพ็กเกจเสริมที่ชื่อว่า mypy

การติดตั้งสามารถทำได้ง่ายโดยใช้ pip
pip install mypy

หากติดตั้ง mypy แล้วเวลาที่ใช้ตัวแปรผิดชนิดไปจากที่ระบุก็จะเกิดข้อผิดพลาดขึ้นมาจริงๆ

เกี่ยวกับการใช้ mypy นั้นจะไม่พูดถึงละเอียดในนี้ ถ้าใครสนใจก็ลองใช้กันดูได้

นอกจากนี้แล้ว ต่อให้ไม่ได้ลงแพ็กเกจเสริม แต่เวลาที่เราเขียนโดยใช้อีดิตเตอร์ดีๆดังเช่น spyder นั้นการระบุชนิดตัวแปรก็มีผลกับตัวช่วยเสริมเติมเต็มอัตโนมัติ (auto completion)

เช่นปกติแล้วใน spyder เวลาเราพิมพ์จุด ต่อท้ายตัวแปร ก็จะมีการขึ้นพวกเมธอดหรือแอตทริบิวต์ต่างๆที่ใช้ได้ โดยจะมีอะไรขึ้นมาก็ขึ้นอยู่กับชนิดตัวแปรนั้น เช่นเวลาใช้ปกติเราแทนค่าให้ตัวแปร แล้วในบรรทัดต่อมาลองพิมพ์ดูก็จะขึ้นแบบนี้



ที่ขึ้นมานี้เป็นของตัวแปรชนิด int

เพียงแต่ว่าถ้าการประกาศตัวแปรโดยระบุชนิดตัวแปรตามวิธีนี้ ต่อให้แทนค่าตัวแปรชนิดอื่นไป มันก็จะขึ้นตามที่ประกาศ เช่นลองระบุให้เป็น str ดู



คราวนี้ที่ขึ้นมาเป็นของตัวแปรชนิด str ทั้งที่ป้อนค่าเป็น int

ดังนั้นก็จะเห็นได้ว่าการระบุชนิดตัวแปรนั้นมีผลกับตัวอีดิเตอร์ที่ใช้ได้ ซึ่งตรงนี้จะมีผลในส่วนไหนบ้างก็ขึ้นอยู่กับตัวอีดิเตอร์ที่ใช้ ในที่นี้แค่ยกตัวอย่างกรณี spyder ส่วนถ้าใครใช้อย่างอื่นก็ต้องดูว่าเป็นยังไงบ้าง

จะเห็นได้ว่าแม้ไพธอนจะเพิ่มความสามารถให้สามารถระบุชัดชนิดข้อมูลตัวแปรได้ แต่ก็ไม่ได้มีผลกับคอมไพเลอร์มาตรฐานของไพธอน จะมีผลบังคับในกรณีจำกัดบางอย่าง

นอกจากนี้แล้วในการใช้งานมอดูลบางตัวของไพธอน การเขียนแบบนี้อาจมีความสำคัญ ให้ผลบังคับใช้จริงขึ้นมา ซึ่งก็ขึ้นอยู่กับตัวมอดูลนั้น

ตัวอย่างมอดูลที่ถ้าใช้รูปแบบการเขียนระบุชัดชนิดข้อมูลแบบนี้ก็เช่น fastapi ที่ใช้เขียนเว็บ เป็นต้น ถ้าใครจะใช้มอดูลนี้ก็จำเป็นต้องทำความเข้าใจวิธีการเขียนแบบนี้ไว้




ตัวแปร __annotations__

แม้ว่าโดยพื้นฐานแล้วการระบุชนิดข้อมูลจะไม่ได้มีผลบังคับใช้จริง เลยดูเหมือนกับว่ากลายเป็นใส่เป็นของประดับไปเหมือนอย่างกับเป็นแค่การเขียนคอมเมนต์หลัง # แต่ว่าจริงๆแล้วการเขียนแบบนี้ต่างจากการเขียนคอมเมนต์ตรงที่ว่าสามารถดูข้อมูลที่เขียนไปได้โดยจะถูกเก็บไว้ที่ตัวแปร __annotations__ โดยอยู่ในรูปของดิกชันนารี

ตัวแปรนี้จะปรากฏขึ้นมาโดยอัตโนมัติเมื่อเรามีการเขียนระบุบอกใบ้ชนิดข้อมูลตัวแปร
print(__annotations__) # ได้ NameError: name '__annotations__' is not defined
a: int = 1
print(__annotations__) # ได้ {'a': <class 'int'>}
b: str = '2'
print(__annotations__) # ได้ {'a': <class 'int'>, 'b': <class 'str'>}

ฉะนั้นเราสามารถตรวจสอบได้ว่ามีการระบุตัวแปรไหนเป็นชนิดอะไรได้โดยผ่าน __annotations__ นี้

เราอาจนำ __annotations__ นี้มาใช้เพื่อตรวจสอบว่าชนิดข้อมูลที่ป้อนไปนั้นตรงกับที่ระบุหรือไม่ เช่นด้วยการใช้ร่วมกับ isinstance แบบนี้
x: int
x = 1.1
assert(isinstance(x,__annotations__['x'])) # ได้ AssertionError




การระบุชนิดข้อมูลในการนิยามฟังก์ชัน

ปกติแล้วในไพธอนเวลานิยามฟังก์ชันขึ้นมาไม่จำเป็นต้องระบุชนิดข้อมูลตัวแปรเลย ทั้งชนิดข้อมูลพารามิเตอร์ และชนิดข้อมูลของค่าคืนกลับ

ตัวอย่างการเขียนฟังก์ขันแบบดั้งเดิม
def f(a, b):
    return a*b

ถ้าหากต้องการเขียนฟังก์ชันนี้ใหม่ให้ระบุชัดชนิดข้อมูลก็ทำได้โดยใช้การเขียนบอกใบ้ดังนี้
def f(a: int, b: str) -> str:
    return a*b

พอเขียนแบบนี้ก็เป็นการระบุให้รู้ว่าฟังก์ชันนี้ต้องการตัวแปร a ที่เป็นจำนวนเต็มกับตัวแปร b ที่เป็นสายอักขระ และจะคืนค่าเป็นสายอักขระมา

เวลาที่ลองมาดูข้อมูลของฟังก์ชันนี้เช่นด้วยการใช้ help ข้อมูลตรงส่วนนี้ก็จะแสดงให้เห็นชัดด้วย
help(f) # ได้ f(a: int, b: str) -> str

ดังนั้นแล้วอย่างเช่นเวลาที่เขียนโค้ดแจกให้คนอื่นไปใช้ ถ้าโค้ดนั้นมีการระบุชนิดข้อมูลไว้ คนที่จะเอาไปใช้ก็สามารถอ่านตรงนี้แล้วเข้าใจวิธีใช้ได้ง่ายด้วย

นอกจากนี้ข้อมูลตรงนี้ยังถูกเก็บอยู่ในแอตทริบิวต์ .__annotations__ ของตัวออบเจ็กต์ฟังก์ชันด้วย สามารถนำมาใช้ได้ โดยชนิดของค่าคืนกลับที่ระบุไว้จะอยู่ใน 'return'
print(f.__annotations__) # ได้ {'a': <class 'int'>, 'b': <class 'str'>, 'return': <class 'str'>}
print(f.__annotations__['return'])  # ได้ <class 'str'>

หากต้องการกำหนดค่าตั้งต้นก็เติม = ลงไปเช่นเดียวกับตอนเขียนแบบปกติ แม้อาจจะดูยืดยาวขึ้นมาหน่อย
def f(a: int = 3, b: str = 'x') -> str:
    return a*b

print(f()) # ได้ xxx

สรุปรูปแบบการเขียนก็คือ
def ชื่อฟังก์ชัน(ชื่อตัวแปร๑: ชนิดข้อมูล๑ = ค่าตั้งต้น๑, ...) -> ชนิดตัวแปรคืนกลับ:
    เนื้อหาของฟังก์ชัน

ในส่วนของพารามิเตอร์ก็แค่เพิ่ม : ชนิดข้อมูล และส่วนของค่าคืนกลับก็เพิ่ม -> ชนิดข้อมูล เท่านั้นเอง

ในกรณีที่เป็นฟังก์ชันที่ไม่มีค่าคืนกลับก็ให้ใส่เป็น -> None ไป
def thakthai() -> None:
    print('สวัสดี')




การระบุชนิดข้อมูลแอตทริบิวต์ในการสร้างคลาส

การสร้างคลาสโดยมีการบอกใบ้ชนิดข้อมูลตัวแปรของแอตทริบิวต์ไปด้วยให้ระบุลงไปด้านในส่วนโครงสร้างคลาส

ตัวอย่างการเขียน
class Khon:
    chue: str
    ayu: int
    
    def __init__(self, chue: str, ayu: int):
        self.chue = chue
        self.ayu = ayu
    
    def naenamtua(self):
        print(f'"ฉันชื่อ{self.chue} อายุ {self.ayu}"')
    
khond: Khon = Khon('คนดี',15)
khond.naenamtua() # ได้ "ฉันชื่อคนดี อายุ 15"

# ชนิดของข้อมูลที่ระบุไปนั้นยังถูกเก็บอยู่ใน .__annotations__ ด้วย
print(Khon.__annotations__) # ได้ {'chue': <class 'str'>, 'ayu': <class 'int'>}

เวลาที่ประกาศตัวแปรโดยสร้างออบเจกต์ขึ้นจากคลาสที่สร้างขึ้นนั้นจะเห็นว่าต้องเขียนชื่อคลาสซ้ำกัน ๒ ครั้งเป็น ตัวแปร: ชื่อคลาส = ชื่อคลาส() แบบนี้อาจดูแล้วเยิ่นเย้อแปลกๆสักหน่อย แต่ว่าเวลาที่เขียนภาษา C++ ก็เป็นลักษณะคล้ายแบบนี้เหมือนกัน

สำหรับการนิยามเมธอดภายในคลาสนั้นก็สามารถระบุตัวแปรพารามิเตอร์ได้เช่นกัน แต่ว่าตรง self ไม่จำเป็นต้องใส่




การระบุชนิดข้อมูลทางเลือก

ถ้าต้องการให้ตัวแปรนั้นๆเป็นชนิดไหนก็ได้ในจำนวนหลายชนิดที่กำหนดก็ทำได้โดยเขียนข้อมูลแต่ละชนิดที่ต้องการให้เป็นได้แล้วคั่นด้วย |
ชื่อตัวแปร: ชนิดข้อมูล๑|ชนิดข้อมูล๒ = ค่า

เช่นถ้าต้องการให้เป็น int หรือ float ก็ได้ก็อาจเขียนแบบนี้
a: int|float = 1
a = 1.1

พอเขียนแบบนี้แล้วก็ทำให้ใช้ได้ยืดหยุ่นขึ้น

บ่อยครั้งเราต้องการระบุว่าตัวแปรนั้นๆเป็น None ได้ด้วย ในกรณีแบบนั้นก็ให้เขียน |None
n: int|None = 10




ชนิดข้อมูลภายในลิสต์หรือเซ็ต

สำหรับตัวแปรประเภทกลุ่มอย่างลิสต์หรือเซ็ตนั้นยังสามารถระบุชัดชนิดตัวแปรของสมาชิกภายในได้ด้วย โดยเขียนเป็น
ชื่อตัวแปร: list[ชนิดข้อมูลในลิสต์]
ชื่อตัวแปร: set[ชนิดข้อมูลในเซ็ต]

เช่น
lis1: list[str] = ['ไก่','ไข่']
lis2: list[float] = [1.1,1.3,1.6]
set1: set[int] = {10,20,40}

ชนิดข้อมูลที่ระบุใน [ ] นั้นคือชนิดข้อมูลของสมาชิกทุกตัวในนั้น ไม่ว่าจะมีสมาชิกกี่ตัวอยู่ในนั้นก็ใส่แค่ตัวเดียว และทุกตัวต้องเป็นตัวแปรชนิดนั้นเหมือนกันหมด

หรือถ้าต้องการให้ใส่ได้หลายชนิดก็ระบุแต่ละชนิดที่ใช้ได้โดยคั่นด้วย | ได้
set2: set[int|float] = {1.7,3,4.5,6}

ถ้าเป็นลิสต์ที่ข้างในมีลิสต์อีกทีก็สามารถระบุชนิดตัวแปรภายในลึกลงไปขั้นต่อไปได้อีก
lilis: list[list[str]] = [['ก','ข'],['ค','ง']]




ชนิดข้อมูลภายในทูเพิล

การระบุชนิดข้อมูลภายทูเพิลนั้นจะคล้ายกับลิสต์หรือเซ็ต แต่ต่างกันตรงที่ว่าในการระบุชนิดข้อมูลจะใส่ข้อมูลต่างกันให้กับสมาชิกทุกตัวในนั้น จำนวนชนิดข้อมูลที่ใส่จะเท่ากับจำนวนสมาชิกที่ต้องการให้มีในทูเพิลนั้น
ชื่อตัวแปร: tuple[ชนิดข้อมูล๑, ชนิดข้อมูล๒, ...] = (ค่า๑, ค่า๒, ...)

เช่น
tup1: tuple[int,float,str] = (1,1.0,'1')




ชนิดข้อมูลภายในดิกชันนารี

สำหรับดิกชันนารีนั้นจะกำหนดชนิดข้อมูลให้ทั้งคีย์และค่าได้
ชื่อตัวแปร: dict[ชนิดข้อมูลของคีย์, ชนิดข้อมูลของค่า]

เช่น
dic1: dict[int,float] = {1: 11.1, 2: 22.2}
dic2: dict[str,int|float] = {'ก': 11, 'ข': 22.2}




วิธีการเขียนในเวอร์ชันเก่า

การเขียนบอกใบ้ชนิดนั้นทำได้ตั้งแต่ในเวอร์ชัน 3.5 แต่ว่าเดิมทีนั้นนั้นการเขียนไม่ได้กระชับเรียงง่ายเท่าเวอร์ชันใหม่ดังที่อธิบายมาข้างต้น เช่น จำเป็นต้องเรียกใช้มอดูลในตัวที่ชื่อว่า typing มาช่วย

วิธีการเขียนนั้นในเวอร์ชันปัจจุบันก็ยังคงใช้ได้อยู่ถ้ายังอยากจะเขียน แต่ว่าไม่จำเป็นเพราะเขียนยาวและเข้าใจยากกว่า ดังนั้นในที่นี้จึงรู้ไว้พอให้เข้าใจความหมายก็พอ แต่ถ้าหากเจอการเขียนแบบนี้ในโค้ดเก่าถ้าเป็นไปได้ก็ให้แก้เป็นแบบใหม่ เพราะวิธีการเขียนแบบเก่าไม่เป็นที่แนะนำให้ใช้อีกต่อไป

เช่นในการกำหนดให้ชนิดข้อมูลมีทางเลือก เวอร์ชัน 3.10 เป็นต้นมาจะใช้ | แต่ในเวอร์ชันเก่าจนถึง 3.9 จะใช้ typing.Union เช่น
from typing import Union
a: Union[int,float,str]

เทียบกับเวอร์ชันใหม่คือ a: int|float|str แบบนี้ดูกระชับแล้วเข้าใจง่ายกว่ามาก

นอกจากนี้ยังมี typing.Optinal ไว้ใช้สำหรับระบุให้ตัวแปรเป็น None ได้ เช่น
from typing import Optional
x: Optional[int]

แบบนี้จะเทียบเท่ากับการเขียนแบบใหม่คือ x: int|None

ส่วนการนิยามลิสต์, เซ็ต, ทูเพิล, ดิกชันนารี ในเวอร์ชัน 3.9 เป็นต้นมาจะใช้ list, set, tuple, dict โดยตรงเลย แต่ในเวอร์ชันเก่าจนถึง 3.8 จะใช้ typing.List, typing.Set, typing.Tuple, typing.Dict เช่น
from typing import List,Set,Tuple,Dict

lis1: List[str]
set1: Set[int]
tup1: Tuple[str,int]
dic1: Dict[str,int]

ดูเผินๆแล้วก็อาจไม่ต่างจากการเขียนแบบเวอร์ชัน 3.9 เป็นต้นมา แต่ว่าขึ้นต้นด้วยพิมพ์ใหญ่ และจำเป็นต้อง import มาด้วย ดังนั้นแบบใหม่จึงสะดวกกว่า




สรุปทิ้งท้าย

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

จะเห็นว่าการเขียนแบบนี้ทำให้โค้ดดูยาวขึ้นไม่มากก็น้อย จนทำให้สงสัยว่ามีความจำเป็นอะไรที่จะต้องยุ่งยากขนาดนี้ด้วยหรือ ในเมื่อไม่ได้เป็นข้อบังคับอะไร

โดยรวมแล้วประโยชน์ของการใช้ก็อาจมีดังนี้
  • ช่วยให้อ่านง่าย เพราะรู้ชนิดข้อมูลของตัวแปรชัดเจน
  • เพิ่มความปลอดภัยของโค้ด เพราะกันการใช้ตัวแปรผิดชนิด
  • ช่วยให้ค้นหาข้อผิดพลาดได้ง่าย ไม่ใช่แค่มองด้วยตา แต่อีดิเตอร์เช่น spyder หรือ vs code ก็ช่วยสอดส่องให้เราด้วย
  • ถ้าใช้กับแพ็กเกจเสริมบางตัว เช่น mypy จะยิ่งจัดการกับข้อผิดพลาดได้ง่ายขึ้นอีก
  • ช่วยในการสร้างเอกสารอธิบายการใช้งาน เช่นเมื่อทำโดย pydoc หรือ sphinx เป็นต้น
  • มีผลในการเขียนโค้ดด้วยมอดูลเสริมบางตัวของไพธอน เช่น fastadi เป็นต้น หากจะใช้มอดูลพวกนี้ควรศึกษาไว้

ประโยชน์ในข้อที่ว่าทำให้โค้ดเข้าใจง่ายขึ้นนั้นจริงๆน่าจะให้ผลในทางตรงกันข้ามสำหรับคนที่ไม่รู้ความหมายของการเขียนแบบนี้ ดังนั้นต่อให้เราไม่คิดจะเขียนแบบนี้ แต่รู้วิธีเขียนไว้ก็เป็นประโยชน์

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



อ้างอิง



-----------------------------------------

囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧

ดูสถิติของหน้านี้

หมวดหมู่

-- คอมพิวเตอร์ >> เขียนโปรแกรม >> python

ไม่อนุญาตให้นำเนื้อหาของบทความไปลงที่อื่นโดยไม่ได้ขออนุญาตโดยเด็ดขาด หากต้องการนำบางส่วนไปลงสามารถทำได้โดยต้องไม่ใช่การก๊อปแปะแต่ให้เปลี่ยนคำพูดเป็นของตัวเอง หรือไม่ก็เขียนในลักษณะการยกข้อความอ้างอิง และไม่ว่ากรณีไหนก็ตาม ต้องให้เครดิตพร้อมใส่ลิงก์ของทุกบทความที่มีการใช้เนื้อหาเสมอ

สารบัญ

รวมคำแปลวลีเด็ดจากญี่ปุ่น
มอดูลต่างๆ
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
การเรียนรู้ของเครื่อง
-- โครงข่าย
     ประสาทเทียม
ภาษา javascript
ภาษา mongol
ภาษาศาสตร์
maya
ความน่าจะเป็น
บันทึกในญี่ปุ่น
บันทึกในจีน
-- บันทึกในปักกิ่ง
-- บันทึกในฮ่องกง
-- บันทึกในมาเก๊า
บันทึกในไต้หวัน
บันทึกในยุโรปเหนือ
บันทึกในประเทศอื่นๆ
qiita
บทความอื่นๆ

บทความแบ่งตามหมวด



ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ

  ค้นหาบทความ

  บทความแนะนำ

ตัวอักษรกรีกและเปรียบเทียบการใช้งานในภาษากรีกโบราณและกรีกสมัยใหม่
ที่มาของอักษรไทยและความเกี่ยวพันกับอักษรอื่นๆในตระกูลอักษรพราหมี
การสร้างแบบจำลองสามมิติเป็นไฟล์ .obj วิธีการอย่างง่ายที่ไม่ว่าใครก็ลองทำได้ทันที
รวมรายชื่อนักร้องเพลงกวางตุ้ง
ภาษาจีนแบ่งเป็นสำเนียงอะไรบ้าง มีความแตกต่างกันมากแค่ไหน
ทำความเข้าใจระบอบประชาธิปไตยจากประวัติศาสตร์ความเป็นมา
เรียนรู้วิธีการใช้ regular expression (regex)
การใช้ unix shell เบื้องต้น ใน linux และ mac
g ในภาษาญี่ปุ่นออกเสียง "ก" หรือ "ง" กันแน่
ทำความรู้จักกับปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง
ค้นพบระบบดาวเคราะห์ ๘ ดวง เบื้องหลังความสำเร็จคือปัญญาประดิษฐ์ (AI)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ

บทความแต่ละเดือน

2024年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2023年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2022年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2021年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2020年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

ค้นบทความเก่ากว่านั้น

ไทย

日本語

中文