【问题标题】:What does __name__ actually do in python?__name__ 在 python 中实际上做了什么?
【发布时间】:2017-04-28 12:29:49
【问题描述】:

首先我必须说,我不是 Python 新手。我对if __name__ == '__main__':用途了如指掌。我只是想了解 Python 解释器如何处理这个问题。我编写了两个脚本来测试 Python 中的可能性。请注意,这实际上是非常糟糕的 Python——我不会使用这些东西。我只想了解可能性

main.py:

import bad.py


def main():

    print "Hello, World!"


if __name__ == '__main__':

    main()

bad.py:

__name__ = '__main__' # I expected an Error caused by this line


def main():

    exit() # I know that this function shouldn't be used


if __name__ == '__main__':

    main()

运行main.py 没有输出,我没想到会有输出。

我想知道的:

  • bad.py 中的__name__ = '__main__' 是否会自动更改main.py 中的变量__name__?或者可以存在两个不同 '__main__'-modules 吗?
  • 是否可以仅通过操作__name__ 来替换import 语句?如果是,你会怎么做?
  • 当我将exit() 更改为print "Hello", 时,输出为"Hello",然后出现错误:

    Traceback (most recent call last):
      File "main.py", line 1, in <module>
        import bad.py
    ImportError: No module named py
    

    有人能解释一下这种行为吗?

  • python 版本/操作系统之间有什么区别吗?我在 Linux2 上的 Python 2.7.6 中尝试了这个示例

编辑:

当然import bad.py 不起作用。 import-statements 不需要任何文件结尾。我犯了这个错误是因为我也是用 C 编程的。我把行改为import bad。现在的输出如下所示:

Hello Hello, World

【问题讨论】:

  • 看看这个问题,stackoverflow.com/questions/15883526/…。答案就是你想要的。 __name__ 的变化取决于您在 python 中导入文件的方式。
  • @PrestonHager 对不起,我无法在问题标题中写下 every 点 - 您的链接问题的答案并不能回答我问题的每一点。如果这些点也重复,请留下其他问题的链接
  • 好的,如果__name__ 变量可用于导入,答案是否定的,它不能。 Python 必须调用 __import__() 函数。关于系统退出的另一个问题很有趣。 Python 2 和 3 之间的这些函数没有区别,虽然我不知道操作系统。
  • 您是否在 python 文档中搜索过对 __name__ 的引用?
  • 这是一个相当不错的解释:docs.python.org/3/library/__main__.html

标签: python import python-import importerror


【解决方案1】:

将您的导入语句更改为import bad

if __name__ == '__main__': 的意图是如果该程序作为主程序直接运行,则运行该代码。如您所见,您可以覆盖 name 值,但如果您删除 if check in bad,则会出现相同的效果。

  • bad.py 中的 __name__ 独立于 main.py 中的 __name__。当您再次从另一个程序调用 main.py 时,您会看到这一点。
  • 导入功能与__name__属性完全不同。所以没有。
  • 您收到错误是因为 main 在 bad 完成后继续进行下一次导入。并且无法导入py。

添加更多打印语句以遵循逻辑。您还可以打印 __name__ 本身来查看这些值。

【讨论】:

  • 1.) 我的导入语句已经是 import bad.py。我不知道你是不是真的有别的意思。
  • 2.) 如果我再次从另一个程序运行main.py,它是全新的解释。当然在这种情况下它是独立的,所以这个检查没有意义
  • 3.) 据我所知,import 关键字对__name__ 的值有影响(在导入的脚本中)
  • 我的错。我的意思是import bad。删除 .py
  • 哦,当然 ;) 可能是我在 C 中编写的程序太多。我修复了它,现在输出是 Hello Hello, World!(没有换行符),正如我预期的那样
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-02
  • 2020-11-21
  • 2015-02-26
  • 2017-06-29
  • 2013-06-13
  • 2021-10-25
  • 2011-08-12
相关资源
最近更新 更多