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