到目前为止,我一直在编写单脚本 Python程序,主要用于文本处理和数据分析。
现在我想将一个旧的Matlab仿真项目带到Python / NumPy。在那个项目中,我有一个主程序(在.m
文件中),有几十个函数(每个函数在一个单独的.m
文件中)。在所有函数中都使用了全局变量,因此我不必将它们作为每个函数的参数输入。但是,如果不运行主程序,我就无法运行/测试单个函数,因为全局变量将是未定义的,或者它调用另一个文件中的另一个函数。加上文件组织是一团糟。添加新功能,改变现有功能,特别是主程序,是很痛苦的。
这次我想正确做事。我希望程序有一个正确的架构,如果它是正确的话。首先,我需要知道组织所有这些功能。我不认为每个小函数都有自己的文件是个好主意。我想也许我可以将这些功能分成几组,每组可以是一个文件?它会是.py
文件还是其他类型的文件?其次,我希望它易于扩展,我可以轻松添加新功能。
我相信必须有一些标准的方法来做到这一点,但我不知道。
还有一个问题:当我运行Matlab程序时,在完成之后,我仍然拥有工作区中的所有变量,所以我仍然可以检查数字,制作情节等等。但是当我通过IPython shell运行我的python脚本,然后清除所有内容。是否有与工作区类似的东西?
答案 0 :(得分:5)
任何时候你有一堆共享相同全局状态的函数:
foo = 1
def do_something1():
print foo
def do_something2():
global foo
foo += 1
你最好定义一个类:
class NoGlobal(object):
"""docstring -- Pick a better name for your class please :)"""
def __init__(self):
self.foo = 1
def do_something1(self):
print self.foo
def do_something2(self):
self.foo += 1
现在你没有共享全局状态,你可以尽可能多地运行你的“模拟”而不会弄乱你的全局 - 只需实例化一个新的类实例,你就可以开始新的模拟
至于离开它以便在脚本终止后可以玩弄事物,这就是-i
选项的用途:
python -i yourscript.py
答案 1 :(得分:2)
对于交互式Python shell:如果你想在Python中进行交互式工作,IPython非常有用。
以pylab模式启动:ipython --pylab
为您提供了一个具有类似Matlab功能的交互式python shell(已在范围中导入的包numpy和matplotlib中的名称。)您还可以保存会话或加载存储的会话和任意python程序。
答案 2 :(得分:1)
我想我找到了我要找的部分内容,这是question的问题。可以在模块(.py
文件)和包(具有__init__.py
文件的文件夹)中组织事物。通过这种方式,我可以将一组函数分组到模块中,并将项目的所有模块放在包中。
我仍然需要了解全局变量的class
事物。