python 中的 `def main(args):` 有意义吗?

does `def main(args):` in python make sense?

我看到很多 Python 代码如下所示:

def do_something(arg):
    # some stuff

def do_something_else(arg):
    # some other stuff

def main(args):
    do_something(args.an_arg)
    do_something_else(args.another_arg)

if __name__ == "__main__":
    args = parse_args()
    main(args)

我想知道 why/whether 定义 main 函数是否有意义。如果函数 main 不打算从其他地方导入,那么这看起来非常好:

def do_something(arg):
    # some stuff

def do_something_else(arg):
    # some other stuff

if __name__ == "__main__":
    args = parse_args()
    do_something(args.an_arg)
    do_something_else(args.another_arg)

...如果打算从其他地方导入它,应该给它一个更有意义的名称(并以更通常的方式接受参数):

def do_something(arg):
    # some stuff

def do_something_else(arg):
    # some other stuff

def do_two_things(arg1, arg2):
    do_something(args.an_arg)
    do_something_else(args.another_arg)

if __name__ == "__main__":
    args = parse_args()
    do_two_things(args.an_arg, args.another_arg)

这样对吗?像上面的例子那样定义一个 main 函数有意义吗?

... and if it is intended to be imported from elsewhere, it should be given a more meaningful name (and accept arguments in the more usual fashion)

这里喜欢通用名称的主要原因,例如 main 是特别通用的:即多态性。

例如,假设您有一堆要测试的模块,这些模块设计为独立执行(而不是从其他模块导入)。但是要测试它们,您需要使用 python 脚本创建一个临时目录,将生成的文件作为测试内容填充其中,然后以一种通用的方式执行这些模块中的每一个,而不考虑独特的差异您想要以这种方式测试的每个模块。

要在 python 中完成这一切,您需要这些要测试的模块为其所有主要入口点函数提供一个共同的标识符,无论它是 main 还是其他(关键是所有模块都一样给它们一个统一的public接口)。除了函数是该模块的主要入口点这一事实之外,所有这些函数的主要入口点函数的名称都必须相当难以描述,因为每个模块都必须导出一个与下一个模块同名的函数除此之外,为了让依赖于每个模块的多态代码提供统一的public接口。

当在这种上下文中需要多态时,无论是 类 还是模块,我们可以使用的最具描述性的名称不能考虑太多细节。它无法考虑每个模块具体做什么,因为它需要 跨模块 统一。在这种特殊情况下,我们需要一个非常通用的名称,main 是一个非常通用的名称。

因此,人们可能更喜欢在这里使用一个不起眼的名称,不准确描述函数的作用,而是允许一大堆模块提供具有相同名称的函数,以便它们都可以以相同的方式统一使用通过完全相同的代码。