10
$ python
>>> import myapp
>>> reload(myapp)
<module 'myapp' from 'myapp.pyc'>
>>>

ctrl+D

$ python
>>> from myapp import *
>>> reload(myapp)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'myapp' is not defined

なぜこれが異なる動作をするのですか?使用時にリロードするにはどうすればよいfrom myapp import *ですか?

4

4 に答える 4

19

http://docs.python.org/library/functions.html#reloadから:

モジュールがfrom...import ...を使用して別のモジュールからオブジェクトをインポートする場合、他のモジュールに対してreload()を呼び出しても、そのモジュールからインポートされたオブジェクトは再定義されません。これを回避する1つの方法は、fromステートメントを再実行することです。代わりに、インポート名と修飾名(module .name)を使用します

したがって、次のようなことを行う必要があります。

from myapp import *
....
import myapp
reload(myapp)
from myapp import *
于 2012-05-01T17:21:18.640 に答える
3

使用時にリロードするにはどうすればよいfrom myapp import *ですか?

できません。from X import *これが、使用が悪い考えである理由の1つです。

于 2012-05-01T17:16:29.840 に答える
3

from myapp import *使用すると、変数名にモジュールへの参照がないため、変数名を使用してモジュールを参照することはできません。

もちろん、使用できる名前でモジュールへの参照を取得するために、それを再度インポートすることを妨げるものは何もありません。すでに一度インポートされているため、実際には再度インポートされることはありません。

import myapp
reload(myapp)

から直接参照を取得することもできますsys.modules

import sys
reload(sys.modules["myapp]")
于 2012-05-01T17:22:00.100 に答える
1

Woobleのコメントを明確にするために、「from foo import *」を使用すると、fooから現在の名前空間にすべてが取り込まれます。これにより、名前の衝突(すでに使用されている名前に意図せずに新しい値を割り当てる)が発生する可能性があり、また、何かがどこから来たのかを判断するのが難しくなる可能性があります。いくつかのライブラリがこのように使用されることがよくありますが、通常、それは価値があるよりも多くの問題を引き起こします。

また、現在の名前空間に取り込まれているため、単純に再ロードすることはできません。一般に、別の名前空間に保持することをお勧めします(おそらく、mのような短い便利なエイリアスを使用します)。これにより、リロードが可能になり(テストには役立ちますが、テスト以外ではめったに良いアイデアではありません)、名前空間を純粋に保つのに役立ちます。

于 2012-05-01T17:30:16.083 に答える