การเรียกใช้ mypy และแก้ข้อผิดพลาดด้านชนิดข้อมูล
กำหนดค่า mypy ตีความข้อผิดพลาด และเพิ่มชนิดข้อมูลให้ฐานโค้ดทีละส่วน
การเรียกใช้ mypy และแก้ข้อผิดพลาดด้านชนิดข้อมูล เป็นบทเรียน Python Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Python Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน
การติดตั้งและเรียกใช้ mypy
ติดตั้ง mypy ด้วย pip แล้วเรียกใช้กับไฟล์หรือแพ็กเกจ mypy จะรายงานข้อผิดพลาดด้านชนิดข้อมูลโดยไม่เรียกใช้โค้ดของคุณ
# pip install mypy
# Check a single file:
# mypy script.py
# Check a package:
# mypy mypackage/
# Strict mode (recommended for new code):
# mypy --strict script.pyข้อผิดพลาดแรกของคุณใน mypy
mypy ตรวจพบชนิดข้อมูลที่เข้ากันไม่ได้ ค่าที่ส่งกลับขาดหาย และอาร์กิวเมนต์ของฟังก์ชันที่ไม่ได้ใส่คำอธิบายชนิดข้อมูล
# script.py
def add(a, b): # mypy: Missing type annotation
return a + b
result: int = add("hello", 1) # str, not int
# mypy output:
# error: Returning Any from function declared to return "int"แฟล็ก --strict
--strict เปิดใช้การตรวจสอบเพิ่มเติมจำนวนมาก เช่น คำอธิบายชนิดข้อมูลที่ขาดหาย การใช้ Any และการนำเข้าที่ไม่มีชนิดข้อมูล เป็นต้น ควรเริ่มต้นโดยไม่ใช้แฟล็กนี้ แล้วค่อย ๆ เพิ่มการตรวจสอบ
# Most important strict flags individually:
# --disallow-untyped-defs
# --disallow-any-generics
# --warn-return-any
# --no-implicit-reexport
# Or all at once:
# mypy --strict mypackage/การละเว้นข้อผิดพลาด
เพิ่ม # type: ignore ไว้ท้ายบรรทัดเพื่อระงับข้อผิดพลาดเฉพาะจุด ควรใช้อย่างประหยัดและใส่คำอธิบายว่าทำไมจึงจำเป็น
import third_party # type: ignore[import] # no stub available
x: int = get_dynamic_value() # type: ignore[assignment]การกำหนดค่า mypy.ini / pyproject.toml
จัดเก็บการตั้งค่า mypy ไว้ใน mypy.ini หรือ pyproject.toml เพื่อไม่ต้องส่งแฟล็กทุกครั้งที่เรียกใช้
# mypy.ini
[mypy]
python_version = 3.11
strict = True
ignore_missing_imports = True
[mypy-third_party.*]
ignore_errors = Trueโหมดเพิ่มทีละส่วน
mypy แคชผลลัพธ์ระหว่างการเรียกใช้แต่ละครั้ง โดยจะตรวจสอบซ้ำเฉพาะไฟล์ที่เปลี่ยนแปลง ทำให้การเรียกใช้ครั้งต่อ ๆ ไปทำงานได้รวดเร็ว
# First run:
# mypy mypackage/ — full analysis, ~5 s
# Second run (nothing changed):
# mypy mypackage/ — Success: no issues in 0 source files (0.3 s)ข้อผิดพลาดที่พบบ่อย: ชนิดข้อมูลเข้ากันไม่ได้
ข้อผิดพลาดที่พบบ่อยที่สุดคือการกำหนดหรือส่งค่าที่มีชนิดข้อมูลไม่ถูกต้อง
# error: Incompatible types in assignment
# (expression has type "str", variable has type "int")
count: int = 0
count = "five" # error
# Fix:
count = 5ข้อผิดพลาดที่พบบ่อย: ชนิดอาร์กิวเมนต์ไม่ตรงกัน
การส่งอาร์กิวเมนต์ที่มีชนิดข้อมูลไม่ถูกต้องให้กับฟังก์ชัน
def greet(name: str) -> str:
return f"Hello, {name}"
# error: Argument 1 to "greet" has incompatible type "int"
greet(42) # error
# Fix:
greet(str(42))ข้อผิดพลาดที่พบบ่อย: ส่งคืน None โดยไม่คาดหมาย
ฟังก์ชันประกาศว่าจะส่งคืนค่าที่ไม่ใช่ None แต่มีเส้นทางการทำงานที่ส่งคืน None
# error: Missing return statement
def find(items: list[int], target: int) -> int:
for item in items:
if item == target:
return item
# Missing: no return if not found!
# Fix:
def find2(items: list[int], target: int) -> int | None:
for item in items:
if item == target:
return item
return Noneการจำกัดชนิดข้อมูลด้วย isinstance
ใช้ isinstance เพื่อจำกัดชนิดข้อมูลของชนิด Union ภายในแขนงหนึ่งของโค้ด mypy เข้าใจการตรวจสอบนี้และจะจำกัดชนิดข้อมูลให้แคบลง
def process(value: int | str) -> str:
if isinstance(value, int):
return str(value * 2) # mypy knows value is int here
return value.upper() # mypy knows value is str hereการใช้ cast
typing.cast(Type, value) บอก mypy ให้ถือว่าค่าเป็นชนิดข้อมูลที่กำหนด โดยไม่มีผลขณะทำงาน ควรใช้เฉพาะเมื่อคุณมีข้อมูลที่ถูกต้องมากกว่า mypy
from typing import cast
def get_value() -> object:
return 42
result = cast(int, get_value()) # mypy treats result as int
print(result + 1) # 43ตรวจสอบความเข้าใจอย่างรวดเร็ว
การเพิ่ม # type: ignore ลงในบรรทัดหนึ่งมีผลอย่างไร
สรุป
เรียกใช้ mypy script.py เพื่อตรวจสอบชนิดข้อมูล แก้ไขการกำหนดค่าที่ชนิดข้อมูลเข้ากันไม่ได้ อาร์กิวเมนต์ที่ชนิดไม่ตรงกัน และค่าที่ส่งกลับขาดหาย ใช้ isinstance เพื่อจำกัดชนิดข้อมูลแบบ Union ให้แคบลง ใช้ # type: ignore อย่างประหยัด และกำหนดค่า mypy ใน mypy.ini ค่อย ๆ เปิดใช้ --strict
คำถามที่พบบ่อย
บทเรียน “การเรียกใช้ mypy และแก้ข้อผิดพลาดด้านชนิดข้อมูล” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การเรียกใช้ mypy และแก้ข้อผิดพลาดด้านชนิดข้อมูล” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Python Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การเรียกใช้ mypy และแก้ข้อผิดพลาดด้านชนิดข้อมูล”
กำหนดค่า mypy ตีความข้อผิดพลาด และเพิ่มชนิดข้อมูลให้ฐานโค้ดทีละส่วน คุณปฏิบัติ Python Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Python Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Python Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “การเรียกใช้ mypy และแก้ข้อผิดพลาดด้านชนิดข้อมูล” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Python Academy นี้ได้ไหม
ได้ บทเรียน Python Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- คำอธิบายชนิดข้อมูลเบื้องต้น
- ชนิดข้อมูลซับซ้อน: List, Dict, Optional, Union
- TypeVar คลาสทั่วไป และ Protocol
- การเรียกใช้ mypy และแก้ข้อผิดพลาดด้านชนิดข้อมูล