"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيفية حل الواردات الدورية لتلميح النوع في بايثون؟

كيفية حل الواردات الدورية لتلميح النوع في بايثون؟

تم النشر بتاريخ 2024-11-17
تصفح:936

How to Resolve Cyclic Imports for Type Hinting in Python?

تلميح النوع في بايثون بدون الواردات الدورية

في محاولة لتقسيم فئة كبيرة إلى فئتين أصغر، تواجه مشكلة الدورية الواردات. تستورد الفئة "الرئيسية" فئة mixin، وتشير فئة mixin إلى الفئة "الرئيسية" في تلميح نوعها. يؤدي هذا إلى دورة استيراد، مما يمنع تلميح النوع من العمل بشكل صحيح.

لحل هذه المشكلة، يمكنك مراعاة الطريقة التالية:

# main.py
from __future__ import annotations
from typing import TYPE_CHECKING, Any

if TYPE_CHECKING:
    from mixin import MyMixin

class Main(object):
    def func1(self, xxx: Any):
        ...
# mixin.py
from __future__ import annotations
from typing import TYPE_CHECKING, Any

if TYPE_CHECKING:
    from main import Main

class MyMixin(object):
    def func2(self: Main, xxx: Any):
        ...

في هذا المثال، يتم استخدام ثابت TYPE_CHECKING الخاص بـ Python لاستيراد الفئة "الرئيسية" بشكل مشروط. عند تشغيل التعليمات البرمجية، يتم تخطي عبارة الاستيراد نظرًا لأن الثابت هو False. ومع ذلك، فإن أدوات التحقق من النوع مثل mypy تفسر الكود الموجود داخل كتلة if TYPE_CHECKING وتتعرف على التعليق التوضيحي للنوع لـ func2.

هناك طريقة أخرى تتضمن استخدام مرجع أمامي:

# mixin.py
from __future__ import annotations
from typing import TYPE_CHECKING, Any

if TYPE_CHECKING:
    from main import Main

class MyMixin(object):
    def func2(self, xxx: 'Main'):
        ...

هنا، التعليق التوضيحي للنوع الخاص بـ func2 عبارة عن سلسلة تمثل اسم الفئة التي سيتم استيرادها لاحقًا. يتطلب كلا الأسلوبين استخدام Python 3.7 أو أعلى للعمل بفعالية مع تلميحات الكتابة.

تذكر أن استخدام mixins وتلميحات الكتابة قد يتطلب بنية إضافية في التعليمات البرمجية الخاصة بك. على سبيل المثال، يوصي mypy بإنشاء فئة أساسية مجردة (ABC) ترث منها الفئتان "الرئيسية" وmixin. يمكن أن يؤدي ذلك إلى تحسين دقة التحقق من النوع.

بيان الافراج أعيد طبع هذه المقالة على: 1729656617 في حالة وجود أي انتهاك، يرجى الاتصال بـ [email protected] لحذفها
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3