【问题标题】:How to solve this Python import circular reference如何解决这个 Python 导入循环引用
【发布时间】:2016-07-10 22:32:15
【问题描述】:

我有一个 JCheq 类,带有一个名为“logger”的静态变量。

JCheq 导入模块printing_systems,但我需要使用来自printing_systemsJCheq.logger

import JCheq 放入printing_systems.py 后,我的代码无法编译。

jcheq.py

from printing_systems import printing_systems
from logger import logger

class JCheq:
    logger = logger.Logger('logs/jcheq.log', loglevel=logger.Logger.INFO)

    def __init__(self):
        pass
    ...

printing_systems/printing_systems.py

from jcheq import JCheq
class WinLPR:

    def __init__(self):
        pass

    @staticmethod
    def send(spool, params):
        temp_dir = tempfile.mkdtemp()
        try:
            JCheq.logger.log('Creando archivo temporal en dir: ' + temp_dir, logger.Logger.TRACE)

错误跟踪:

Traceback (most recent call last):
  File "/home/jsivil/Desktop/Proyectos/UNPAZ/jcheq/jcheq/jcheq.py", line 12, in <module>
    from printing_systems import printing_systems
  File "/home/jsivil/Desktop/Proyectos/UNPAZ/jcheq/jcheq/printing_systems/printing_systems.py", line 7, in <module>
    from jcheq import JCheq
  File "/home/jsivil/Desktop/Proyectos/UNPAZ/jcheq/jcheq/jcheq.py", line 12, in <module>
    from printing_systems import printing_systems
ImportError: cannot import name 'printing_systems'

【问题讨论】:

  • 不要再循环引用(分解printing_systems,例如)。或者您可以“作弊”并将导入从全局范围移到使用它的位置。
  • 嗯...printing_systems 模块中是否有一个名为printing_systems 的变量?您正在尝试从模块中导入变量,而不仅仅是 import printing_systems
  • @BrianCain 是的,我将导入移到了方法中,现在它可以工作了,但我不知道这是否可以接受……分解是什么意思?
  • @TadhgMcDonald-Jensen printing_systems.py 在 printing_systems 目录中。我没有找到使它更简单的方法。
  • 这意味着您正在尝试从包中导入并且需要__init__.py 以便 python 将其识别为包

标签: python python-3.x python-import python-module circular-reference


【解决方案1】:

在函数中移动import语句常用于解决循环导入。在重构应用程序成本太高(如果有用的话)的情况下,它会很方便。

另一种解决方案是将JCheq.logger 移动到jcheq.pyprinting_systems/printing_systems.py 都将导入的自己的模块中。

或者,您可以使 logger.Logger 成为由某个注册表支持的工厂函数(或简单地对其进行记忆),以便在给出相同参数时返回相同的记录器。这样,printing_system.py 将简单地导入 logger 而不是导入 jcheq

【讨论】:

  • 嗯,我选择了工厂方法,似乎可行。我发现的一个问题是,由于 import printing_systems 在 JCheq 之上,我必须先导入 LoggerFactory,然后让 logger 成为全局变量,然后再导入 print_systems。否则将首先解析printing_systems并创建具有相同路径但不同log_level的记录器(因为log_level应该只设置一次并且它是一个可选参数)
  • 你试过记忆logger.Logger吗?由于您使用的是 Python 3,因此您可以使用 functools.lru_cache 快速完成此操作。我认为这将解决进口订单问题。
猜你喜欢
  • 1970-01-01
  • 2019-09-12
  • 1970-01-01
  • 1970-01-01
  • 2020-01-09
  • 2023-03-29
  • 2011-10-19
  • 2020-11-01
  • 2020-05-18
相关资源
最近更新 更多