Решения, предоставленные для решения круговой зависимости от python, не работают - PullRequest
2 голосов
/ 11 мая 2019

Я пытаюсь работать с циклической зависимостью от Python (да, это необходимо, потому что мне нужно разделить мои модели на разные файлы и модули).

Я пробовал несколько способов подойти к этому (большинство из них уже предлагалось в связанных вопросах), но ни один из них не решил проблему. Примечание: при удалении циклической зависимости код работает.

  1. отсрочка импорта

    / module_a / class_a.py

    from module_b.class_b import B
    
    class A:
        b = B()
    

    / module_b / class_b.py

    class B:
        from module_a.class_a import A
        a = A()
    
  2. отложить оба импорта

    / module_a / class_a.py

    class A:
        from module_b.class_b import B
        b = B()
    

    / module_b / class_b.py

    class B:
        from module_a.class_a import A
        a = A()
    
  3. не используется из .. импортной записи

    / module_a / class_a.py

    import module_b.class_b as mb
    
    class A:
        b = mb.B()
    

    / module_b / class_b.py

    import module_a.class_a as ma
    class B:
        a = ma.A()
    
  4. не используется из .. импортной записи с отложенным импортом

    / module_a / class_a.py

    class A:
        import module_b.class_b as mb
        b = mb.B()
    

    / module_b / class_b.py

    class B:
        import module_a.class_a as ma
        a = ma.A()
    

В результате ни одно из решений не сработало. Я не знаю, связано ли это с тем, что вызов относится к определению класса, но это должно быть так, потому что я использую ORM.

1 Ответ

2 голосов
/ 12 мая 2019

То, что вы пытаетесь сделать, просто не может быть сделано таким образом в Python.Поскольку определение класса взаимно зависит от существования класса другого другого класса, ни один класс не может быть успешно определен без другого.Даже в одном и том же файле это может произойти сбой:

class A:
    b = B()
class B:
    a = A()

 NameError: name 'B' is not defined

Циклическая зависимость в любом случае считается результатом плохого дизайна , и ее всегда можно избежать, используя другой дизайн класса.Попробуйте задать более конкретный вопрос о том, как провести рефакторинг, если это вызывает у вас проблемы.

...