Python设计:“if __name__ == __main__”测试后的代码

时间:2012-12-18 19:33:28

标签: python

我想听听有关这个问题的意见:在

之后有很多代码是不错的主意

if __name__ == '__main__':

我问这个的原因是,我当前的项目有大约400行代码,随着它的增长,我继续在上面的语句之后添加行。所以这个程序预计会有大约3000行代码,我很担心,在这个语句之后我会有太多的代码。所以问题是“在这个声明之后编写大量代码是一种很好的pythonic方法吗?”

3 个答案:

答案 0 :(得分:5)

一个简单的替代方法是将主代码添加到main()函数中,然后在__name__检查后调用它。那样,你得到:

  • __name__检查
  • 的好处
  • 功能的好处(可能会或可能不会重复使用)
  • 内省的好处(例如,如果您需要它,可以很容易地自动分析模块的“主要”代码 - 它只是main函数!)。

一个例子:

def main():
    # Be awesome here.

if __name__ == '__main__':
    main()  # or sys.exit(main()), if you want to return an exit code

答案 1 :(得分:1)

如果你想重用你的代码,你不应该在if __name__ == '__main__'之后保留它(用于函数/类/模块,并从程序的这一部分进行最简单的调用)。让我在这里提到Python的禅(至少在你的情况下有两点):

  

稀疏优于密集。

     

可读性计数。

答案 2 :(得分:1)

听起来这里有两个不同的要点:

  • 在所有其他条件相同的情况下,可读性,可测试性,可维护性(以及可能的其他一些“-ability”值)更好地定义封装由400行命令式代码表示的行为的函数。

  • __name__ == '__main__'限定的代码在直接调用文件时仅执行 ,而不是作为import的模块包含。所以,像

    这样的文件
    def be_awesome():
        pass
    
    
    if __name__ == '__main__':
       def be_more_awesome():
            pass
    
当作为python调用的source参数提供时,

将只有be_more_awesome的定义,而不是在导入时。因此,作为一般规则,在__name__测试之后恰当地放置应该仅在文件作为脚本直接运行时运行的代码是合适的。问问自己这些问题

  • “如果我将此模块导入另一个文件,这个代码会运行吗?”
  • “直接调用此文件时是否需要调用此代码?” (如假设的main函数封装了400行)

如果这些问题中的任何一个的答案为“是”,则它(可能)属于__name__测试之后;如果没有,它(可能)不会。