تلميح النوع في بايثون بدون الواردات الدورية
في محاولة لتقسيم فئة كبيرة إلى فئتين أصغر، تواجه مشكلة الدورية الواردات. تستورد الفئة "الرئيسية" فئة 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. يمكن أن يؤدي ذلك إلى تحسين دقة التحقق من النوع.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3