Как избежать циклического зацикливания импорта

#python #game-engine

Вопрос:

Я начинаю путаться с импортом в python. Похоже, у меня проблема с циклическим импортом, но я не уверен, как правильно решить эту проблему. Пример:

файл1:

 value = 5

import file2
file2.set()
 

файл2:

 import file1

def set():
    file1.value = 6
 

Комментарии:

1. Это очень широкий и запутанный вопрос. Как новичку, вам действительно не следует использовать exec . Даже будучи продвинутым программистом, я бы не стал его использовать. Чтобы избежать циклического импорта, в целом вы можете структурировать зависимости между модулями, взяв общий бит кода и поместив его в третий модуль, чтобы циклические модули больше не зависели друг от друга, но оба зависели от третьего. Продолжайте нарушать это до тех пор, пока ваша функциональность не будет правильно разделена.

2. Я нашел техническую статью, которая может вам помочь. support.esri.com/en/technical-article/000010647

Ответ №1:

У вас есть несколько вариантов:

  1. поместите весь свой код в один файл, если он должен быть так тесно связан
 value = 5

def set():
    value = 6

set()
 
  1. поместите код, который использует части других, в третий файл или, другими словами, разбейте свой код, чтобы избежать циклических ссылок — ваш пример, однако, слишком прост, чтобы это сработало.
  2. передайте значения функциям, которые вы хотите использовать, или передайте объекты, которые вы хотите изменить; импорт и изменение глобалов другого модуля-все равно не очень хороший способ разработки вашей программы:
 # this is my_module.py

def set_value(x):
    x.value = 6


def increment(x):
    return x   1
 

И в других местах:

 import my_module


class X:
    value = 5


x = X()
my_module.set_value(x)

y = 5
y = my_module.increment(y)
 

Комментарии:

1. Возможно, стоит упомянуть импорт функций, которые, хотя и не имеют отношения к делу, могут быть очень полезны при создании очень обобщенных библиотек