if __name__ ==" __ main __":没有额外的缩进:

时间:2013-07-12 14:13:50

标签: python main idiomatic

我知道为“脚本式”python程序定义一个main()方法是一种很好的方式,所以稍后可以选择将它作为一个模块包含在内。

所以让我们假设这段代码(随机片段):

a = 5
if a > 0:
    print a

变为

def main():
    a = 5
    if a > 0:
        print a

if __name__ == "__main__":
    main()

导致我的所有代码缩进一个级别。 我尽量避免在我的代码中使用不必要的缩进/嵌套以获得最大的清晰度,因此我想知道是否可以在这里完成某些事情,例如。

if __name__ != "__main__":
    return # just leave this file

a = 5
if a > 0:
    print a

但(当然)这会触发:

SyntaxError: 'return' outside function

是这样的吗?可取?惯用的?

4 个答案:

答案 0 :(得分:4)

可以这样做:

if __name__ != "__main__":
    throw TypeError("Attempted to import command-line only script")

# Your code here

但是,我建议不要使用这种模式 - 大多数情况下,脚本只是命令行应该非常明显。如果有人为您在脚本中定义的内容设置了一个用例,那么他们就不必编辑它就可以导入一个函数。

答案 1 :(得分:3)

不,不可能,真的。

__name__ '__main__'时,您的模块是由另一段代码导入的,作为常规模块。在这种情况下,你不能早日摆脱困境。

一次额外缩进级别有什么问题?只需在编辑器中点击标签,然后完成它?就我个人而言,我发现使用main()函数记录的意图远比保留代码缩进更好。

答案 2 :(得分:2)

一个函数应该做一件事,这也适用于main。它应该做(某些)main个东西,其他一切都应该在函数和类中完成。

绝对没有理由将此视为“不必要的缩进”......

答案 3 :(得分:0)

你必须诱导导入器本身表现不同。这可能是困难的,但肯定是不可取的,因为你会引入一些非常意外的行为。

如果你真的想避免额外的缩进,我想,你可以实现一个“公共”和“私有”模块,其中公共模块基于if __name__ == '__main__'分支以加载不同的私有模块。但这似乎有很多箍,以避免一些额外的缩进。在任何情况下,如果你的main()足够长,以至于缩进对你不利,你应该考虑首先将更多的内容放入函数中。