파 이 썬 이 순환 가 져 오 는 문 제 를 어떻게 피 하 는 지 에 대한 상세 한 설명

머리말
Python 에서 package 를 사용 할 때 순환 가 져 오기 문제 가 발생 하 는 것 은 매우 흔 합 니 다.우 리 는 다음 과 같은 package 를 만들어 서 이 문 제 를 설명 합 니 다.

pkg
 ├── __init__.py
 ├── module_a.py
 └── module_b.py
그 중
__init__.py 는 pkg 를 Python package 로 지정 합 니 다.
module_a.py 에서action_a()함 수 를 정 의 했 습 니 다.이 함 수 는 module 을 참조 하 였 습 니 다.함수 나 변수 와 같은.py 의 attribute
module_b.py 에서action_b()함 수 를 정 의 했 습 니 다.이 함 수 는 module 를 참조 하 였 습 니 다.함수 나 변수 와 같은 a.py 의 attribute
이 경우 이 패 키 지 를 실행 할 때circular import error오류,즉 순환 참조,modulea 모듈 도입 시도b 시,모듈b 우선 module 도입a,이것 은 Python 해석 기 를 실행 할 수 없 게 할 것 입 니 다.
그러나 우 리 는 교묘 한 방법 을 통 해 위의 논리 가 정상적으로 작 동 하도록 하 는 동시에 순환 적 으로 도입 되 는 오 류 를 피 할 수 있다.
그렇다면 언제 정상 적 인 일 을 할 수 있 고,언제 정상 적 인 일 을 할 수 없 으 며,정상 적 인 일 을 할 수 있 는 상황 은 어떤 이유 일 까?
언제 그것 이 정상적으로 일 할 수 있 습 니까?
 1.module 상단 에 도입 합 니 다.from 을 사용 하지 마 십시오.상대 적 으로 도입 합 니 다.Python 2 에서 만 유효 합 니 다.
module 의 상단 import,예 를 들 어import another_module,module 의 함 수 는another_module.attribute방식 으로 another 를 참조 합 니 다.module 의 함수 나 변수 등.이러한 방식 이 효과 적 인 이 유 는import another_module현재 디 렉 터 리 를 기반 으로 하 는 상대 적 인 인용 이 고 암시 적 인 인용 이기 때문에 다른 package 에서 module 을 도입 하면 효력 을 잃 을 수 있 습 니 다.또한import another_module이런 문법 은 Python 3 에서 지원 되 지 않 기 때문에 코드 에서 이런 방법 으로 순환 도입 을 피하 지 마 세 요.
예:

# pkg/module_a.py 
from __future__ import print_function
import module_b
 
def action_a():
 print(module_b.action_b.__name__)
 
 
# pkg/module_b.py
from __future__ import print_function
import module_a
 
def action_b():
 print(module_a.action_a.__name__)
2.module 의 맨 위 에 도입,from 을 사용 하지 말고,절대 도입
module 의 맨 위 import 에서 package 에서 시작 하 는 절대 경 로 를 사용 합 니 다.예 를 들 어import package.another_module,module 의 함 수 는package.another_module.attribute방식 으로 another 를 참조 합 니 다.module 의 함수 나 변수 등.package name 을 걸 어 도입 하려 는 이 유 는import .another_module이러한 형식의'상대 적 도입'은 문법 적 오 류 를 보고 하고 package 의 절대적 인 도입 을 걸 어 Python 2 와 3 이 모두 지원 하기 때 문 입 니 다.
사례:

# pkg/module_a.py
from __future__ import print_function
import pkg2.module_b
 
def action_a():
 print(pkg2.module_b.action_b.__name__)
 
 
# pkg/module_b.py
from __future__ import print_function
import pkg2.module_a
 
def action_b():
 print(pkg2.module_a.action_a.__name__)
3.module 밑 에 another module 의 attribute 를 도입 합 니 다.another module 이 아 닌 from 을 사용 합 니 다.
module 의 아래쪽 import(적어도 인 용 된 attribute 이후 import)에서another module의 attribute 를 직접 도입 합 니 다.예 를 들 어 frompackage.another_module import attribute과 같이 상대 적 으로 도입 도 지원 합 니 다.예 를 들 어from .another_module import attributemodule 의 함 수 는 인 용 된 attribute 를 직접 사용 하면 됩 니 다.
예:

# pkg/module_a.py
from __future__ import print_function
 
def action_a():
 print(action_b.__name__)
 
from .module_b import action_b
 
 
# pkg/module_b.py
from __future__ import print_function
 
def action_b():
 print(action_a.__name__)
 
from .module_a import action_a
4.함수 상단 도입,from 사용 가능
module 의 function 상단 import,예 를 들 어from package import another_module도 상대 적 으로 도입 을 지원 하고 module 이나 attribute 를 도입 할 수 있 습 니 다.
예:

# pkg/module_a.py
from __future__ import print_function
 
def action_a():
 from . import module_b
 print(module_b.action_b.__name__)
 
 
# pkg/module_b.py
from __future__ import print_function
 
def action_b():
 from . import module_a
 print(module_a.action_a.__name__)
혹시

# pkg/module_a.py
from __future__ import print_function
 
def action_a():
 from .module_b import action_b
 print(action_b.__name__)
 
 
# pkg/module_b.py
from __future__ import print_function
def action_b():
 from .module_a import action_a
 print(action_a.__name__)
이러한 방식 은 Python 2 와 3 이 모두 지원 되 지만 인 코딩 이 우아 하지 않 고 코드 의 가 독성 에 영향 을 주 므 로 사용 하 는 것 을 권장 하지 않 습 니 다.
주석.
본 논문 에서 토론 한 문 제 는 Python 에서 package 를 호출 할 때 순환 도입 을 어떻게 피해 야 하 는가 하 는 것 이다.
명령 행 에서 Python module 을 직접 실행 할 때 적용 상황 이 완전히 같 지 않 습 니 다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기