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 ที่จะถูกแทนที่ในภายหลัง