【发布时间】:2011-06-14 04:54:26
【问题描述】:
这个有更短的形式吗?
if __name__ == '__main__':
写起来很乏味,而且在我看来也不好看:)
【问题讨论】:
-
“写起来很乏味” - 但每个模块最多一次,通常不那么频繁。 “看起来不太好” - 是的,但你会活下来的。
-
我已经活了好几年了,delnan ;)
标签: python
这个有更短的形式吗?
if __name__ == '__main__':
写起来很乏味,而且在我看来也不好看:)
【问题讨论】:
标签: python
PEP299 为这个疣提出了一个解决方案,即具有一个特殊的函数名称__main__。它被拒绝了,部分原因是:
Guido 表示他不喜欢 无论如何,这个想法因为它“不值得 改变(在文档、用户习惯等方面) 并没有什么特别的 坏了。”
http://www.python.org/dev/peps/pep-0299/
所以丑陋会一直存在,至少只要 Guido 是 BDFL。
【讨论】:
基本上每个 Python 程序员都会这样做。所以简单地忍受它。 ;)
此外,如果您的脚本始终作为应用程序运行而不是作为模块导入,则您可以完全省略它 - 但我们鼓励您无论如何都使用它,即使它不是真的必要。
【讨论】:
问了这个问题后,我决定做一个解决方案:
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
【讨论】:
if __name__ == '__main__':,甚至单个导入的装饰也可以说是太大的牺牲。
from automain import * @automain 与 if __name__ == "__main__": mymain()
这绝对是语言中的一个缺陷,就像任何成为样板并从一个文件复制和粘贴到另一个文件的东西一样。它没有简写。
尽管如此,至少它是次要的。
【讨论】:
你的意思是像if'__main__'==__name__:这样更短?
【讨论】:
更短,如果你计算行数:
__name__ == '__main__' and main()
【讨论】:
不,抱歉,没有。它看起来不太好,但这是我们所拥有的。
【讨论】:
写起来很乏味,而且在我看来也不好看:)
我的完美主义也发现 Python mains 有点丑。于是,我搜索了解决方案,最后使用了以下代码。
复制/粘贴代码:
# 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>
【讨论】: