فصل ۸: پروژه و حرفه‌ای شدن — پروژه‌ی پایانی، API، تست، دیباگ و کلینیک خطا

کلینیک خطاهای رایج و نقشه‌ی راه بعد از این دوره

traceback را از پایین بخوانید

پیام خطای پایتون ترسناک به نظر می‌رسد ولی دقیق‌ترین راهنمای شماست. آخرین خط نوع و پیام خطاست و خط‌های بالاتر مسیر رسیدن به آن. در traceback های بلند، اولین فریمی را پیدا کنید که در فایل‌های خودتان است؛ مشکل تقریباً همیشه همان‌جاست، نه در کتابخانه.

شش بیمار همیشگی

خطاعلت رایجدرمان
IndentationError / TabErrorقاطی شدن Tab و فاصله؛ کد کپی‌شده از تلگرام یا Wordدر VS Code: Convert Indentation to Spaces؛ همیشه ۴ فاصله
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc7فایل قدیمی ویندوزی با کدگذاری cp1256encoding="cp1256"، سپس ذخیره‌ی دوباره با UTF-8
ModuleNotFoundErrorvenv فعال نیست، یا VS Code مفسر دیگری را اجرا می‌کندبررسی sys.executable و نصب با python -m pip
TypeErrorجمع str و int، صدا زدن روی None، آرگومان جاافتادهخواندن پیام کامل؛ type(x) در دیباگر
تغییر «خودبه‌خود» دادهدو نام برای یک لیست (فصل ۴)copy()، deepcopy یا ساختن لیست تازه
ReadTimeoutError در pipکندی یا قطعی PyPI از ایرانمیرور ایرانی و --default-timeout=120 (فصل ۱)

نمونه‌های کد

import sys
from copy import deepcopy
from pathlib import Path

# ۱) کدام پایتون در حال اجراست؟ اولین قدم برای ModuleNotFoundError
print(sys.executable)          # باید داخل ...\.venv\Scripts\ باشد


# ۲) خواندن فایل قدیمی و جدید؛ ترتیب مهم است
def read_text_any(path: Path) -> str:
    for enc in ("utf-8-sig", "cp1256"):
        try:
            return path.read_text(encoding=enc)
        except UnicodeDecodeError:
            continue
    return path.read_text(encoding="utf-8", errors="replace")


# ۳) TypeError های کلاسیک
price = "57000000"             # از input یا CSV: همیشه str
total = 0 + int(price)         # بدون int: unsupported operand type(s) for +
codes = ["KSH-103", "KSH-101"]
result = codes.sort()          # sort درجا مرتب می‌کند و None برمی‌گرداند
print(result, codes[0])        # None KSH-101 — پس result[0] یعنی TypeError

# ۴) دام کپی: همه‌ی کلیدها یک لیست مشترک دارند
by_design = dict.fromkeys(["افشان", "ماهی"], [])
by_design["افشان"].append("KSH-101")
print(by_design)               # هر دو طرح KSH-101 دارند!
by_design = {d: [] for d in ["افشان", "ماهی"]}   # درست
snapshot = deepcopy(by_design) # کپی مستقل از ساختار تودرتو
python -m pip install jdatetime --default-timeout=120 -i https://mirror-pypi.runflare.com/simple
Get-Command python | Select-Object Source

بعد از این دوره چه بخوانیم؟

  1. پروژه‌ی خودتان: همین برنامه‌ی سفارش را گسترش دهید (خروجی CSV، جست‌وجو بر اساس مشتری، تست برای cli). هیچ دوره‌ای جای یک پروژه‌ی واقعی را نمی‌گیرد.
  2. دوره‌ی پایتون پیشرفته: شیءگرایی عمیق، دکوراتور، generator، context manager، type hints جدی، asyncio و pytest حرفه‌ای و بسته‌بندی پروژه.
  3. دوره‌ی جامع جنگو: Order امروز به مدل جنگو، store.py به ORM و cli.py به پنل ادمین و صفحه‌ی وب تبدیل می‌شود؛ همان پروژه، این بار برای چند کاربر هم‌زمان.
  4. گیت و SQL: هر پروژه‌ی جدی کنترل نسخه و پایگاه داده می‌خواهد؛ دوره‌های گیت و PostgreSQL آکادمی مکمل همین مسیرند.

نکته‌هایی که کمتر کسی می‌داند

  • متن کپی‌شده از تلگرام یا وب گاهی فاصله‌ی نشکن (U+00A0) دارد و پایتون خطای عجیب invalid non-printable character U+00A0 می‌دهد؛ در VS Code با Find و regex   پیدا و با فاصله‌ی عادی جایگزین کنید.
  • cp1256 تقریباً هر بایتی را بدون خطا می‌خواند، پس اگر اول آن را امتحان کنید، فایل UTF-8 هم «باز می‌شود» ولی به‌صورت حروف درهم؛ همیشه اول UTF-8، بعد cp1256.
  • در ویندوز، فرمان python گاهی به نسخه‌ی جعلی Microsoft Store اشاره می‌کند که فقط فروشگاه را باز می‌کند؛ از App execution aliases در تنظیمات ویندوز خاموشش کنید.
  • نام‌گذاری فایل یا پوشه‌ای به اسم کتابخانه (مثلاً jdatetime.py) خطای partially initialized module می‌دهد؛ پوشه‌ی __pycache__ هم‌نام را هم پاک کنید.
  • هر خطای ناآشنا را دقیقاً کپی کنید و بخش‌های مخصوص خودتان (مسیر، نام متغیر) را حذف کنید؛ جست‌وجوی متن عینی پیام، سریع‌ترین راه پیدا کردن کسی است که قبلاً همین مشکل را حل کرده.

برای ذخیره‌ی پیشرفت و شرکت در آزمون، وارد شوید — رایگان است.