我正在使用文本编辑器和IPython开发Python包。每次我更改任何模块代码时,我都必须重新启动解释器来测试它。这是一个痛苦,因为我正在开发的类依赖于需要在每次重新加载时重新建立的上下文。
我知道reload()
函数,但这似乎是frowned upon(因为它已经从Python 3.0中的内置版降级),而且它很少有用,因为模块差不多总是有多个参考。
我的问题是 - 开发Python模块/包的最佳/可接受的方式是什么,这样我就不必经历不断重建我的解释器上下文的痛苦?
我想到的一个想法是使用if __name__ == '__main__':
技巧直接运行模块,因此不会导入代码。然而,这会在我的模块文件的底部留下一堆上下文(特定于我的设置)。
想法?
答案 0 :(得分:3)
另一种方法可能是正式化您的测试驱动开发,而不是使用解释器来测试您的模块,保存您的测试并直接运行它们。
您可能知道使用python执行此操作的各种方法,我想从这个方向开始的最简单方法是将您在解释器中执行的操作复制并粘贴到docstring中作为doctest,并将以下内容添加到底部你的模块:
if __name__ == "__main__":
import doctest
doctest.testmod()
每次直接调用模块时,都会重复您的非正式测试。这有许多其他好处。有关编写doctests的更多信息,请参阅doctest docs。
答案 1 :(得分:2)
Ipython允许重新加载,请参阅魔术函数%run iPython doc
或者如果模块下的模块更改了递归dreloadd()函数
如果您有复杂的上下文,是否可以在另一个模块中创建它?或者将它分配给一个全局变量,该变量将在未重新启动解释器时保持不变
答案 2 :(得分:1)
答案 3 :(得分:0)
您可以创建一个python脚本来设置您的上下文并使用
运行它python -i context-setup.py
-i When a script is passed as first argument or the -c option is
used, enter interactive mode after executing the script or the
command. It does not read the $PYTHONSTARTUP file. This can be
useful to inspect global variables or a stack trace when a
script raises an exception.