【问题标题】:NameError: name is not defined. Circular ImportingNameError:名称未定义。循环导入
【发布时间】:2018-05-30 02:56:58
【问题描述】:

我遇到了循环导入问题。我有 2 个像这样的类文件:

--/service
    service_module.py
    settings.py

service_module 导入整个项目中使用的其他各种文件,并充当整个项目中各种功能的容器。我想在我的 settings.py 文件中断言它已正确传递了 service_module 父类的实例。删除 settings.py 中的 assert 语句可以解决问题,并且我能够正确调用 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

编辑: 所以改成这个解决了我的问题,虽然我觉得它有点老套而且不正确。

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)

【问题讨论】:

    标签: python import


    【解决方案1】:

    您需要延迟一个(或两个)文件的导入,以中断循环导入。您可以通过将 import 语句从文件范围(在导入模块后立即执行)移动到函数或方法的执行范围,直到调用该方法才执行。即)

    class setting(QObject):
        def __init__(self, service_module):
            from service.service_module import *              # <-- import is here
            assert isinstance(self.service, Service_Module)
    

    当然,这可能会影响从该模块导入到此文件中的符号的其他用途,因此您可能需要在多个地方指定导入。

    【讨论】:

      猜你喜欢
      • 2016-08-01
      • 1970-01-01
      • 2023-01-07
      • 2018-01-24
      • 1970-01-01
      • 2021-04-15
      • 2019-01-26
      • 2021-10-05
      相关资源
      最近更新 更多