파 이 썬 이 순환 가 져 오 는 문 제 를 어떻게 피 하 는 지 에 대한 상세 한 설명
Python 에서 package 를 사용 할 때 순환 가 져 오기 문제 가 발생 하 는 것 은 매우 흔 합 니 다.우 리 는 다음 과 같은 package 를 만들어 서 이 문 제 를 설명 합 니 다.
pkg
├── __init__.py
├── module_a.py
└── module_b.py
그 중__init__.py 는 pkg 를 Python package 로 지정 합 니 다.
module_a.py 에서
action_a()
함 수 를 정 의 했 습 니 다.이 함 수 는 module 을 참조 하 였 습 니 다.함수 나 변수 와 같은.py 의 attributemodule_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 attribute
module 의 함 수 는 인 용 된 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 을 직접 실행 할 때 적용 상황 이 완전히 같 지 않 습 니 다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.