2013-02-13 56 views
3

到目前为止,我一直在编写单脚本 Python程序,主要用于文本处理和数据分析。如何将Python/NumPy用于相当大的项目?

现在我想将我的一个旧的Matlab仿真项目带到Python/NumPy。在那个项目中,我有一个主要程序(在.m文件中)有几十个功能(每个都在一个单独的.m文件中)。在所有函数中都使用了全局变量,因此我不必将它们作为每个函数的参数输入。但是,如果不运行主程序,我不能运行/测试单个函数,因为全局变量将会是未定义的,或者它会调用另一个文件中的另一个函数。再加上文件的组织是一团糟。增加新功能,改变现有功能,特别是主程序是很痛苦的。

这次我想做的事情正确。如果这是正确的话,我希望程序有适当的体系结构。首先,我需要知道如何组织所有这些功能。我不认为每个小函数都有自己的文件是一个好主意。我想也许我可以将这些功能分成几组,每组可以是一个文件?它会是一个.py文件或其他类型的文件?其次,我希望它很容易扩展,我可以轻松添加新功能。

我相信这样做肯定有一些标准的方法,但我不知道。

一个问题:当我运行MATLAB程序,它完成后,我仍然有在工作区所有的变量,所以我还是可以检查数字,使地块,等等。但是,当我跑我的Python脚本通过IPython shell,它清除了所有事后。有没有类似于工作区

+0

'python -i script.py'会让您在运行脚本后进入交互提示。我不知道'Ipython',但我敢打赌它的行为是一样的。 – mgilson 2013-02-13 02:10:23

+0

取决于IDE,'Spyder'确实有'Variable Explorer',在那里你可以查看你的变量,但我不认为你可以像在MATLAB中一样保存工作区。但是,我发现使用'print'或'pprint'是查看变量最方便的方法。 – Akavall 2013-02-13 02:15:10

+0

@mgilson - IPython的行为方式相同。 :) – Talvalin 2013-02-13 02:22:45

回答

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 
+0

全局状态将在主函数中定义。因此,在'__init__'部分,我可以编写'self.foo = foo',其中在主函数中定义了'foo'? – LWZ 2013-02-13 02:41:12

+0

@LWZ - 我说的是全局状态*不应该被定义在主函数中。你应该把它装进课堂。如果'foo'是全局状态,那么你可以将它作为'__init__'的参数 - 例如'def __init __(self,foo):self.foo = foo' ...然后你可以在创建你的类时传递它:'simulation = NoGlobal(foo)' – mgilson 2013-02-13 02:43:18

+0

请原谅我,但我真的很困惑。你的'NoGlobal'类是什么?它似乎是我定义一堆函数的地方,对吗?仅在这些函数中使用'foo'还是所有函数都共享'foo'?我不想让'foo'成为一个参数,因为我有太多的参数。我需要首先阅读'class' ... – LWZ 2013-02-13 04:45:58

2

对于交互式Python外壳:IPython是,如果你非常有用想要在Python中进行交互式工作。

开始在pylab模式:ipython --pylab给你用Matlab类似功能的交互式Python外壳(在已导入范围包numpymatplotlib名称。)您也可以保存会话或加载存储会话和任意的Python程序。

1

我想我找到了我正在寻找的部分东西,它在这question中被询问。可以使用Modules(.py文件)和Packages(文件夹为__init__.py文件)组织事情。通过这种方式,我可以将一堆功能分组到模块中,并将该项目的所有模块置于中。

我仍然需要了解带有全局变量的class

相关问题