不安なコードを継承しました。サイトのWebページに対応するクラスでいっぱいのテストライブラリがあり、各Webページクラスにはそのページの機能を自動化するメソッドがあります。
リンクされたページのクラスを返す、ページ間のリンクをクリックするメソッドがあります。簡単な例を次に示します。
ファイル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出力をより適切にフォーマットする方法に関するヒント?)
このスタイルを永続させるのではなく、もっと良い方法を見つけたいと思います。このような循環依存関係を処理し、インポートステートメントをファイルの先頭に保持するPythonの方法はありますか?