if __name__ == "__main__": 不会额外缩进

5
我知道为“脚本式”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

类似这样的做法是否可行?是否值得推荐?是否符合惯用语?

为了最大程度的清晰,我尽量避免不必要的缩进。此外,你可以将一个相当大的脚本分成函数来提高可读性。如果你的文件只是作为独立脚本运行,那么你根本不需要使用 if __name__ == "__main__" 检查。在这些情况下使用它主要是为了澄清脚本的流程,并防止意外的副作用,如果它被导入到其他地方。只要你知道自己在做什么(例如不考虑副作用而导入它),你就可以自由选择不使用它。 - l4mpi
4个回答

4
你可以这样做:
if __name__ != "__main__":
    throw TypeError("Attempted to import command-line only script")

# Your code here

然而,我建议不要采用这种模式 - 大多数情况下,脚本只能在命令行中运行是很明显的。如果有人需要使用你定义的某个函数,他们不应该被迫编辑脚本。


创造性的答案!但是由于需要在导入时捕获异常,它确实简化了整个情况,并且肯定是出乎意料的。而优秀的代码应该不会让人感到惊讶。 - mnagel

3

不行,这真的是不可能的。

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

而且还有什么问题,使用额外的缩进一次吗?只需在编辑器中按Tab键即可完成。个人认为,使用main()函数比保留未缩进的代码更好地记录了意图。


1
“一个额外的缩进级别有什么问题?”他说:“这关乎清晰度。保持缩进级别低通常是高质量代码的特征。” - hek2mgl
1
@hek2mgl:我发现main()函数的意图更加清晰。 - Martijn Pieters
3
main 函数(以及其他所有函数)都应该尽可能地简洁。我认为对于某些代码行需要进行缩进,这并不会破坏它的清晰度。当然,如果你在 main() 中写了数百行代码,那可能会显得有些丑陋,但这同样适用于其他所有函数。 - tamasgal
@MartijnPieters 我不是Python程序员。只是想指出减少缩进确实很重要。 - hek2mgl
2
@hek2mgl:在Python中,缩进比其他语言更重要。我理解你的观点,但这并不是那种通过减少缩进级别来增加清晰度的情况之一。 - Martijn Pieters
1
@MartijnPieters 我知道缩进在 Python 代码中的语法意义。Python 强制执行的规则应该适用于每个精心编写的源代码,这很好。但是,我不是指这种类型的缩进。我想我只是在错误的时间、错误的问题和错误的答案下面放错了评论... :) 不过,还是感谢您的回复。 - hek2mgl

2

一个函数应该只做一件事情,这也适用于main函数。它应该做一些main相关的事情,其他所有的事情都应该在函数和类中完成。

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


0

你需要让导入器本身表现出不同的行为。虽然可能是可行的,但肯定不建议这样做,因为会引入一些非常意外的行为。

如果你真的想避免额外的缩进,我想你可以实现一个“公共”和“私有”模块,其中公共模块基于if __name__ == '__main__'分支来加载不同的私有模块。但这似乎是为了避免一些额外的缩进而跳过了很多环节。无论如何,如果你的main()足够长,缩进会让你感到困扰,那么你应该考虑首先将更多的内容拆分成函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接