Мы все сталкиваемся иногда ImporteRor
Из-за иметь круговой импорт, который происходит только для подсказки к типу. Есть простой способ справиться с такими проблемами. Давайте возьмем, у нас есть два файла, такие как следующие:
#book_manager.py from django.db import models class BookManager(models.Manager): def create_new_version_of_book(self, old_book_object, version): return self.create(name=old_book_object.name, version=version)
Другой файл:
from django.db import models from library.models import BookManager class Book(models.Model): name = models.CharField(max_length=200) version = models.CharField(max_length=50) objects = BookManager()
Эти два файла будут работать нормально, поскольку мы не добавили какой-либо подсказки. Только BookManager
импортируется в book_model.py
файл. Но если мы добавим тип подсказки к create_new_version_of_book
Метод от BookManager
Тогда будет выглядеть следующим образом:
from django.db import models from library.models import Book class BookManager(models.Manager): def create_new_version_of_book(self, old_book_object: Book, version: str) -> Book: return self.create(name=old_book_object.name, version=version)
Вот теперь мы получим ImporteRor
Из-за циркулярного импорта И мы получим что-то вроде сообщения ниже, когда мы хотим запустить проект/файлы:
ImportError: cannot import name 'BookManager' from partially initialized module 'library.models' (most likely due to a circular import)
Решение использует печатать. Type_checking
Константа, как показано ниже:
from __future__ import annotations from typing import TYPE_CHECKING from django.db import models if TYPE_CHECKING: from library.models import Book class BookManager(models.Manager): def create_new_version_of_book(self, old_book_object: Book, version: str) -> Book: return self.create(name=old_book_object.name, version=version)
Линия 1: Мы импортировали аннотации. __future __. Аннотации
не по умолчанию в Python сейчас; Но это станет по умолчанию в Python 3.11. Подробнее, вы смотрите в PEP 563. Если вы не импортируете его, вы можете использовать подсказки типа в виде строки. В нашем случае это будет Old_Book_Object: «Книга»
Отказ
Строка 3: Мы импортировали печатать. Type_checking
Специальная константа. Значение константы всегда ложно, но установлено значение TRUE любыми шашками типа, например Mypy. Мы использовали эту константу, чтобы сделать наш импортный условный.
Строка 7-8: Мы импортировали модель с условием, поэтому он будет импортирован только тогда, когда переменная Type_Checking True.
Надеюсь, это поможет.:)
Оригинал: “https://dev.to/iammumin/python-type-hinting-eliminating-importerror-due-to-circular-imports-3ihh”