if __name__ =='__ main__'的快捷方式:

时间:2011-01-23 22:36:43

标签: python

是否有更短的形式?

if __name__ == '__main__':

写作非常繁琐,而且在我看来也不是很好看:)。

8 个答案:

答案 0 :(得分:12)

PEP299提出了这个疣的解决方案,即具有特殊的函数名__main__。它被拒绝了,部分原因是:

  圭多宣称他不喜欢   无论如何,这个想法是“不值得的   改变(在文档中,用户习惯等)   而且没什么特别的   破碎“。

http://www.python.org/dev/peps/pep-0299/

所以丑陋会留下来,至少和Guido的BDFL一样长。

答案 1 :(得分:9)

基本上每个python程序员都这样做。所以简单地忍受吧。 ;)

除此之外,如果你的脚本总是作为一个应用程序运行而不是作为模块导入,你可以完全省略它 - 但是你仍然鼓励你使用它,即使它不是真的有必要。

答案 2 :(得分:7)

在提出这个问题后,我决定解决这个问题:

from automain import *  # will only import the automain decorator

@automain
def mymain():
    print 'this is our main function'

blog post解释了它,code is on github可以轻松安装:

easy_install automain

答案 3 :(得分:3)

这绝对是语言中的一个瑕疵,就像任何变成样板并被从文件复制和粘贴的东西一样。它没有简写。

虽然疣和样板去了,但至少它是次要的。

答案 4 :(得分:3)

你的意思是像if'__main__'==__name__:一样短吗?

答案 5 :(得分:1)

不,对不起,没有。它看起来不太好,但它就是我们所拥有的。

答案 6 :(得分:1)

如果计算线数,则更短:

__name__ == '__main__' and main()

答案 7 :(得分:0)

<块引用>

写起来很乏味,在我看来也不太好看:)

我的完美主义还发现 Python main 有点丑。所以,我搜索了解决方案,最后使用了以下代码。

复制/粘贴代码:

# main_utils.py
import inspect
from types import FrameType
from typing import cast


def is_caller_main() -> bool:
    # See https://stackoverflow.com/a/57712700/
    caller_frame = cast(FrameType, cast(FrameType, inspect.currentframe()).f_back)
    caller_script_name = caller_frame.f_locals['__name__']

    return caller_script_name == '__main__'
#!/usr/bin/env python3

# test.py
# Use case

import main_utils


if main_utils.is_caller_main():
    print('MAIN')
else:
    print('NOT MAIN')

GitHub Gist 上的源代码:

<script src="https://gist.github.com/benoit-dubreuil/fd3769be002280f3a22315d58d9976a4.js"></script>