修改Python模块的常见实践
我有一个Python模块测试,我想在解释器中编辑测试并在测试中运行一些函数。Python是否会自动看到我在测试中编辑的函数之间的差异,而无需重新导入?这个动作用什么词合适修改Python模块的常见实践,python,module,reload,Python,Module,Reload,我有一个Python模块测试,我想在解释器中编辑测试并在测试中运行一些函数。Python是否会自动看到我在测试中编辑的函数之间的差异,而无需重新导入?这个动作用什么词合适 重新导入/重新加载/重新定义的最佳实践是什么 如何有效地做到这一点?(用鼠标突出显示文本,然后进行复制和粘贴似乎效率低下) 编辑到目前为止没有提到任何有用的内容,因此我将发布更多详细信息: 我的模块中有一个类,叫做Test。所以我使用了testimporttest中的语句。现在,当我尝试命令reload(test)时,解释器告
。现在,当我尝试命令reload(test)
时,解释器告诉我reload未定义。如果我导入imp
,那么imp.reload(test)
解释器会告诉我,test
未定义。这里出了什么问题
Python是否会自动看到我在测试中编辑的函数之间的差异,而无需重新导入
没有
这个动作用什么词合适
请参阅内置。假设有一个名为
data.py
的模块,其中包含:
现在,在shell仍在运行时,向data.py添加另一个函数:
使用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
[17]中的:导入imp
在[18]中:导入重新加载(数据)
出[18]:
In[19]:dir(数据)
出[19]:
[内置的],
"医生",,
'文件'',
"姓名",,
"包",,
“酒吧”,
“foo”]#已获取条
help()
打开reload()
:
重新加载(模块)->模块
重新加载模块。模块必须已成功导入
以前
我怀疑您使用的是Python3,所有回答者都假设您使用的是Python2 在Python3中,
reload
从builtins
移动到
因此,答案是:
imp.reload(test)
作为将来的参考,如果您使用的是Python3,那么它几乎总是值得一提的,除非您知道它不相关,因为许多老前辈(阅读:您想要答案的人)都会假设2.7
同时,回到你的主要问题:
重新导入/重新加载/重新定义的最佳实践是什么
对于简单的情况,reload()
或imp.reload()
正是您想要的。(对于超级简单的情况,复制和粘贴没有任何问题…)
但是,当你有一个类foo.bar
的对象bar
,然后重新加载foo
时,你很容易感到困惑。它也不能很好地使用foo import*中的,这对于交互式会话来说非常方便
如果您可以启动一个新的解释器会话并导入模块,那么就更干净了。如果需要创建一组对象来开始使用模块,可以临时将它们作为全局对象添加到模块中,或者创建一个定义它们的包装器模块。一些IDE可以将所有这些都封装起来,因此只需点击一些加速器键序列,它就会重新启动解释器,并重新运行导入
和所有设置内容。好吧,对于初学者来说,您绝对应该而不是有一个名为测试
的模块,因为Python的标准库中已经有一个模块
test
未定义,因为您导入了test
,而不是test
。您还需要导入测试
但请注意,由于imp.reload()
的工作方式,重新加载test
不会更新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()
这个故事的寓意是重新加载很糟糕,你应该不惜一切代价避免它。如果您想在每次编辑库后重新运行一组代码,只需将该代码放入文件并运行即可。可能的重复:@codekingplus来自测试导入测试
相当于导入测试;Test=Test.Test;del test
,这样内存中就没有用于重新加载()的预加载模块了。
您的代码失败。
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']
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
imp.reload(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()