在Python中重新加载模块

4

当我从 myModule.py 文件中导入一个叫做 MyClass 的类时,并且我想把它存储在名为 myModules 的字典中,我可以这样做:

from myModules.myModule import MyClass

当我对文件myModule.py进行更改后,如何重新加载此模块?以下是一些错误的尝试:

reload(MyClass) # TypeError: reload() argument must be module
reload(myModule) # NameError: name 'myModule' is not defined
reload(myModules.myModule)  # NameError: name 'myModules' is not defined

@TokenMacGuy的回答是否有所遗漏?如果没有,您应该接受它。 - Ethan Furman
1个回答

3

您需要一个模块进行重新加载。当您使用 from foo import bar 时,除非 bar 是一个模块(在您的情况下似乎不是),否则您将需要使用另一个导入语句。

from myModules.myModule import myClass
# this will cause myModule.py to be evaluated.  only myClass is in scope

from myModules import myModule
# since myModule has already been imported, myModule.py is not evaluated again. 
# but now myModule is in scope.

reload(myModule)
# this will cause myModule.py to be evaluated again.

如果由于某些原因您不想要两个导入,那么已经导入的模块也可以在sys.modules中找到。

当像我这样导入类时,这被认为是不好的风格吗?还是说无所谓呢? - Alex
这并不是不好的代码风格。它取决于你从一个导入中需要什么。如果你只需要 MyClass,那就只导入 MyClass。如果你需要 MyModule 中的所有内容,那就导入 MyModule(然后通过 MyModule.MyClass 访问 MyClass)。 - Samuele Mattiuzzo
我个人更喜欢始终导入模块,但这并不是原因。使用模块可以避免循环导入问题,并且倾向于减少读者需要跟踪的全局名称总数。如果您担心导入如何与reload()交互,则可能*正在做错事情,只有在交互式编程时重新加载已更改的模块内容才是合理有用的。 - SingleNegationElimination

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接