Круговой импорт на Python - PullRequest
       22

Круговой импорт на Python

1 голос
/ 23 января 2020

Ну, я пытаюсь настроить fileA, который имеет функции от fileB. Внутри file B я использую некоторые переменные из file A. Это что-то вроде этого:

fileA
import fileB
a = []
fileB.function1()

и файл B:

fileB
import fileA
def function1():
 fileA.a.extend([2, 3])

но я получаю эту ошибку:

AttributeError: module 'fileB' has no attribute 'function1'

Я знаю, что есть вопрос о множественных кучах то же самое, но я не видел, чтобы у кого-то была такая ошибка, и до сих пор я не могу найти решение

Ответы [ 2 ]

2 голосов
/ 23 января 2020

@ brunodesthuilliers, как бы вы избежали циклических зависимостей в этом случае?

Я бы сначала спросил, почему f1 хочет вызвать функцию в f2, которая хочет прикоснуться к переменной в f1 , Поскольку все, что у нас есть, это игрушечный пример вне контекста, невозможно дать один универсальный ответ, но есть как минимум три основных решения:

1. переместить функцию f2.function назад в f1.

Если оба должны знать друг друга так близко, зачем разделять их?

f1.py:

def function():
   a.extend([2, 3, 4]])

a = []

f2.py

import f1
f1.function()
print(f1.a)

2. переместить вызов функции f2. в другом модуле f3

поэтому f1 не должен знать о f2.

f1.py

a = []

f2.py

import f1

def function():
   f1.a.extend([2, 3, 4]])

f3.py

import f1
import f2

# this is really ugly... spooky action at distance.
f2.function()
print(f1.a)

3. измените f2.function, чтобы она принимала a в качестве аргумента

, чтобы f2 не знал о f1

f1.py

import f2
a = []
f2.function(a)

f2.py

def function(a):
    a.append([2, 3, 4])
1 голос
/ 23 января 2020

В этом случае вы можете использовать локальный импорт вместо глобального. Я видел много этого в исходном коде OpenStack.

f1.py

import f2
a = []
f2.function1()

f2.py

def function1():
  import f1
  f1.a.extend([2, 3])
...