Typhinweise in Python ohne zyklische Importe
Beim Versuch, eine große Klasse in zwei kleinere aufzuteilen, stoßen Sie auf das Problem der zyklischen Importe. Die „Haupt“-Klasse importiert die Mixin-Klasse und die Mixin-Klasse verweist in ihrem Typhinweis auf die „Haupt“-Klasse. Dies führt zu einem Importzyklus, der verhindert, dass die Typhinweise ordnungsgemäß funktionieren.
Um dieses Problem zu beheben, können Sie den folgenden Ansatz in Betracht ziehen:
# 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):
...
In diesem Beispiel wird die TYPE_CHECKING-Konstante von Python verwendet, um die „Haupt“-Klasse bedingt zu importieren. Beim Ausführen des Codes wird die Importanweisung übersprungen, da die Konstante False ist. Typprüfungstools wie mypy interpretieren jedoch den Code innerhalb des if TYPE_CHECKING-Blocks und erkennen die Typanmerkung für func2.
Ein anderer Ansatz beinhaltet die Verwendung einer Vorwärtsreferenz:
# 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'):
...
Hier ist die Typanmerkung für func2 eine Zeichenfolge, die den Namen der Klasse darstellt, die später importiert wird. Beide Ansätze erfordern die Verwendung von Python 3.7 oder höher, um effektiv mit Typhinweisen arbeiten zu können.
Bedenken Sie, dass die Verwendung von Mixins und Typhinweisen möglicherweise eine zusätzliche Strukturierung in Ihrem Code erfordert. Mypy empfiehlt beispielsweise, eine abstrakte Basisklasse (ABC) zu erstellen, von der sowohl Ihre „Haupt“- als auch Ihre Mixin-Klasse erben. Dies kann die Genauigkeit der Typprüfung verbessern.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3