2017-06-05 97 views
0

我在OOP方面没有经验,也不是贸易方面的程序员,所以我很抱歉如果这是我应该能够找到的东西。我目前有一个我编写的python程序来做一些复杂的数据分析 - 它由函数组成,然后是调用这些函数的脚本(没有主要的哨兵等)。没有课或任何东西。从另一个脚本调用一个脚本(使GUI包装进行分析)?

如果我可以在一个程序中打包分析,在另一个程序中进行数据可视化等等,然后从GUI调用我想要的程序,这将非常有帮助。因此,我试图编写一个简单的GUI(在Tkinter中),它允许我在运行该程序之前设置一些参数和文件路径等。

我习惯于其他“语言”,鼓励将程序的不同组件包装为互相通话的子程序。在python中,我的函数要么是真的很长(很多缩进,难以维护),或者我最终会有100万个互相调用的函数(很多函数很难跟踪)。

如果我试图在一个.py文件中执行此操作,它将会很长时间没有组织。为了节省时间和复杂性,我希望将GUI程序放在一个.py程序中,并根据需要让它的小部件调用其他程序(或从它们的函数)。我有一种感觉,这将涉及导入我的分析程序的功能,然后调用它们。我怎样才能做到这一点?我想调用的任何例程需要作为函数打包,然后以某种方式导入?

基本上我试图摆脱10级缩进。任何意见,将不胜感激。我也有兴趣以某种可部署的方式打包该程序,但这可能会远远高于我的薪酬等级。

+2

了解更多关于[模块和包(https://docs.python.org/3/tutorial/modules.html),你必须找到一种在子文件夹+多个文件中构建代码的方法,以便于跟踪和维护。拥有单一文件的上帝代码不是一个解决方案。之后,我会创建一个包(或一个模块,取决于您的GUI)作为GUI回调的入口点,这就是,用您的所有代码创建一个大型库,GUI应该只导入一个子包它具有控制流量的具体功能。如果您的GUI必须维护一个状态,它会变得更加复杂。 –

+0

启动单独程序(包括Python解释器)的典型方法是使用['subprocess'](https://docs.python.org/3/library/subprocess.html#module-subprocess)模块。如果您愿意,您可以在调用脚本中定义的自定义函数中将其调用包装。 – martineau

回答

1

通常优选具有比一个长功能更短的功能。

这越来越难以保持更多的功能。因此,您应该将属于一个对象的函数(例如,所有对某些对象进行操作)放到它们自己的模块(或类)中。例如。如果你有多个函数做一些数学运算,把它们放入一个文件math_utils.py。在你的主要脚本中,你可以做例如这个(如果你定义的立方根功能可按在math_utils,当然):

from math_utils import cube_root 

这个工作,只要这两个脚本都在同一个文件夹。

以同样的方式,您可以创建多个文件来保存实用功能。除此之外,你的函数应该都具有描述他们做什么以及期望作为参数以及他们返回什么的docstrings。这使得这更容易维护。您还应该添加描述每个文件中功能的模块文档。

所以你会:

文件math_utils.py

"""This module contains multiple utility functions performing some math""" 

import math 


def cube_root(x): 
    """Return the cube root of the input `x`""" 
    return pow(x, 1./3) 


... 
+0

谢谢 - 我认为“模块”概念是我缺乏的。只是要清楚 - 模块实际上并不是一个对象,它只是一个称为存在的文件来包含一些可导入的功能? – Nate

+0

@Nate是和不是。你可以调用一个包含python对象(函数,类,其他)的文件。您可以在其他脚本中导入这些文件。但是在Python中,您也可以创建模块,这是一个包含目录层次结构中多个脚本的包,然后您可以将其用作应用程序。这基本上可以通过'pip'下载。 – Graipher

+0

了解。我认为这是在使用“if __name__ =='__main__'等”时很有用,以防止在您想要执行的顶级代码从模块中导入某些功能时执行。 – Nate

相关问题