是否有更短的形式?
if __name__ == '__main__':
写作非常繁琐,而且在我看来也不是很好看:)。
答案 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>