if __name__ == '__main__' 的快捷方式:

18

有没有更短的形式?

if __name__ == '__main__':

我觉得写起来很烦琐,而且在我看来也不太好看 :)


3
“Tedious to write” - 但每个模块最多只需写一次,通常不会太频繁。 “看起来不太好看” - 是的,但你能应付得了它。 - user395760
3
我多年来一直使用它,delnan ;) - gak
我来这里是期望得到一个特定IDE的解决方案。编程语言需要它,但即使如此,一个好的IDE仍然可以让它更容易地包含(写作是繁琐的部分,因此一个按钮或一个键盘快捷键的解决方案就足够了)。 - Trilarion
8个回答

13

PEP299提出了一种解决这个问题的方案,即使用特殊的函数名称__main__。然而,该方案被拒绝,部分原因是:

Guido发表了自己的看法,他认为这个想法并不好,因为需要更改文档、用户习惯等,而且也没有什么特别大的问题需要解决。

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

所以这个缺陷将会保留下来,至少在Guido担任BDFL的期间是如此。


9
基本上每个Python程序员都会这样做。所以,简单地接受它吧。 ;)
此外,如果您的脚本总是被视为应用程序而不是作为模块导入,则可以完全省略它-但是即使不是必需的,也鼓励您使用它。

9
我对得到6个赞却没有回答问题的回答感到好笑。 - Glenn Maynard
1
也许我应该开始一个 PEP :) - gak
3
@Gerald:请参考PEP299(以及我的回答),看起来我们必须接受这个。对于一种在其他方面都如此简洁的语言来说,这真是遗憾,因为第一天学习Python的新手就会接触到一个违反“Python之禅”第一行原则的实现细节。:“美丽胜于丑陋。” - Matt Curtis

8

在提出这个问题后,我决定制定一个解决方案:

from automain import *  # will only import the automain decorator

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

这篇博客文章解释了它,而且代码在Github上,可以轻松安装:

easy_install automain

6
虽然这是一个很棒的 Python 技巧,但是由于该模块增加了复杂性,使其变得不太实用。使用此模块的代码会让任何读者感到困惑,并期望找到 if __name__ == '__main__':,即使只导入单个装饰器也可能会牺牲过多。 - Walter
2
这两个长度几乎一样吗?以最公平的计算方式来看,它大约比前者短3个字符。 from automain import * @automainif __name__ == "__main__": mymain() - dbr

4

这绝对是语言中的一个瑕疵,因为任何从文件到文件都被复制和粘贴的内容都会变成样板。它没有缩写。

尽管作为瑕疵和样板,至少它很小。


3

如果计算行数,这段内容可以简化为更短的形式:

__name__ == '__main__' and main()

3
你是说像这样更短的写法 if'__main__'==__name__: 吗?

1
抱歉,没有。虽然看起来不太好,但这就是我们所拥有的。

0
写起来相当繁琐,而且在我看来也不太好看 :) 我的完美主义也觉得 Python 的 main 函数有点丑。因此,我寻找了解决方案,最终使用了以下代码。
复制/粘贴的代码:
# main_utils.py
import inspect
from types import FrameType
from typing import cast


def is_caller_main() -> bool:
    # See https://dev59.com/iXE85IYBdhLWcg3wr1ux#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')

Source on GitHub Gist :

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


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