Рубрики
Без рубрики

Тип Python подсказка: Устранение ImporteRor из-за циркулярного импорта

Мы все сталкиваемся иногда импортирующим зеркаем из-за иметь круговой импорт, который произошел только для типа … Теги с Python, Django.

Мы все сталкиваемся иногда 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”