モジュールのリロード
自分でモジュールを編集しながら試しているとモジュールをリロードしたい場合が多々あるわけだ、そんな時、インタプリタを終了して再度起動、その後、インポートしなおしていたんだがめんどくさい。なんとかならんものかと思っていたら「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は!