【问题标题】:Is "__main__" just a string literal?“__main__”只是一个字符串文字吗?
【发布时间】:2018-06-23 16:39:52
【问题描述】:

我刚刚开始学习 Python,而困扰我的一件事是 "__main__" 的确切类型。到目前为止,我已经看到"__main__" 主要用作字符串文字,如@9​​87654323@。
我的意思是,它不是函数,也不是变量。对于以 __ 开头的所有其他内置变量和函数,这只是令人困惑。它必须以__开头有什么特殊原因吗?我知道它在模块和命名空间的上下文中具有特殊含义,但我纯粹是在基本/原始数据类型方面进行讨论。

【问题讨论】:

  • 只是为了回答标题中的问题:是的,它只是一个字符串文字。

标签: python


【解决方案1】:

是的,它只是一个字符串。它有两个下划线的事实是因为它是一个“特殊名称”。 Python 中的特殊名称有这两个前导和尾随下划线。

docs中也说明了它实际代表的含义:

29.4。 __main__ — 顶级脚本环境

'__main__' 是顶级代码执行的范围的名称。当从标准输入、脚本或交互式提示中读取时,模块的 __name__ 设置为等于 '__main__'

一个模块可以通过检查它自己的__name__ 来发现它是否在主范围内运行,这允许一个常见的习惯用法在模块作为脚本或python -m 运行时有条件地执行代码,但是不是在导入时:

if __name__ == "__main__":
     # execute only if run as a script
     main()

对于一个包,可以通过包含一个__main__.py模块来达到同样的效果,该模块的内容将在以-m运行时执行。

【讨论】:

    【解决方案2】:

    是的,"__main__" 是字符串文字,因为模块名称是字符串。该模块被称为 __main__ 以区别于名为 main 的模块,因为它是系统分配的名称。

    【讨论】:

      【解决方案3】:

      是的,它是一个字符串文字。就像 __init__ 这样的魔术方法以 2 个下划线开始和结束,以免与其他方法混淆,__main__ 具有这样的命名,不能与现有文件的名称混合。

      【讨论】:

      • 这可能有点吹毛求疵,但__main__ 实际上是一个现有模块,试试import __main__ :)
      • @MSeifert 你是对的,谢谢 :) 从我的回答中删除了“模块”。
      • 感谢您的提示,在导入 __main__ 后,我可以使用像 __main__.varname 这样的点符号访问现有变量。这消除了很多混乱。
      • 顺便说一句,这里有一些关于import __main__的讨论:stackoverflow.com/questions/24023601/…。关于为什么这样的导入可能不好,有几点。
      【解决方案4】:

      是的,它只是一个字符串文字,在设计上看起来有点像 Python 中一些特殊方法的名称。

      文档中有更多信息:https://docs.python.org/3/library/main.html

      【讨论】:

        【解决方案5】:

        你是对的 __main__ 是一个字符串文字。 __name__ 只是一个变量(通常称为 dunder 别名)。

        这里有两种简单的方法来证明这一点:

        使用type()

        >>> type(__name__)
        <class 'str'>
        >>>
        

        这应该足够了,但您也可以覆盖 __name__ 的值,例如(但您不应该这样做):

        >>> __name__ = 'hello'
        >>> __name__
        'hello'
        >>>
        

        我的回答here expains what it is

        __name__ 是一个 DunderAlias - 可以被认为是一个全局变量(可从模块访问)并且以类似于全局的方式工作。 它是type(__name__) (yielding &lt;class 'str'&gt;) 所指示的字符串(如上所述的全局),并且是 Python 3 和 Python 2 版本的内置标准。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-11-27
          • 2011-03-01
          • 2013-05-03
          • 2011-05-28
          • 1970-01-01
          • 2011-12-21
          相关资源
          最近更新 更多