Модуль Python API и pytest: реальные тесты нуждаются в личных данных для входа в систему, как обрабатывать (без насмешек)

Как и другие ответы, этот шаблон допустим в python:

def dostuff(self):
     from foo import bar
     ...

. Это позволит избежать выполнения оператора импорта, когда файл импортируется другими модулями. Только если существует логическая циклическая зависимость, это не сработает.

Большинство Circular Imports на самом деле не являются логическим циклическим импортом, а скорее повышают ошибки ImportError из-за того, как import() оценивает операторы верхнего уровня весь файл при вызове.

Эти ImportErrors можно почти всегда избегать, если вы действительно хотите, чтобы ваш импорт был сверху:

Рассмотрим этот циклический импорт:

App A

# profiles/serializers.py

from images.serializers import SimplifiedImageSerializer

class SimplifiedProfileSerializer(serializers.Serializer):
    name = serializers.CharField()

class ProfileSerializer(SimplifiedProfileSerializer):
    recent_images = SimplifiedImageSerializer(many=True)

Приложение B

# 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: Вы должны прочитать весь этот пост в голосе Дэвида Бэйсли.

0
задан Tim Richardson 17 January 2019 в 22:05
поделиться

0 ответов

Другие вопросы по тегам:

Похожие вопросы: