Pythonic способ разрешить циклические операторы импорта?

Я только что унаследовал некоторый код, который меня беспокоит: есть библиотека для тестирования, полная классов, соответствующих веб-страницам на нашем сайте, и каждый класс веб-страницы имеет методы для автоматизации функциональность на этой странице.

Существуют методы для щелчка по ссылке между страницами, которая возвращает класс связанной страницы. Вот упрощенный пример:

File homePageLib.py:[1224ptingFile 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 ____ , которые заканчиваются на всем протяжении. Они кажутся мне плохими по следующим причинам:

  1. Я всегда придерживался соглашения, чтобы помещать все операторы импорта в начало файла.
  2. Поскольку на страницу может быть несколько ссылок, это приводит к та же из строки кода foo import bar в нескольких местах файла.

Проблема в том, что если мы поместим эти операторы импорта вверху страницы, мы получим ошибки импорта, потому что (согласно этому примеру), 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

(советы о том, как лучше форматировать выходные данные Python?)

Вместо увековечивая этот стиль, я бы хотел найти лучший способ. Есть ли в Pythonic способ справиться с подобными циклическими зависимостями и при этом сохранить операторы импорта в верхней части файла?

33
задан carlmonday 25 March 2013 в 23:45
поделиться