有没有更短的形式?
if __name__ == '__main__':
我觉得写起来很烦琐,而且在我看来也不太好看 :)
有没有更短的形式?
if __name__ == '__main__':
我觉得写起来很烦琐,而且在我看来也不太好看 :)
PEP299提出了一种解决这个问题的方案,即使用特殊的函数名称__main__
。然而,该方案被拒绝,部分原因是:
Guido发表了自己的看法,他认为这个想法并不好,因为需要更改文档、用户习惯等,而且也没有什么特别大的问题需要解决。
http://www.python.org/dev/peps/pep-0299/
所以这个缺陷将会保留下来,至少在Guido担任BDFL的期间是如此。
在提出这个问题后,我决定制定一个解决方案:
from automain import * # will only import the automain decorator
@automain
def mymain():
print 'this is our main function'
这篇博客文章解释了它,而且代码在Github上,可以轻松安装:
easy_install automain
if __name__ == '__main__':
,即使只导入单个装饰器也可能会牺牲过多。 - Walterfrom automain import * @automain
和 if __name__ == "__main__": mymain()
- dbr这绝对是语言中的一个瑕疵,因为任何从文件到文件都被复制和粘贴的内容都会变成样板。它没有缩写。
尽管作为瑕疵和样板,至少它很小。
如果计算行数,这段内容可以简化为更短的形式:
__name__ == '__main__' and main()
if'__main__'==__name__:
吗?# 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>