5

私は Python モジュール テストを持っています。テストを編集し、インタプリタでテストでいくつかの関数を実行したいと考えています。Python は、再インポートせずにテストで編集した関数の違いを自動的に認識しますか? この行動を表す適切な言葉は?

  1. 再インポート/再読み込み/再定義のベスト プラクティスは何ですか?
  2. これを効率的に行うにはどうすればよいでしょうか。(マウスでテキストを強調表示してからコピーして貼り付けるのは効率が悪いようです)。

編集これまでのところ何も言及されていないので、さらに詳細を投稿します。

私のモジュールには Test というクラスがあります。だから私はステートメントを使用しましたfrom test import Test。コマンドを試すとreload(test)、インタープリターはリロードが未定義であると通知します。もしそうならimport impimp.reload(test)インタプリタはそれtestが未定義であると私に言います。ここで何がうまくいかないのですか?

4

4 に答える 4

4

Python 3 を使用していると思われますが、すべての回答者は Python 2 を使用していると想定しています。

Python 3 では、reloadから に移動されbuiltinsましたimp

したがって、答えは次のとおりです。

imp.reload(test)

将来の参考のために、Python 3 を使用している場合は、ほとんどの場合、それが関連していないという事実を知っていない限り、言及する価値があります。 .

その間、あなたの主な質問に戻ります:

再インポート/再読み込み/再定義のベスト プラクティスは何ですか?

単純なケースの場合、reload()またはimp.reload()まさにあなたが望むものです。(簡単な場合はコピペで問題ないのですが…)

barしかし、たとえばクラスのオブジェクトを持ってfoo.Barから reload すると、混乱するのは非常に簡単ですfoofrom foo import *また、インタラクティブなセッションに便利な との相性も良くありません。

新しいインタープリター セッションを開始してモジュールをインポートできる場合は、はるかにクリーンです。モジュールの操作を開始するために多数のオブジェクトを作成する必要がある場合は、それらをグローバルとしてモジュールに一時的に追加するか、それらを定義するラッパー モジュールを作成します。一部の IDE はこれをすべてラップできるため、アクセラレータ キー シーケンスを押すだけで、インタープリターが再起動し、importすべてのセットアップが再実行されます。

于 2013-01-14T23:49:55.327 に答える
2

まず、Pythonの標準ライブラリにはすでにモジュールがあるため、名前の付いたモジュールは絶対に使用しないでください。test

testをインポートしたため、は未定義Testですtest。あなたもそうする必要がありimport testます。

ただし、imp.reload()動作方法により、リロードtest 更新されないことに注意してくださいTest。それでもクラスの古いコピーを参照します。あなたもまたしなければならないでしょうfrom test import Test

イベントの完全なシーケンス:

>>> import imp
>>> import test
>>> from test import Test
>>> Test().whatever()
# edit your code
>>> imp.reload(test)
>>> from test import Test  # or: Test = test.Test
>>> Test().whatever()

この話の教訓は、それはreloadひどいことであり、あなたはそれを絶対に避けるべきです。ライブラリを編集するたびに大量のコードを再実行する場合は、そのコードをファイルに入れて実行するだけです。

于 2013-01-15T06:08:58.660 に答える
2

Python は、再インポートせずにテストで編集した関数の違いを自動的に認識しますか?

いいえ。

この行動を表す適切な言葉は?

組み込みのreload( module )を参照してください。

于 2013-01-14T22:52:51.667 に答える
1

data.py以下を含むという名前のモジュールがあるとします。

def foo():pass
In [13]: import data

In [14]: dir(data)
Out[14]: ['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'foo']

シェルがまだ実行されている間に、data.py に別の関数を追加します。

def foo():pass
def bar():pass
In [15]: import data

In [16]: dir(data)     #new function bar is not fetched by the import
                       #coz it simply loads the data object already present in memory

Out[16]: ['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'foo']

imp.reload()モジュール オブジェクトをリロードするために使用します。

In [17]: import imp

In [18]: imp.reload(data)
Out[18]: <module 'data' from 'data.py'>

In [19]: dir(data)
Out[19]: 
['__builtins__',
 '__doc__',
 '__file__',
 '__name__',
 '__package__',
 'bar',
 'foo']          # bar fetched

help()オンreload():

リロード (モジュール) -> モジュール

モジュールをリロードします。モジュールは以前に正常にインポートされている必要があります。

于 2013-01-14T22:53:54.380 に答える