首页 文章

为什么要使用def main()? [重复]

提问于
浏览
488

可能重复:如果__name __ ==“__ main__”怎么办?

我见过一些使用的代码示例和教程

def main():
    # my code here

if __name__ == "__main__":
    main()

但为什么?是否有任何理由不在文件顶部定义您的函数,然后只在其下编写代码?即

def my_function()
    # my code here

def my_function_two()
    # my code here

# some code
# call function
# print(something)

我只是想知道主要有没有押韵?

5 回答

  • 17

    如果没有主要的标记,即使脚本作为模块导入,代码也会被执行 .

  • 214

    其他人已经回答了,但我想我还有别的东西需要补充 .

    if 语句调用 main() (没有特定顺序)的原因:

    • 其他语言(如C和Java)具有 main() 函数,该函数在执行程序时调用 . 使用这个 if ,我们可以使Python像他们一样,这对许多人来说更为熟悉 .

    • 代码将更清晰,更易于阅读和更有条理 . (是的,我知道这是主观的)

    • 这个python代码可以作为一个没有讨厌的副作用的模块 .

    • 这意味着可以针对该代码运行测试 .

    • 这意味着我们可以将该代码导入交互式python shell并测试/调试/运行它 .

    • def main 中的变量是 local ,而其外部的变量是 global . 这可能会引入一些错误和意外行为 .

    但是,你是 not required 来编写 main() 函数并在 if 语句中调用它 .

    我自己通常开始编写没有任何功能的小型一次性脚本 . 如果脚本变得足够大,或者如果我觉得将所有代码放在函数中会使我受益,那么我重构代码并执行它 . 当我编写 bash 脚本时也会发生这种情况 .

    即使您将代码放在main函数中,也不需要完全按照它编写代码 . 一个整洁的变化可能是:

    import sys
    
    def main(argv):
        # My code here
        pass
    
    if __name__ == "__main__":
        main(sys.argv)
    

    这意味着您可以从其他脚本(或交互式shell)调用 main() 来传递自定义参数 . 这可能在单元测试或批处理时很有用 . 但请记住,上面的代码需要解析argv,因此使用传递已经解析的参数的不同调用可能会更好 .

    在我编写的面向对象的应用程序中,代码如下所示:

    class MyApplication(something):
        # My code here
    
    if __name__ == "__main__":
        app = MyApplication()
        app.run()
    

    所以,随意编写更适合您的代码 . :)

  • 563

    如果foo.py的内容

    print __name__
    if __name__ == '__main__':
        print 'XXXX'
    

    A file foo.py can be used in two ways.

    导入另一个文件:import foo

    在这种情况下 __name__foo ,代码部分未执行且不打印 XXXX .

    直接执行:python foo.py

    当它直接执行时, __name____main__ 相同,并执行该部分中的代码并打印 XXXX

    使用此功能之一在同一模块中编写各种单元测试 .

  • 87

    What does if name==“main”: do?”已经回答了 .

    如果您使用 main() 函数,则可以使用 main() 函数调用其功能 . 这个(恕我直言)的主要(没有双关语)的好处是你可以对它进行单元测试 .

  • 7

    考虑第二个脚本 . 如果您在另一个中导入它,将执行“全局级别”的指令 .

相关问题