誰もが知っているように、del sys.modules[module]
を実行すると、インポートされたモジュールを削除できます。だから私は考えていた:これは書き直しとはどう違うのですかsys.modules
?興味深い事実は、書き直しsys.modules
は本当にモジュールを削除できないということです。「del sys.modules [module]」は実際に何をしていますか?
# a_module.py
print("a module imported")
その後
import sys
def func1():
import a_module
# del sys.modules['a_module']
sys.modules = {
k: v for k, v in sys.modules.items() if 'a_module' not in k}
print('a_module' not in sys.modules) # True
def func2():
import a_module
func1() # a module imported
func2() # no output here
私はdel sys.modules['a_module']
を使用している場合は、func2()
を呼び出すこともa_module
が正常に削除されたことを意味する、a module imported
を出力します。
私の質問は:del sys.modules[module]
は実際に何をするのですか?
ありがとうございます。これはどこかに書かれていますか?私は、 "より多くの参考文献"があることを知らなかった。 – laike9m
@ laike9m:これは実装の詳細です。私はソースコードですばらしいダイブをしました。他のPythonの実装は、インタプリタの状態を異なる方法で処理する可能性があります。 –
@ laike9m:たとえば、[PyInterpreterState'のC APIドキュメント](https://docs.python.org/3/c-api/init.html#c.PyInterpreterState)には言及がありません'sys.modules'のドキュメントは、' sys.modules'リファレンスの置き換えに対して明示的に警告します。 –