python循环导入教程,解决循环导入语句的Pythonic方法?

我只是继承了一些使我感到不安的代码:有一个测试库,其中充满了与我们网站上的网页相对应的类,并且每个网页类都有使该页面上的功能自动化的方法。

有一些方法可以单击页面之间的链接,这将返回链接页面的类。这是一个简化的示例:

文件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

产生以下输出:

Click Calendar link

Click Home Page link

因此,我特别不满意的部分是from ____ import ____所有结尾的行。这些原因使我感到很糟糕,原因如下:

我一直以来都约定将所有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 [...]语法要求模块完全初始化才能成功。

一个简单的import [...]没有,因为没有符号被访问,从而打破了依赖链。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值