پاسخ تمرین کلاس ژنریک در پایتون

Please login to bookmark Close

پاسخ تمرین کلاس ژنریک در پایتون

در واقع، در این صفحه پاسخ تمرین کلاس ژنریک در پایتون را همراه با کد کامل و توضیح هر تصمیم می‌بینید.

نام دورهدوره تایپ‌هینت در پایتون
درسنامهفصل دهم: کلاس‌های ژنریک
تمرین‌هامشاهده تمرین‌ها
from typing import Self


class Result[T]:
    def __init__(self, value: T | None, error: str | None) -> None:
        self.value = value
        self.error = error

    @classmethod
    def ok(cls, value: T) -> "Result[T]":
        return cls(value, None)

    @classmethod
    def fail(cls, message: str) -> "Result[T]":
        return cls(None, message)

    def is_ok(self) -> bool:
        return self.error is None

    def unwrap(self) -> T:
        if self.error is not None:
            raise ValueError(self.error)
        if self.value is None:
            raise ValueError("مقداری وجود ندارد")
        return self.value

    def unwrap_or(self, default: T) -> T:
        if self.error is not None or self.value is None:
            return default
        return self.value

استفاده:

def find_user(user_id: int) -> Result[dict]:
    user = db.get(user_id)
    if user is None:
        return Result.fail(f"کاربر {user_id} یافت نشد")
    return Result.ok(user)


result = find_user(42)
if result.is_ok():
    print(result.unwrap()["name"])
else:
    print(result.error)

name = find_user(999).unwrap_or({"name": "مهمان"})

سه نکته در این پاسخ اهمیت دارد.

خروجیِ ok و fail را "Result[T]" نوشتیم و نه Self. در این مثال Self هم کار می‌کرد، اما نوشتنِ نوع داخل کوتیشن صریح‌تر نشان می‌دهد که نوعِ داخلی هم حفظ می‌شود.

آن دو raise در unwrap عمدی‌اند، زیرا Result قرار است شما را وادار کند به خطا فکر کنید. اگر مستقیم unwrap را صدا بزنید و خطایی وجود داشته باشد، برنامه با استثنا متوقف می‌شود و همین رفتار درست است.

الگوی Result ممکن است آشنا به نظر برسد، زیرا زبان‌های Rust و Swift همین را در دلِ زبان دارند. در پایتون با ژنریک‌ها می‌توانید خودتان آن را بسازید.

چگونه از پاسخ تمرین کلاس ژنریک در پایتون بیشترین بهره را ببرید

پیش از خواندن کد، خودتان یک بار تمرین را حل کنید. مطالعه‌ی پاسخ تمرین کلاس ژنریک در پایتون وقتی اثر دارد که پیش‌تر خودتان تلاش کرده باشید.

  • کد خودتان را با کد این صفحه خط به خط مقایسه کنید.
  • هر جا تفاوتی دیدید، دلیلش را در درسنامه دوباره بخوانید.
  • کد را با دستور mypy بررسی کنید تا مطمئن شوید خطایی باقی نمانده است.
  • یک نسخه‌ی دیگر از پاسخ بنویسید که همان کار را ساده‌تر انجام دهد.

مرجع رسمی این موضوع مستندات ماژول typing در پایتون است که همه‌ی این ابزارها را با مثال شرح داده است.

Please login to bookmark Close
نظرات

دیدگاهتان را بنویسید

فهرست مطالب

سرفصل دوره

تمرین

این قسمت تمرین ندارد!

پاسخ تمرین ها

هنوز برای تمرین‌های این قسمت پاسخی ثبت نشده است!

اشتراک گذاری

چرا بهتره از فیلترشکن استفاده کنید؟

من همه ویدئو ها و پادکست های کُدباز رو توی یوتیوب و ساندکلود و پلتفرم هایی آپلود می‌کنم که اغلب فیلتر هستند.

اغلب آموزش‌ها ویدئو و پادکست دارند. پس اگر می‌خواهید از محتوای سایت بیشترین استفاده رو ببرید نیاز به فیلتر شکن دارید.

توجه داشته باشید که برای خرید از فروشگاه بهتره فیلتر شکن رو خاموش کنید.

تنظیمات

انتخاب زبان
تغییر تم