traceback را از پایین بخوانید
پیام خطای پایتون ترسناک به نظر میرسد ولی دقیقترین راهنمای شماست. آخرین خط نوع و پیام خطاست و خطهای بالاتر مسیر رسیدن به آن. در traceback های بلند، اولین فریمی را پیدا کنید که در فایلهای خودتان است؛ مشکل تقریباً همیشه همانجاست، نه در کتابخانه.
شش بیمار همیشگی
| خطا | علت رایج | درمان |
|---|---|---|
IndentationError / TabError | قاطی شدن Tab و فاصله؛ کد کپیشده از تلگرام یا Word | در VS Code: Convert Indentation to Spaces؛ همیشه ۴ فاصله |
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc7 | فایل قدیمی ویندوزی با کدگذاری cp1256 | encoding="cp1256"، سپس ذخیرهی دوباره با UTF-8 |
ModuleNotFoundError | venv فعال نیست، یا 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
بعد از این دوره چه بخوانیم؟
- پروژهی خودتان: همین برنامهی سفارش را گسترش دهید (خروجی CSV، جستوجو بر اساس مشتری، تست برای cli). هیچ دورهای جای یک پروژهی واقعی را نمیگیرد.
- دورهی پایتون پیشرفته: شیءگرایی عمیق، دکوراتور، generator، context manager، type hints جدی، asyncio و pytest حرفهای و بستهبندی پروژه.
- دورهی جامع جنگو:
Orderامروز به مدل جنگو،store.pyبه ORM وcli.pyبه پنل ادمین و صفحهی وب تبدیل میشود؛ همان پروژه، این بار برای چند کاربر همزمان. - گیت و 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__همنام را هم پاک کنید. - هر خطای ناآشنا را دقیقاً کپی کنید و بخشهای مخصوص خودتان (مسیر، نام متغیر) را حذف کنید؛ جستوجوی متن عینی پیام، سریعترین راه پیدا کردن کسی است که قبلاً همین مشکل را حل کرده.