我遇到循环导入问题。我有两个类文件:
--/service
service_module.py
settings.py
service_module导入整个项目中使用的其他各种文件,并充当整个项目中各种功能的容器。我想在我的settings.py文件中声明它正确传递了service_module父类的实例。删除settings.py中的断言语句可以解决问题,我可以正确调用service_module类中的方法。对于代码完成和错误检查,它使我的生活更容易断言。
我一直在努力理解python导入,但这是处理我的特定情况的正确方向吗?
service_module.py
from PyQt5.QtCore import QObject
from sqlalchemy import *
from sqlalchemy.orm import scoped_session, Session, sessionmaker
from service.logger import logger
from sqlalchemy.orm.exc import NoResultFound
from database.tables import *
from database.load_db import load_db
from service.settings import settings
from service.web_listener import web_listener
from service.character_manager import character_manager
class Service_Module(QObject):
def __init__(self):
super(Service_Module, self).__init__()
load_database = load_db()
self.sc_session: scoped_session = load_database.get_scoped_session()
tb_scopes.make_default_scopes(service_module=self)
self.logger = logger(service_module=self)
self.settings = settings(service_module=self)
self.characters = character_manager(service_module=self)
self.callback_listener: web_listener = web_listener(service_module=self)
self.callback_listener.start()
assert isinstance(self.sc_session, scoped_session)
assert isinstance(self.logger, logger)
assert isinstance(self.settings, settings)
assert isinstance(self.callback_listener, web_listener)
settings.py
from service.service_module import *
class settings(QObject):
def __init__(self, service_module):
super(settings, self).__init__()
self.service = service_module
assert isinstance(self.service, Service_Module) ##raises NameError: name 'Service_Module' is not defined
编辑: 因此,改变这个问题可以解决我的问题,虽然我觉得它有点像hacky并且不知何故不正确。
from service.service_module import *
import service.service_module
class settings(QObject):
def __init__(self, service_module):
super(settings, self).__init__()
self.service = service_module
assert isinstance(self.service, service.service_module.Service_Module)
答案 0 :(得分:0)
您需要延迟导入一个(或两个)文件,以打破循环导入。您可以通过将import语句从文件范围(在导入模块后立即执行)移动到函数或方法的执行范围中来执行此操作,在调用该方法之前不执行该操作。即)
class setting(QObject):
def __init__(self, service_module):
from service.service_module import * # <-- import is here
assert isinstance(self.service, Service_Module)
当然,这可能会影响该模块中导入符号的其他用法,因此您可能需要在多个位置指定导入。