2012年2月16日木曜日

開発環境

『初めてのPython 第3版』(Mark Lutz 著、夏目 大 訳、オライリー・ジャパン、2009年、ISBN978-4-87311-393-7)のIV部(モジュール)のまとめ演習7(循環インポート)を解いてみる。

7.

recur1.py

コード(TextWrangler)

#!/usr/bin/env python
#encoding: utf-8

X = 1
import recur2
Y = 2

recur2.py

コード(TextWrangler)

#!/usr/bin/env python
#encoding: utf-8

from recur1 import X
from recur1 import Y

入出力結果(Terminal)

$ python
Python 2.7.2 (default, Feb 12 2012, 23:50:38) 
[GCC 4.2.1 Compatible Apple Clang 3.0 (tags/Apple/clang-211.12)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import recur1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "recur1.py", line 5, in <module>
    import recur2
  File "recur2.py", line 5, in <module>
    from recur1 import Y
ImportError: cannot import name Y
>>> quit()
$ python
Python 2.7.2 (default, Feb 12 2012, 23:50:38) 
[GCC 4.2.1 Compatible Apple Clang 3.0 (tags/Apple/clang-211.12)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import recur2
>>> quite()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'quite' is not defined
>>> quit()
$

import recur1というコードはエラーになって、import recur2というコードはエラーにならないのは、前者は循環インポートになっていて、後者は循環インポートになっていないから。

recur1モジュールをトップレベルファイルとして実行した場合にはエラーは発生しない。理由は、最初にインポートするのはrecur2モジュールだから。(すなわち上記の対話型コマンドプロンプトでのimport rucur2と同様の理由。)

逆にrecur2モジュールをトップレベルファイルとして実行した場合にはエラーが発生する。理由は、最初にインポートするのはrecur1モジュールだから。(すなわち、上記の対話型コマンドプロンプトでのimport recur1と同様の理由。)

入出力結果(Terminal)

$ ./recur1.py
$ ./recur2.py
Traceback (most recent call last):
  File "./recur2.py", line 4, in <module>
    from recur1 import X
  File "/Users/kamimura/Desktop/recur1.py", line 5, in <module>
    import recur2
  File "/Users/kamimura/Desktop/recur2.py", line 5, in <module>
    from recur1 import Y
ImportError: cannot import name Y
$

0 コメント:

コメントを投稿