我刚刚继承了一些让我不安的代码:有一个测试库,里面充满了与我们网站上的网页相对应的类,每个网页类都有自动实现该页面上功能的方法。
有一些方法可以单击页面之间的链接,从而返回链接页面的类。下面是一个简单的例子:
文件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
代码行。问题是,如果我们将这些导入语句放在页面顶部,就会出现导入错误,因为(根据本例),主页导入日历页面,反之亦然:
文件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语句放在文件的顶部?
详细说明请阅读Sebastian's answer。这种方法是由David Beazley在PyCon中提出的
试着像这样把进口放在上面
这将尝试导入您的
HomePage
,如果失败,将尝试从缓存加载它解析这些结构通常需要像Dependency Injection这样的技术。
但是,修复此错误相当简单:
在calendarLib.py中:
模块级的代码在导入时执行。使用
from [...] import [...]
语法需要完全初始化模块才能成功。一个简单的
import [...]
不会,因为没有符号被访问,因此会断开依赖链。相关问题 更多 >
编程相关推荐