修改Python模块的常用做法

时间:2013-01-14 22:46:10

标签: python module reload

我有一个Python模块测试,我想编辑测试并在​​解释器中运行测试中的一些函数。 Python会自动查看我在测试中编辑的函数的差异而不重新导入吗?这个行动的恰当词是什么?

  1. 重新导入/重新加载/重新定义的最佳做法是什么?
  2. 如何有效地完成这项工作? (用鼠标突出显示文本然后复制和粘贴似乎效率低下)。
  3. 编辑到目前为止没有提到任何内容,所以我会发布一些细节:

    一个类在我的模块中,名为Test。所以我使用了from test import Test语句。现在,当我尝试命令reload(test)时,解释器告诉我重新加载是未定义的。如果我import imp然后imp.reload(test),解释程序会告诉我test未定义。这里出了什么问题?

4 个答案:

答案 0 :(得分:3)

我怀疑你正在使用Python 3,并且所有的回答者都假设您正在使用Python 2.

在Python 3中,reload已从builtins移至imp

所以答案是:

imp.reload(test)

为了将来参考,如果您使用的是Python 3,它几乎总是值得一提,除非您知道它不相关的事实,因为许多老前辈(阅读:你想要回答的人)将假设2.7。

同时,回到你的主要问题:

  

重新导入/重新加载/重新定义的最佳做法是什么?

对于简单的情况,reload()imp.reload()正是您想要的。 (对于 super - 简单的情况,复制和粘贴没有问题......)

但是,如果你有一些barfoo.Bar,然后重新加载foo,那么很容易让自己感到困惑。使用from foo import *也不能很好地发挥作用,这对于交互式会话来说通常很方便。

如果你可以启动一个新的翻译会话并导入模块,那就更清洁了。如果您需要创建一堆对象来开始使用该模块,您可以暂时将它们作为全局变量添加到模块中,或者创建一个定义它们的包装器模块。一些IDE可以将所有这些包装起来,所以只需点击一些加速键序列就可以重新启动解释器并重新运行import和所有设置内容。

答案 1 :(得分:2)

  

Python会在不重新导入的情况下自动查看我在测试中编辑的函数的差异吗?

没有

  

此操作的适当词汇是什么?

查看内置reload(module)

答案 2 :(得分:1)

假设有一个名为data.py的模块包含:

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

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

现在向data.py添加另一个函数,而shell仍在运行:

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()

  

重新加载(模块) - &gt;模块

     

重新加载模块。该模块必须已成功导入   之前。

答案 3 :(得分:1)

嗯,首先,你应该有一个名为test的模块,因为Python已经在其标准库中有一个。

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糟透了,你应该不惜一切代价避免它。如果您想在每次编辑库之后重新运行一堆代码,只需将该代码放在文件中并运行它。