복붙노트

[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. ==============================

    1.이러한 구조를 해결하는 데에는 일반적으로 의존성 삽입 (Dependency Injection)과 같은 기법이 포함됩니다.

    이러한 구조를 해결하는 데에는 일반적으로 의존성 삽입 (Dependency Injection)과 같은 기법이 포함됩니다.

    그러나이 오류를 해결하는 것은 간단합니다.

    calendarLib.py :

    import homePageLib
    
    class CalendarPage(object):
        def clickHomePageLink(self):
            [...]
            return homePageLib.HomePage()
    

    모듈 수준의 코드는 가져 오기 시간에 실행됩니다. from [...] import [...] 구문을 사용하려면 모듈이 완전히 초기화되어야합니다.

    심플한 임포트 [...]는 심볼에 액세스하지 않기 때문에 의존성 체인을 깨뜨리지 않습니다.

  2. ==============================

    2.자세한 설명은 Sebastian의 답변을 읽어보십시오. 이 접근법은 PyCon의 David Beazley에 의해 제안되었습니다.

    자세한 설명은 Sebastian의 답변을 읽어보십시오. 이 접근법은 PyCon의 David Beazley에 의해 제안되었습니다.

    상단에 가져 오기를 위치 시키십시오.

    try:
        from homePageLib import HomePage
    except ImportError:
        import sys
        HomePage = sys.modules[__package__ + '.HomePage']
    

    이렇게하면 홈페이지를 가져 오려고 시도하고 실패하면 캐시에서로드하려고 시도합니다

  3. ==============================

    3.예. 물건을 더 작고 독립적 인 조각으로 분해하는 리팩터링.

    예. 물건을 더 작고 독립적 인 조각으로 분해하는 리팩터링.

  4. from https://stackoverflow.com/questions/5748946/pythonic-way-to-resolve-circular-import-statements by cc-by-sa and MIT license