如何打破Python中的导入循环

31 投票
1 回答
43031 浏览
提问于 2025-04-17 00:22

我遇到了一个问题,有两个相关的大型 Python 类,所以我把它们放在了不同的文件里。假设这两个类分别叫做 Cobra 和 Rat。

现在我需要在 Cobra 的方法中调用 Rat 的方法,同时也需要在 Rat 的方法中调用 Cobra 的方法。

为此,我需要在 Rat.py 文件中导入 Cobra,而在 Cobra.py 文件中导入 Rat。

这样做就会产生一个导入循环,导致错误。因为不能在 Cobra 里面导入 Cobra 自己。

那该怎么解决这个问题呢?

Cobra.py:

import Rat
class Cobra():
    def check_prey(self, rat ):
        # Some logic 
        rat.foo()

Rat.py:

import Cobra
class Rat():
    def check_predator(self, snake ):
        # some_logic ..
        snake.foo()

1 个回答

44

如果你在Rat类的定义中没有使用Cobra,或者反过来(也就是说,只在方法内部使用),那么你其实可以把导入语句放到文件的底部,这样在那时类的定义已经存在了。

# Cobra.py
class Cobra:
    # ...
    def check_prey(self, rat):
        # some logic
        rat.foo()
    
import Rat
# Rat.py
import Cobra
class Rat:
    # ...
    def check_predator(self, snake):
       # some_logic ..
       snake.foo()

或者你可以限制导入的范围:

# Cobra.py
class Cobra:
    # ...
    def check_prey(self, rat):
        import Rat
        # some logic
        rat.foo()
# Rat.py
import Cobra
class Rat:
    # ...
    def check_predator(self, snake):
       # some_logic ..
       snake.foo()

如果你没有直接使用RatCobra这两个类名,那么你甚至根本不需要导入语句:只要ratsnake实例中有这些属性和函数,Python就不在乎它们来自哪个类。

一般来说,没有绝对可靠的方法来避免import循环。你能做的最好的就是重构你的代码,并做一些我上面提到的事情。

撰写回答