【问题标题】:Shortcut for if __name__ == '__main__':if __name__ == '__main__' 的快捷方式:
【发布时间】:2011-06-14 04:54:26
【问题描述】:

这个有更短的形式吗?

if __name__ == '__main__':

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

【问题讨论】:

  • “写起来很乏味” - 但每个模块最多一次,通常不那么频繁。 “看起来不太好” - 是的,但你会活下来的。
  • 我已经活了好几年了,delnan ;)

标签: python


【解决方案1】:

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

Guido 表示他不喜欢 无论如何,这个想法因为它“不值得 改变(在文档、用户习惯等方面) 并没有什么特别的 坏了。”

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

所以丑陋会一直存在,至少只要 Guido 是 BDFL。

【讨论】:

    【解决方案2】:

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

    此外,如果您的脚本始终作为应用程序运行而不是作为模块导入,则您可以完全省略它 - 但我们鼓励您无论如何都使用它,即使它不是真的必要。

    【讨论】:

    • (我很高兴 +6 的答案实际上并没有给出问题的答案。)
    • 也许我应该开始 PEP :)
    • @Gerald:见 PEP299(和我的回答),看起来我们被困住了。 (对于一种语言如此干净,以至于在第一天,一个新的 Python 程序员接触到一个违反“Python 之禅”第一行的实现细节:“美丽胜于丑陋”的语言,这是一种耻辱)跨度>
    【解决方案3】:

    问了这个问题后,我决定做一个解决方案:

    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
    

    【讨论】:

    • 虽然绝对是一个简洁的 Python 技巧,但这个模块添加的复杂性使其不太有用。使用这个模块的代码会让任何读者“wtf!?”,期待找到if __name__ == '__main__':,甚至单个导入的装饰也可以说是太大的牺牲。
    • ...这不是几乎一样的长度吗?以最公平的计算方式,它大约短了 3 个字符。 from automain import * @automainif __name__ == "__main__": mymain()
    【解决方案4】:

    这绝对是语言中的一个缺陷,就像任何成为样板并从一个文件复制和粘贴到另一个文件的东西一样。它没有简写。

    尽管如此,至少它是次要的。

    【讨论】:

      【解决方案5】:

      你的意思是像if'__main__'==__name__:这样更短?

      【讨论】:

        【解决方案6】:

        更短,如果你计算行数:

        __name__ == '__main__' and main()
        

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

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

            我的完美主义也发现 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>

            【讨论】:

              猜你喜欢
              • 2018-11-22
              相关资源
              最近更新 更多