Python通过循环导入使我发疯

时间:2019-03-31 09:28:13

标签: python python-3.x python-import circular-dependency

来自helpers.py:

import ...

from datasets import my_datasets

class Printable():
    def __str__(self):
        return 'foobar'


def get_some_dataset(ds_id):
    return my_datasets.get(ds_id, None)

来自datasets.py:

import ...

from helpers import Printable

class Dataset(Printable):
    def __init__(self, param):
        self.baz = param

my_datasets = {
    'id1': Dataset(foo),
    'id2': Dataset(bar)
}

现在Python尖叫着

  

ImportError:无法从“助手”中导入名称“可打印”

如果我完全删除了Printable依赖项,则一切正常。

如果我稍微更改datasets.py中的导入,则:

import helpers as ma_helpers

class Dataset(ma_helpers.Printable):
   ...

然后错误消息变为:

  

AttributeError:模块'helpers'没有属性'Printable'

如何使用来自datasets.py的helpers.py的Printable,同时使用来自helpers.py的datas.py的my_datasets

2 个答案:

答案 0 :(得分:2)

假设您对两个模块都具有编辑权限,并且helpers.py包含独立的帮助程序功能,则可能需要将与dataset.py相关的帮助程序代码移至dataset.py-这可能会稍微降低模块化程度,但是这将是解决周期的最快方法。

答案 1 :(得分:0)

收到循环依赖项错误的原因是,您正在helper.py中从dataset.py导入内容,反之亦然。该方法是错误的。考虑到您正在尝试进行一些OOP并对其进行测试,让我们像下面这样重写代码-

domain.py
=========

class Printable():
    def __str__(self):
        return 'foobar'

class Dataset(Printable):
    def __init__(self, param):
        self.baz = param


test.py
=======

from domain import Dataset

my_datasets = {
    'id1': Dataset(foo),
    'id2': Dataset(bar)
}

def get_some_dataset(ds_id):
    return my_datasets.get(ds_id, None)

现在,如果您尝试从get_some_dataset导入test并尝试执行它,那么它将起作用。