رفتن به محتوای اصلی
برنامه‌سازی پیشرفته با پایتون درس‌نامهٔ آزاد
مفهوم پیشرفته ۹ دقیقه

اعلان نوع و جنریک‌ها

typing، TypeVar، Generic و Protocol: طراحی نوع‌محور بدون ادعای اجبار اجرایی.

from typing import TypeVar, Generic

T = TypeVar("T")

class Stack(Generic[T]):
    def __init__(self) -> None:
        self._items: list[T] = []
    def push(self, item: T) -> None:
        self._items.append(item)
    def pop(self) -> T:
        if not self._items:
            raise IndexError("پشته خالی است.")
        return self._items.pop()

سه حقیقتِ مهم: (۱) اعلان نوع در اجرا اجبار نمی‌شود — Stack[str] جلوی push(123) را نمی‌گیرد؛ (۲) ارزشش در خوانایی و بررسی ایستا با mypy است؛ (۳) برای رفتارِ واقعاً متفاوت بین نوع‌ها (نه فقط برچسب نوع) از functools.singledispatch استفاده کن، نه از تقلیدِ overload جاوا — پایتون overload امضایی ندارد و امضای دوم، اولی را جایگزین می‌کند.

برداشت نادرست رایج

اشتباه رایج

چون پایتون overload ندارد، باید چند متد هم‌نام با امضای متفاوت نوشت.

تصحیح

تعریف دوم، اولی را پاک می‌کند. راه پایتونیک: آرگومان پیش‌فرض، آرگومان کلیدی‌اجباری (*) و در نیاز واقعی، singledispatch است.

مطالب مرتبط

از همین بخش و با برچسب‌های مشترک

این مطلب را خواندید؟ آن را علامت بزنید تا پیشرفت شما روی همین دستگاه ذخیره شود.

وضعیت پیشرفت برای اعلان نوع و جنریک‌ها