在python中设计程序入口点

时间:2016-04-22 12:39:43

标签: python

用于运行所有内容的主文件现在是十几个变量(默认情况下在顶层控制流中是全局变量),几个结构和一个中等大小的主循环。从其他语言中我了解到全局变量是邪恶的。我倾向于将它全部放入同一个文件中的一个类中,并从全局控制流中调用一个方法,如下所示:

def MyClass:
  def __init__(self):
    self.value1 = 1
    ....

 if __name__ == "__main__":
   #inspect sys.argv here
   MyClass().main_proc()

你认为它是设计加吗?有没有pythonic方法来做到这一点?

1 个答案:

答案 0 :(得分:4)

Python不会强迫您使用OOP,例如Java或C#,因此如果没有为您带来实际好处,则无需将内容放入类中。

特别是创建一个类实例只是为了分组东西不是去恕我直言的最佳方式。您可以将该内容提取到模块中。这不需要任何实例,只需要导入它。这样它也在一个单独的文件和命名空间中。

示例:

main.py

if __name__ == "__main__":
    import sys
    args = sys.argv[1:]
    if len(args) != 2:
        print("This script requires exactly two command-line arguments!")
        exit(1)

    import my_module
    exit_code = my_module.run(args) or 0
    exit(exit_code)
else:
    raise ImportError("Run this file directly, don't import it!")

my_module.py

# initialization code to be run at import time goes here

def run(args):
    # do whatever you need to do
    print("Hello world!")
    print("You said <", args[0], "> and <", args[1], ">."

    # you may return an integer (1-255) as exit code if an error occurred,
    # else the default exit code is 0 (successful; no error)

然而,不要把这种方法当作最终的真理!这是我个人的,(不是那么)谦虚的意见,但总有一些情况下,一种方法更适合,而另一些方法应该适合其他方式首选。

此外,这主要是一个设计问题,对程序的稳定性或功能没有实际影响。它可能只会提高可读性,但对于小脚本来说,这不是一个好方法,因为它添加了许多实际上没有做任何事情的代码。如果您有一个包含多个模块的大型项目,那么它才有用。

对于相当小的脚本(单个文件或只有极少数模块),我建议您只需在顶部定义所需的所有类和函数,然后使用标准if __name__ == "__main__"作为入口点。