[Python-ml-jp 4467] Re: モジュールの再定義

Yusei TAHARA yusei @ domen.cx
2008年 8月 2日 (土) 04:09:28 JST


> def pvalfix():
>  time.sleep(random.randint(0,10))
>  print localdata.VAL+" ",
> 
> pval = pvalfix

import hogeをすれば、hogeモジュール自体が手に入るので、モジュールの中身を書き
換えることで、その中で定義された関数などが参照している名前の指しているオブジェクトを
差し替えることができますが、from hoge import *ではモジュール自体は手に入らないので
書き替えられないです。

dictをモジュールの名前空間に見たてて例えるなら(実際そうなってますが)

hoge      {'a':<object object at 0xb7b5e468>}
hogefix   {'a_fix':<object object at 0xb7b5e470>}

のときに、hogefix.pyで
from hoge import a
とすると

hoge      {'a':<object object at 0xb7b5e468>}
hogefix   {'a_fix':<object object at 0xb7b5e470>,
           'a':<object object at 0xb7b5e468>}

となります。hogeの名前空間で束縛されていたオブジェクトを
同じ名前で現在のモジュールの名前空間にも束縛するわけです。

それからhogefix.pyの中で
a = a_fix
とすると

hoge      {'a':<object object at 0xb7b5e468>}
hogefix   {'a_fix':<object object at 0xb7b5e470>,
           'a':<object object at 0xb7b5e470>}

となります。トップレベルで代入するとモジュールの名前空間を書き換えるだけ
なので、hoge.aを書き替えることはできません。

他のモジュールの中身を書き換えたいときは、そういうわけでfrom hoge import *
よりもimport hogeのほうがいいわけです。

-- 
Yusei TAHARA <yusei @ domen.cx>



Python-ml-jp メーリングリストの案内