2.17. Type hints#
Python ให้คุณ ระบุ annotation บนพารามิเตอร์ฟังก์ชันและค่าที่คืนด้วยข้อมูลประเภท annotation เหล่านี้ถูกละเว้นขณะรัน -- ไม่มีอะไรตรวจสอบ ไม่มีอะไรแปลงตาม -- แต่ทำหน้าที่เป็นเอกสารสำหรับผู้อ่านและ IDE
2.17.1. ไวยากรณ์ annotation#
annotation ของพารามิเตอร์ตามหลัง colon ประเภทที่คืนตามหลัง -> และก่อน colon ของเนื้อหา:
def greet(name: str) -> None:
print("hello,", name)
def add(a: int, b: int) -> int:
return a + b
def average(values: list) -> float:
return sum(values) / len(values)
hints อธิบายว่า ควร ส่งอะไรเข้ามาและ จะ คืนอะไร การเรียก add("hi", "there") ไม่ยกข้อยกเว้น -- Python รันเนื้อหาต่อไป hints คือสัญญา ไม่ใช่การตรวจสอบ
พารามิเตอร์สามารถมีทั้งค่าเริ่มต้นและ annotation:
def greet(name: str, greeting: str = "hello") -> None:
print(greeting, name)
CPython มีสัญลักษณ์ที่สมบูรณ์กว่า (Optional, Union, generics) ผ่านโมดูล typing แต่สิ่งเหล่านั้นหนักบน MicroPython และแทบไม่จำเป็นสำหรับโค้ดกล้องทั่วไป
2.17.2. MicroPython ขณะรัน#
MicroPython แยกวิเคราะห์ annotation แล้วละเว้น ไม่มีโมดูล typing ให้ import บนกล้อง; การพยายามใช้ Optional[int] หรือ list[int] จะล้มเหลวในการ import หรือทำงานแบบเงียบเป็นการเข้าถึง attribute ธรรมดา ขึ้นอยู่กับการคอมไพล์เฟิร์มแวร์
ยึดถือชื่อประเภทธรรมดา (int, float, str, bool, bytes, list, tuple, dict) ใน annotation ไม่มีค่าใช้จ่ายขณะรันและสื่อความตั้งใจได้ชัดเจน
2.17.3. IDE ใช้งาน annotation อย่างไร#
IDE อ่าน annotation เพื่อขับเคลื่อน tooltip, autocomplete และ inline hints ฟังก์ชันที่มี annotation -> int แสดง int เป็นประเภทที่คืนเมื่อเคอร์เซอร์วางอยู่บนการเรียก พารามิเตอร์ที่มี annotation : str จะ autocomplete เมธอด string บนอาร์กิวเมนต์ภายในเนื้อหาฟังก์ชัน
นี่คือผลประโยชน์ที่ได้จริงของการเขียน annotation บน runtime ที่ละเว้น: การสนับสนุนที่ดีขึ้นจาก editor โดยไม่มีค่าใช้จ่ายเลยเมื่อสคริปต์รันบนกล้อง
2.17.4. Variable annotations#
Annotation บนการกำหนดค่าธรรมดาทำงานในลักษณะเดียวกัน:
threshold: float = 0.5
name: str = "OpenMV"
สิ่งเหล่านี้ก็ถูกละเว้นขณะรันเช่นกัน การใช้งานหลักคือทำให้ประเภทที่ตั้งใจชัดเจนเมื่อฝั่งขวาไม่ได้ทำให้ชัดเจน -- โดยทั่วไปเมื่อค่าเริ่มต้นเป็น placeholder ที่จะถูกแทนที่ในภายหลัง