This thread解释说,可以通过将导入语句放在.py文件的末尾或限制导入范围来破坏导入循环。但是,这似乎是解决问题的一种非常糟糕的方法,主要是因为它极有可能无法维护(尤其是使用scope方法)。
作为刚发现asyncio的人,我想知道是否有一种方法可以使用它来处理导入循环,更重要的是,这是否是个好主意。例如,导入模块可能是一个可等待的任务,当模块准备就绪时,即在定义了所有必要属性后,该任务便已完成。
例如:
breakfast.py
cupboard.py
eggs
├── __init__.py
├── yolk.py
└── white.py
breakfast
从import eggs
开始,然后定义类ScrambledEggs
。 cupboard
导入breakfast
并定义两个类:Pan
和Plate
,这两个类都使用breakfast.ScrambledEggs
。 __init__.py
导入yolk
和white
,两者都从Pan
导入cupboard
来定义烹饪方法。但是,当它们导入cupboard
时,Pan
类定义会尝试使用尚未定义的breakfast.ScrambledEggs
。这会导致错误。
顺便说一句,我知道这个例子并不是很合理,但是我唯一能想到的就是早上9点钟饿狗。如果这是一个实际程序,则模块之间的交互将完全不同,但是出于示例的原因,请假定导入必须是它们在该程序中的方式。
无论如何,我解决这个问题的想法是将breakfast.py
中的导入定义为异步任务,并立即启动它们。然后,我将使ScrambledEggs
的定义成为一个可等待的任务,为此,cupboard
必须等待直到在其自己的代码中使用ScrambledEggs
(即定义Pan
和{{ 1}})。同样,Plate
和yolk
可以等到white
定义了cupboard
之后再继续使用该类。
这种事情可能吗?有更好的解决方案吗?还是我完全误解了Python中异步任务的用法和要点?抱歉,这是一个愚蠢的问题。