我只是继承了一些使我感到不安的代码:有一个测试库,其中充满了与我们网站上的网页相对应的类,并且每个网页类都有使该页面上的功能自动化的方法。
有一些方法可以单击页面之间的链接,这将返回链接页面的类。这是一个简化的示例:
文件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为了显示页面对象的更改)
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 ____ 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输出的提示?)
我想找到一种更好的方法,而不是永久保留这种风格。有没有Python的方式来处理这样的循环依赖项,并且仍然将import语句保留在文件顶部?
解决这些构造通常涉及诸如依赖注入之类的技术。
但是,修复此错误相当简单:
在calendarLib.py中:
import homePageLib class CalendarPage(object): def clickHomePageLink(self): [...] return homePageLib.HomePage()
模块级别的代码在导入时执行。使用from [...] import [...]语法要求模块完全初始化才能成功。
from [...] import [...]
一个简单的import [...]没有,因为没有符号被访问,从而打破了依赖链。
import [...]