关于python:没有附加的if __name__ == “__main__”:

no additional indentation with if __name__ == “__main__”:

我知道为"script-style"python程序定义一个main()方法是一种很好的风格,这样以后可以选择将它作为一个模块包含进来。

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

1
2
3
a = 5
if a > 0:
    print a

变成

1
2
3
4
5
6
7
def main():
    a = 5
    if a > 0:
        print a

if __name__ =="__main__":
    main()

使我的所有代码都缩进一个级别。我尽量避免在代码中进行不必要的缩进/嵌套,以获得最大的清晰度,因此我想知道是否可以在这里做些什么,例如。

1
2
3
4
5
6
if __name__ !="__main__":
    return # just leave this file

a = 5
if a > 0:
    print a

但(当然)这会触发:

1
SyntaxError: 'return' outside function

这样的事情有可能吗?明智之举?惯用语?


您可以这样做:

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

# Your code here

但是,我建议不要使用这种模式——大多数情况下,很明显脚本只是命令行。如果有人有一个你在脚本中定义的用例,他们不应该仅仅为了能够导入一个函数而编辑它。


不,不可能,真的。

__name__不是'__main__'时,您的模块被另一段代码作为常规模块导入。在这种情况下,你不能提早退出。

一次额外的缩进级别有什么问题?只需点击编辑器中的标签,就可以完成了吗?就我个人而言,我发现使用main()函数可以更好地记录意图,而不是让代码不受影响。


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

完全没有理由认为这是"不必要的缩进"…


你得说服进口商自己采取不同的行为。这可能是可能的,虽然困难,但肯定不可取,因为你会引入一些非常意想不到的行为。

如果您真的想避免额外的缩进,我想您可以实现一个"公共"和"私有"模块,其中公共模块基于if __name__ == '__main__'分支以加载不同的私有模块。但是,为了避免出现一些额外的凹痕,这似乎需要穿过很多圈。在任何情况下,如果您的main()足够长,以致于缩进对您产生了干扰,那么您首先应该考虑将更多的缩进分解为函数。