【问题标题】:does `def main(args):` in python make sense?python中的`def main(args):`有意义吗?
【发布时间】:2015-11-13 20:54:52
【问题描述】:

我看到很多类似这样的 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 函数有意义吗?

【问题讨论】:

  • 使其成为一个独特的函数提供了一个固定的入口点,使其更易于测试。
  • 我一直这样做是使用临时创建的模块...然后添加 main2() 或其他名称来测试功能。

标签: python coding-style


【解决方案1】:

...如果它打算从其他地方进口,它应该是 给定一个更有意义的名称(并接受更常见的参数 时尚)

这里偏爱像main 这样的通用名称的主要原因是特别是通用的:即,用于多态性。

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

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

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

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

【讨论】:

    猜你喜欢
    • 2011-08-25
    • 2020-03-08
    • 2014-02-22
    • 1970-01-01
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多