Как и другие ответы, этот шаблон допустим в python:
def dostuff(self):
from foo import bar
...
. Это позволит избежать выполнения оператора импорта, когда файл импортируется другими модулями. Только если существует логическая циклическая зависимость, это не сработает.
Большинство Circular Imports на самом деле не являются логическим циклическим импортом, а скорее повышают ошибки ImportError
из-за того, как import()
оценивает операторы верхнего уровня весь файл при вызове.
Эти ImportErrors
можно почти всегда избегать, если вы действительно хотите, чтобы ваш импорт был сверху:
Рассмотрим этот циклический импорт:
# profiles/serializers.py
from images.serializers import SimplifiedImageSerializer
class SimplifiedProfileSerializer(serializers.Serializer):
name = serializers.CharField()
class ProfileSerializer(SimplifiedProfileSerializer):
recent_images = SimplifiedImageSerializer(many=True)
# images/serializers.py
from profiles.serializers import SimplifiedProfileSerializer
class SimplifiedImageSerializer(serializers.Serializer):
title = serializers.CharField()
class ImageSerializer(SimplifiedImageSerializer):
profile = SimplifiedProfileSerializer()
От David Beazleys отличный разговор Модули и пакеты: Live и Let Die! - PyCon 2015 , 1:54:00
, вот способ обработки круговых импортов в python:
try:
from images.serializers import SimplifiedImageSerializer
except ImportError:
import sys
SimplifiedImageSerializer = sys.modules[__package__ + '.SimplifiedImageSerializer']
Это попытка импортировать SimplifiedImageSerializer
, и если ImportError
поднят, потому что он уже импортируется, он вытащит его из importcache.
PS: Вы должны прочитать весь этот пост в голосе Дэвида Бэйсли.