如何使用`from module import*`重新加载导入的python模块

mur*_*own 45 python python-module python-import

我在这个有用的问答中看到了人们可以使用的,reload(whatever_module)或者在Python 3中imp.reload(whatever_module).

我的问题是,如果我说from whatever_module import *要导入怎么办?然后我whatever_module在使用时无需参考reload().你们是否会因为将整个模块投入全局命名空间而对我大喊大叫?:)

Cat*_*kul 50

我同意"一般不做这个"的共识,但......

正确答案是:

import X
reload(X)
from X import Y  # or * for that matter
Run Code Online (Sandbox Code Playgroud)

  • 这通常会_adds_符号`X`到命名空间,因此通过代替`reload(sys.modules["X"])`来尊重`X`不在命名空间中会更清晰一些。诚然,这可能需要将 `sys` 添加到命名空间,但它是一个如此常见的模块,因此它不应遮蔽任何东西(而 `X` 可能会被添加的 `import X` 遮蔽)。 (2认同)
  • 如果导入带有别名的模块,请在“reload”中使用别名。例如,对于“import XX as X”,请使用“reload(X)” (2认同)

All*_*len 8

切勿使用import *; 它破坏了可读性.

另外,请注意重新加载模块几乎从不有用.你无法预测你的程序在重新加载模块后最终会处于什么状态,所以这是获得难以理解的,无法解决的错误的好方法.

  • 它在交互模式下很有用,我总是更新我的模块,然后不得不退出并返回到python. (20认同)
  • 如果你使用`python -i foo.py`,你可以让python运行你的所有设置代码,然后它会给你一个提示.(而不是`来自somepackage.foo import*`,为什么不使用`from somepackage import foo作为f`然后引用`f.yourObjects`等? (4认同)

Eri*_*got 7

一个更清晰的答案是 Catskul 的好答案和 Ohad Cohen 的使用和直接重新定义的结合sys.modules

import sys
Y = reload(sys.modules["X"]).Y  # reload() returns the new module
Run Code Online (Sandbox Code Playgroud)

事实上,这样做import X会创建一个新符号 ( X),可能会在后面的代码中重新定义该符号,这是不必要的(而这sys是一个公共模块,因此不应发生这种情况)。

这里有趣的一点是,它from X import Y不会添加X到命名空间,而是将模块添加X到已知模块列表(sys.modules),这允许重新加载模块(并访问其新内容)。

更一般地,如果需要更新多个导入的符号,则像这样导入它们会更方便:

import sys
reload(sys.modules["X"])  # No X symbol created!
from X import Y, Z, T
Run Code Online (Sandbox Code Playgroud)

  • `sys.module` 应该是 `sys.modules`。我尝试编辑,但只有3个字符...... (2认同)
  • 我试图回复“已修复,谢谢!” 但它只有 14 个字符,没有被接受。:) (2认同)