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

时间:2015-11-13 20:54:52

标签: python coding-style

我看到很多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)

我想知道为什么/定义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函数是否有意义?

1 个答案:

答案 0 :(得分:1)

  

......如果它打算从别处进口,那应该是   给出一个更有意义的名称(并接受更常见的参数   方式)

在这里支持通用名称的主要原因如main特别是通用的:即,对于多态性。

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

要在python中执行此操作,您需要测试这些模块,以便为所有主要入口点函数设置共同的标识符,无论它是main还是其他(关键字)是因为所有模块都给它们一个统一的公共接口是一样的。所有这些函数的名称对于它们的主入口点函数必须是非描述性的,除了函数是该模块的主要入口点之外,因为每个模块必须导出具有相同名称的函数作为下一个模块旁边是为了允许这种依赖于每个模块的多态代码提供统一的公共接口。

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

因此,人们可能会赞成这里的一个非描述性名称,而不是准确描述该函数的功能,而是允许一大堆模块提供具有相同名称的函数,以便它们可以通过相同的方式统一使用完全相同的代码。