5

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

  1. 重新导入/重新加载/重新定义的最佳实践是什么?
  2. 如何有效地做到这一点?(用鼠标突出显示文本然后复制和粘贴似乎效率低下)。

编辑到目前为止没有提到任何工作,所以我将发布更多细节:

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

4

4 回答 4

4

我怀疑您使用的是 Python 3,并且所有回答者都假设您使用的是 Python 2。

在 Python 3 中,reloadbuiltins移至imp.

所以,答案是:

imp.reload(test)

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

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

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

对于简单的情况,reload()或者imp.reload()正是您想要的。(对于超级简单的情况,复制粘贴没有错……)

bar但是当你有一些类对象foo.Bar然后 reload时,你很容易混淆自己foo。它也不能很好地与from foo import *,这对于交互式会话通常很方便。

如果您可以启动一个新的解释器会话并导入模块,那就更干净了。如果您需要创建一堆对象来开始使用模块,您可以将它们作为全局变量临时添加到模块中,或者创建一个定义它们的包装器模块。一些 IDE 可以将所有这些都包装起来,因此只需按一些加速键序列就会导致它重新启动解释器并重新运行您import和所有设置的东西。

于 2013-01-14T23:49:55.327 回答
2

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

不。

这个动作的合适词是什么?

请参阅内置reload(模块)

于 2013-01-14T22:52:51.667 回答
2

好吧,对于初学者来说,你绝对应该有一个名为的模块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糟糕,你应该不惜一切代价避免它。如果您想在每次编辑库后重新运行一堆代码,只需将该代码放在一个文件中并运行它。

于 2013-01-15T06:08:58.660 回答
1

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

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

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

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

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

重新加载(模块)-> 模块

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

于 2013-01-14T22:53:54.380 回答