Как импортировать файлы, которые взаимно импортируют друг друга?

Как импортировать функцию и словарь, которые взаимно импортируют друг друга. Эти два файла уже находятся в одном и том же каталоге, поэтому нет необходимости импортировать sid. Кроме того, это рекурсивно, поэтому он не может импортировать. Как импортировать словарь из файла друг друга, не делая его рекурсивным и не вызывая ошибку?

Я пошел на этот сайт здесь, но он не ответил на мой вопрос и не предоставил пример кода, чтобы помочь мне, поэтому я создал этот вопрос с тестовым кодом, чтобы объяснить мою проблему.

скажем, у меня есть эти два файла: boxA и boxR, каждый имеет словарь keyA и keyR и функции с именем generatekeyA и generatekeyR

в коробке А:

import json 
from tinydb import TinyDB, Query
from boxR import keyR

def generatekeyA():

    keyA = {}

    serialnoA = 'Serial_noA'
    secretidA = 'Secret_idA'

    count = 0
    while (count <5): 

    serial = generate key 
    id = generate id 


    keyA[serialnoA].append(serial)
    keyA[secretidA].append(id)


    with open("/home/pi/Desktop/json/output.json", 'w+'):
        db = TinyDB('/home/pi/Desktop/json/output1.json')
        table = db.table('A KEYS')
        db.insert_multiple([{'Serial number A' :  keyA[serialnoA]}])
        db.insert_multiple([{'Secret id A' : keyA[secretidA]}])
        db.insert_multiple([{'Secret id R' : keyR[secretidR]}])

generatekeyA()

в коробке R:

import json 
from tinydb import TinyDB, Query
from boxA import keyA

def generatekeyR():

    keyR = {}

    serialnoR = 'Serial_noR'
    secretidR = 'Secret_idR'

    count = 0
    while (count <5): 

    serialR = generate key 
    idR = generate id 


    keyR[serialnoR].append(serialR)
    keyR[secretidR].append(idR)


    with open("/home/pi/Desktop/json/output2.json", 'w+'):
        db = TinyDB('/home/pi/Desktop/json/output2.json')
        table = db.table('R KEYS')
        db.insert_multiple([{'Serial number R' :  keyR[serialnoR]}])
        db.insert_multiple([{'Secret id R' : keyR[secretidR]}])
        db.insert_multiple([{'Secret id A' : keyA[secretidA]}])


generatekeyA()

Позвольте мне объяснить коды выше. У меня есть 2 файла, которые генерируют ключи для меня, после чего я должен экспортировать вывод в файл JSON. Файл output.json выводит собственный серийный номер и секретный идентификатор ключа А и только секретный ключ и ключ ключа R в файл output2.json. но дело в том, что несмотря на то, что я исследую рекурсивные результаты, я все еще не понимаю, как это исправить, потому что он не предоставляет пример кода в качестве руководства. Каков наилучший способ приблизиться к этому, чтобы мне не нужно было вносить значительные изменения в файл (ы)?

Ошибка говорит мне, что это может быть рекурсивная ошибка:

Traceback (most recent call last):
File "/home/pi/Desktop/boxA.py", line 7, in <module>
from boxR import keyR
File "/home/pi/Desktop/boxR.py", line 11, in <module>
from boxA import keyA
File "/home/pi/Desktop/boxA.py", line 7, in <module>
from boxR import keyR
ImportError: cannot import name 'keyA'

3 ответа

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

Вы можете найти эту статью интересной. По сути, когда вы делаете рекурсивную зависимость, импортированные модули находят друг друга как пустой модуль во время выполнения оператора импорта. И, таким образом, эта ошибка проявляется

В коробке А:

def generatekeyA():
  from boxR import keyR
  do whatever you need to with keyR

keyA = {}

в коробке R:

def generatekeyR():
  from boxA import keyA
  do whatever you need to with keyA

keyR = {}

ОБНОВИТЬ

Если вы все еще видите проблему, вы, вероятно, не удалили импорт для keyR из глобальной области видимости boxA и импорт keyA из глобальной области видимости boxR. Например, это работает как ожидалось:

################# The file, boxR.py
def generatekeyR():
  from boxA import keyA
  print 'In generatekeyR'

keyR = {}

################# The file, boxA.py
def generatekeyA():
  from boxR import keyR
  print 'In generatekeyA'

keyA = {}

################# The file, box.py
#!/usr/bin/env python
import boxR
import boxA
from boxR import generatekeyR
from boxA import generatekeyA

generatekeyR()
generatekeyA()

Из командной строки bash:

> ./box.py
In generatekeyR
In generatekeyA

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

Основываясь на некоторых предположениях, которые я сделал (самое главное, что with заявление, которое добавляет в базу данных происходит за пределами while петля) вот что я придумала. Таким образом, изменения:

  1. Изменены функции генерации ключей на return ключи, которые они генерируют.

  2. Создан новый файл Python (называется new.py, но вы можете называть это как хотите), который обрабатывает обновление базы данных.

  3. Импортированные функции генерации в new.py и вызвал их там, прежде чем выполнить with утверждение, которое требует оба ключа.

И вот код, с которым я закончил. Надеюсь, поможет.

boxA.py

def generatekeyA():

    keyA = {}

    serialnoA = 'Serial_noA'
    secretidA = 'Secret_idA'

    count = 0
    while (count <5): 

        serial = generate key 
        id = generate id 

        keyA[serialnoA].append(serial)
        keyA[secretidA].append(id)

        # Also need to update count

    return keyA

boxR.py

def generatekeyR():

    keyR = {}

    serialnoR = 'Serial_noR'
    secretidR = 'Secret_idR'

    count = 0
    while (count <5): 

        serialR = generate key 
        idR = generate id

        keyR[serialnoR].append(serialR)
        keyR[secretidR].append(idR)

        # Also need to update count

    return keyR

new.py

import json 
from tinydb import TinyDB, Query
from boxA import generatekeyA()
from boxR import generatekeyR()

keyA = generatekeyA()
keyR = generatekeyR()

with open("/home/pi/Desktop/json/output2.json", 'w+'):
    db = TinyDB('/home/pi/Desktop/json/output2.json')
    table = db.table('R KEYS')
    db.insert_multiple([{'Serial number R' :  keyR[serialnoR]}])
    db.insert_multiple([{'Secret id R' : keyR[secretidR]}])
    db.insert_multiple([{'Secret id A' : keyA[secretidA]}])
Другие вопросы по тегам