Python сводит меня с ума с круговым импортом - PullRequest
0 голосов
/ 31 марта 2019

Из 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' from 'helpers'

Если я полностью удаляю зависимость Printable, все работает хорошо.

Если я немного изменю импорт в datasets.py:

import helpers as ma_helpers

class Dataset(ma_helpers.Printable):
   ...

Затем появляется сообщение об ошибке:

AttributeError: модуль 'helpers' не имеет атрибута 'Printable'

Как я могу использовать helpers.py's Printableиз datasets.py, и в то же время использовать my_datasets datasets.py's из helpers.py?

Ответы [ 2 ]

2 голосов
/ 31 марта 2019

Предполагая, что у вас есть разрешения на редактирование обоих модулей, и что helpers.py содержит автономные вспомогательные функции, вы можете переместить вспомогательный код, относящийся к dataset.py, в dataset.py - это может немного уменьшить модуляризацию, но это был бы самый быстрый способ разрешить цикл.

0 голосов
/ 31 марта 2019

Причина, по которой вы получаете ошибку циклической зависимости, заключается в том, что вы импортируете что-то из helper.py в dataset.py и наоборот.Подход неправильный.Учитывая, что вы пытаетесь выполнить ООП и протестировать их, давайте перепишем код, как показано ниже:

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, а затем попытаетесь выполнить его, он будетработа.

...