我只是继承了一些让我感到不安的代码:有一个测试库,里面充满了与我们网站上的网页相对应的类,并且每个网页类都有方法来自动化该页面上的功能。
有方法可以点击页面之间的链接,返回链接页面的类。这是一个简化的示例:
文件 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”的方法并返回结果页面的对象似乎很奇怪。)
以下脚本说明了脚本如何在站点中导航:(我插入print page
以显示页面对象如何更改)
脚本文件:
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>
所以,我特别感到最不安的部分是from ____ import ____
那些结束了的台词。这些让我觉得很糟糕,原因如下:
- 我一直约定将所有导入语句放在文件的顶部。
- 由于一个页面可能有多个链接,这会导致
from 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 的方式来处理这样的循环依赖,并且仍然将 import 语句保留在文件的顶部?