修改Python模块的常见实践

修改Python模块的常见实践,python,module,reload,Python,Module,Reload,我有一个Python模块测试,我想在解释器中编辑测试并在测试中运行一些函数。Python是否会自动看到我在测试中编辑的函数之间的差异,而无需重新导入?这个动作用什么词合适 重新导入/重新加载/重新定义的最佳实践是什么 如何有效地做到这一点?(用鼠标突出显示文本,然后进行复制和粘贴似乎效率低下) 编辑到目前为止没有提到任何有用的内容,因此我将发布更多详细信息: 我的模块中有一个类,叫做Test。所以我使用了testimporttest中的语句。现在,当我尝试命令reload(test)时,解释器告

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

  • 重新导入/重新加载/重新定义的最佳实践是什么
  • 如何有效地做到这一点?(用鼠标突出显示文本,然后进行复制和粘贴似乎效率低下) 编辑到目前为止没有提到任何有用的内容,因此我将发布更多详细信息:

    我的模块中有一个类,叫做Test。所以我使用了testimporttest中的语句
    。现在,当我尝试命令
    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()