0Pricing
Python Academy · บทเรียน

การเรียกใช้ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. คำอธิบายชนิดข้อมูลเบื้องต้น
  2. ชนิดข้อมูลซับซ้อน: List, Dict, Optional, Union
  3. TypeVar คลาสทั่วไป และ Protocol
  4. การเรียกใช้ mypy และแก้ข้อผิดพลาดด้านชนิดข้อมูล
← กลับไปที่ Python Academy