[PYTHON] 순환 가져 오기 문을 해결하는 Python 방법?
PYTHON순환 가져 오기 문을 해결하는 Python 방법?
방금 일부 코드를 상속받습니다. 테스트 라이브러리가 있으며,이 사이트의 웹 페이지에 해당하는 클래스가 있으며, 각 웹 페이지 클래스에는 해당 페이지의 기능을 자동화하는 메소드가 있습니다.
링크 된 페이지의 클래스를 반환하는 페이지 사이의 링크를 클릭하는 메서드가 있습니다. 다음은 간단한 예입니다.
homePageLib.py 파일 :
class HomePage(object):
def clickCalendarLink(self):
# Click page2 link which navigates browswer to page2
print "Click Calendar link"
# Then returns the page2 object
from calendarLib import CalendarPage
return CalendarPage()
calendarLib.py 파일 :
class CalendarPage(object):
def clickHomePageLink(self):
# Click page1 link which navigates browswer to page1
print "Click Home Page link"
# Then return the page2 object
from homePageLib import HomePage
return HomePage()
그러면 스크립트 파일에서 페이지를 클릭하고 해당 메서드에서 반환 값으로 개체를 가져옵니다. 즉, 스크립트 작성자는 사이트에서 이동할 때 새 페이지를 인스턴스화하지 않아도됩니다. (이상한 디자인 인 것처럼 느껴진다. 그러나 왜 'clickSomeLink'라는 메서드를 사용하여 결과 페이지의 개체를 반환하는 것이 이상한 것 이외에 왜 내 손가락을 넣을 수는 없다.)
다음 스크립트는 스크립트가 사이트 주위를 탐색하는 방법을 보여줍니다. (페이지 객체가 어떻게 변하는 지 보여주기 위해 인쇄 된 페이지를 삽입했습니다)
스크립트 파일 :
from homePageLib import HomePage
page = HomePage()
print page
page = page.clickCalendarLink()
print page
page = page.clickHomePageLink()
print page
다음 출력을 생성합니다.
<homePageLib.HomePage object at 0x00B57570>
Click Calendar link
<calendarLib.CalendarPage object at 0x00B576F0>
Click Home Page link
<homePageLib.HomePage object at 0x00B57570>
그래서, 제가 가장 불안한 부분은 ______ 수입 라인에서 온 것입니다. 이것들은 다음과 같은 이유로 나에게 나쁜 영향을 준다.
문제는 페이지 맨 위에 이러한 import 문을 넣으면 HomePage에서 CalendarPage를 가져오고 그 반대의 경우도 마찬가지이므로 가져 오기 오류가 발생합니다.
파일 homePageLib.py
from calendarLib import CalendarPage
class HomePage(object):
def clickCalendarLink(self):
# Click page2 link which navigates browswer to page2
print "Click Calendar link"
# Then returns the page2 object
return CalendarPage()
calendarLib.py 파일
from homePageLib import HomePage
class CalendarPage(object):
def clickHomePageLink(self):
# Click page1 link which navigates browswer to page1
print "Click Home Page link"
# Then return the page2 object
return HomePage()
다음과 같은 오류가 발생합니다.
>>> from homePageLib import HomePage
Traceback (most recent call last):
File "c:\temp\script.py", line 1, in ?
#Script
File "c:\temp\homePageLib.py", line 2, in ?
from calendarLib import CalendarPage
File "c:\temp\calendarLib.py", line 2, in ?
from homePageLib import HomePage
ImportError: cannot import name HomePage
(더 나은 파이썬 출력 형식에 대한 팁?)
이 스타일을 영속시키는 것보다 더 좋은 방법을 찾고 싶습니다. 이 같은 순환 종속성을 처리하고 여전히 파일의 맨 위에 가져 오기 명령문을 유지하는 Pythonic 방법이 있습니까?
해결법
-
==============================
1.이러한 구조를 해결하는 데에는 일반적으로 의존성 삽입 (Dependency Injection)과 같은 기법이 포함됩니다.
이러한 구조를 해결하는 데에는 일반적으로 의존성 삽입 (Dependency Injection)과 같은 기법이 포함됩니다.
그러나이 오류를 해결하는 것은 간단합니다.
calendarLib.py :
import homePageLib class CalendarPage(object): def clickHomePageLink(self): [...] return homePageLib.HomePage()
모듈 수준의 코드는 가져 오기 시간에 실행됩니다. from [...] import [...] 구문을 사용하려면 모듈이 완전히 초기화되어야합니다.
심플한 임포트 [...]는 심볼에 액세스하지 않기 때문에 의존성 체인을 깨뜨리지 않습니다.
-
==============================
2.자세한 설명은 Sebastian의 답변을 읽어보십시오. 이 접근법은 PyCon의 David Beazley에 의해 제안되었습니다.
자세한 설명은 Sebastian의 답변을 읽어보십시오. 이 접근법은 PyCon의 David Beazley에 의해 제안되었습니다.
상단에 가져 오기를 위치 시키십시오.
try: from homePageLib import HomePage except ImportError: import sys HomePage = sys.modules[__package__ + '.HomePage']
이렇게하면 홈페이지를 가져 오려고 시도하고 실패하면 캐시에서로드하려고 시도합니다
-
==============================
3.예. 물건을 더 작고 독립적 인 조각으로 분해하는 리팩터링.
예. 물건을 더 작고 독립적 인 조각으로 분해하는 리팩터링.
from https://stackoverflow.com/questions/5748946/pythonic-way-to-resolve-circular-import-statements by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 여러 개의 독립적 인 셀러리 대기열을 유지하는 방법 (0) | 2018.10.20 |
---|---|
[PYTHON] 위키 마크 업을위한 파이썬 모듈 (0) | 2018.10.20 |
[PYTHON] 파이썬에서 R 스크립트 실행하기 (0) | 2018.10.20 |
[PYTHON] OpenCV와 두 이미지 결합 (0) | 2018.10.20 |
[PYTHON] Python에서 Comet을 이해하는 데 도움이 필요하다 (Django 사용) (0) | 2018.10.20 |