モジュールのリロード

Pythonインタプリタでいろいろ遊んでいるんだが・・・

自分でモジュールを編集しながら試しているとモジュールをリロードしたい場合が多々あるわけだ、そんな時、インタプリタを終了して再度起動、その後、インポートしなおしていたんだがめんどくさい。なんとかならんものかと思っていたら「reload()
」っていう組み込み関数があるみたいだが使い方が良くわかんね。

「infomation」ってモジュールにある「info」って関数をリロードしたいのよ。

>>> from infomation import info
>>> reload(info)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: reload() argument must be module
>>> reload(infomation.info)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'infomation' is not defined
>>> reload('c:\practice\mymodule\infomation')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: reload() argument must be module
>>> reload('c:\practice\mymodule\infomation.py')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: reload() argument must be module

なんでよ?いろいろ試したが正解にたどり着けない。ほんとに何でだ?

ん〜もしかしてモジュールじゃないとか!

>>> type(info)
<type 'function'>

これは間違いじゃない。

>>> import types
>>> dir(types)
['BooleanType', 'BufferType', 'BuiltinFunctionType', 'BuiltinMethodType', 'Class
Type', 'CodeType', 'ComplexType', 'DictProxyType', 'DictType', 'DictionaryType',
 'EllipsisType', 'FileType', 'FloatType', 'FrameType', 'FunctionType', 'Generato
rType', 'GetSetDescriptorType', 'InstanceType', 'IntType', 'LambdaType', 'ListTy
pe', 'LongType', 'MemberDescriptorType', 'MethodType', 'ModuleType', 'NoneType',
 'NotImplementedType', 'ObjectType', 'SliceType', 'StringType', 'StringTypes', '
TracebackType', 'TupleType', 'TypeType', 'UnboundMethodType', 'UnicodeType', 'XR
angeType', '__builtins__', '__doc__', '__file__', '__name__']
>>> types.ModuleType
<type 'module'>

ん〜ダメだ。何が何だかわかんないや〜厳密に言うと関数「'function'」とモジュール「'module'」は違うってこと?reload()ではモジュールがリロードできるってこと?じゃあモジュールってどうやって定義するの?「def」とは異なるの?ああ、ダメだわかんないや。今日は寝よう。

で起きてみて再度挑戦してみた。

>>> import infomation 
>>> reload(infomation)
<module 'infomation' from 'infomation.pyc'>
>>>

リロードできたみたい。ん〜「from infomation import info」は関数だからモジュールをリロードするには、「import infomation」としないと「reload()」は利用できないってこと?なんかめんどいな!

>>> import types
>>> types.FunctionType
<type 'function'>
>>> FunctionType
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'FunctionType' is not defined
>>> from types import FunctionType
>>> FunctionType
<type 'function'>

結構厳密にインポートされるんですね。メモリ等考えた場合、コード中で利用しない関数はインポートしない方がいいのかな?必要最小限の関数をインポートしましょうってことでいいのかな。知らない事だらけで面白いですねPythonは!