>백엔드 개발 >파이썬 튜토리얼 >Python에서 순환 가져오기를 어떻게 방지하고 해결할 수 있나요?

Python에서 순환 가져오기를 어떻게 방지하고 해결할 수 있나요?

Barbara Streisand
Barbara Streisand원래의
2024-12-27 21:05:10570검색

How Can Circular Imports in Python Be Avoided and Resolved?

Python의 순환 가져오기: 함정과 해결 방법

Python 프로그래밍 영역에서는 모듈이 서로 가져오려고 할 때 순환 종속성이 발생할 수 있습니다. 잠재적인 위험을 피하려면 이러한 가져오기의 동작을 이해하는 것이 중요합니다.

foo와 bar라는 두 모듈이 import foo와 import bar를 사용하여 서로를 상호 가져오는 경우 두 모듈이 완전히 로드되므로 가져오기가 원활하게 성공합니다. 서로 참조할 수 있습니다.

그러나 from foo import abc 및 from bar import xyz와 같은 import를 사용할 때 문제가 발생합니다. 이러한 시나리오에서 각 모듈을 진행하려면 먼저 다른 모듈을 가져와야 합니다. 이러한 순환적 종속성은 가져오기 오류로 이어집니다.

설명하기 위해 다음 코드를 고려하십시오.

# foo.py
from bar import xyz

def abc():
    print(xyz.__name__)

# bar.py
from foo import abc

def xyz():
    print(abc.__name__)

foo에서 bar를 실행하기 전에 bar를 가져와야 하기 때문에 이 코드는 ImportError를 발생시킵니다. import 문에서 실행하지만 bar에서는 foo를 먼저 가져와야 합니다.

순환 가져오기를 효과적으로 처리하려면 몇 가지 솔루션이 필요합니다. 존재:

  • 모듈 상단; 아니 에서; Python 2만 해당:

    # foo.py
    import bar
    
    def abc():
      print(bar.xyz.__name__)
    
    # bar.py
    import foo
    
    def xyz():
      print(foo.abc.__name__)
  • 모듈 상단, 알았어; 상대적인 괜찮아; Python 3만 해당:

    # foo.py
    from . import bar
    
    def abc():
      print(bar.xyz.__name__)
    
    # bar.py
    from . import foo
    
    def xyz():
      print(abc.__name__)
  • 모듈 상단, 아니 에서; 친척 없음:

    # foo.py
    import lib.bar
    
    def abc():
      print(lib.bar.xyz.__name__)
    
    # bar.py
    import lib.foo
    
    def xyz():
      print(lib.foo.abc.__name__)
  • 모듈 하단; 모듈이 아닌 가져오기 속성; ok에서:

    # foo.py
    def abc():
      print(xyz.__name__)
    
    from .bar import xyz
    
    # bar.py
    def xyz():
      print(abc.__name__)
    
    from .foo import abc
  • 최고의 기능; from ok:

    # foo.py
    def abc():
      from . import bar
      print(bar.xyz.__name__)
    
    # bar.py
    def xyz():
      from . import foo
      print(foo.abc.__name__)

그러나 Star 수입은 원본 기사에 제공된 예에서 논의되지 않았습니다.

위 내용은 Python에서 순환 가져오기를 어떻게 방지하고 해결할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.