2010-12-08 11 views
3

対話モードでモジュールをインポートすると、モジュールが変更された場合(バグ修正など)、単にreload()コマンドを使用できます。Pythonで単一の関数を再インポートする

しかし、私はモジュール全体をインポートせず、 'from import f、g'インポートステートメントを使用しました。 Gのみを再インポートする方法はありますか?

(私は 'del g'でパラメータテーブルから関数を削除して、.pycファイルをディレクトリから削除しようとしましたが、役に立たなかった。ロードされた)。

+1

単にインタープリタを再起動してください;) – Ant

+0

正に、それは私がしていることです。 –

答えて

9

from foo import barを実行すると、となり、モジュール全体がインポートされます。現在の名前空間に記号barのコピーを作成しています。あなたはではなく、だけをインポートしています。

reloadの機能は完全には信頼できません(コンパイル済みのCモジュールでは機能しません)。インタプリタを終了して再起動することをお勧めします。最初のインポートのために

+1

+1は、モジュールのインポートと名前空間へのシンボルの組み込みを明確にするためのものです。 – pyfunc

+0

これはPython 2.7.3で簡単には動作しません。 '' foo import bar'から 'foo'というシンボルが定義されません。モジュールは 'sys.modules'にエントリを持っていますので、もちろん' reload(sys.modules ['foo']) '(' import sys'の後)に成功することができます。 – drevicko

0

、(また、ルックアップを高速化)変数にインポート作品をバインド:

import numpy as NP 
import numpy.linalg as LA 
    ... 
reload(LA) 
1

これは、対話型インタプリタのためだけであるので、私は何かのようなことはないと思います:

def my_reload(mod, name): 
    reload(mod) 
    globals()[name] = getattr(mod, name) 

myreload(somemodule, "some_function") 

がひどいです。これは通常のようにモジュールをリロードし、古いオブジェクトを指す名前を新しいオブジェクトに再バインドします。これは、reloadが始まるすべてのインスタンスで機能するはずです。また、実際のオブジェクトを取得し、その__name__属性を使用して名前を取得するようにプログラムすることもできます。関数、クラス、モジュールはすべて__name__属性を持っていますが、モジュールレベルの辞書のようなものは柔軟性がありません。

グローバルなもの以外のオブジェクトへの参照を置き換えることはありませんが、もともとドット付きの名前でアクセスしたとしても、reloadにはなりません。オブジェクトへの参照が緩んだら、あなたができることはあまりありません。

関連する問題