首先我要说的是,我在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
没有输出,我真的没想到输出。
我想知道的事情:
__name__ = '__main__'
中的bad.py
会自动更改__name__
中的变量main.py
吗?或者可以存在两个不同的 '__main__'
- 模块吗?import
替换__name__
语句?如果是的话,你会怎么做?当我将exit()
更改为print "Hello",
时,输出为"Hello"
,然后出现错误:
Traceback (most recent call last):
File "main.py", line 1, in <module>
import bad.py
ImportError: No module named py
有人可以解释这种行为吗?
修改
当然import bad.py
不起作用。 import
- 语句不需要任何文件结尾。我犯了这个错误,因为我也在C中编程。我将行改为import bad
。输出现在看起来像这样:
Hello Hello, World
答案 0 :(得分:0)
将导入语句更改为import bad
如果该程序直接作为主程序运行,if __name__ == '__main__':
意图是运行此代码。如您所见,您可以覆盖名称值,但如果删除if check in bad,则会产生相同的效果。
__name__
独立于main.py中的__name__
。当你再次从另一个程序调用main.py时,你可以看到。__name__
属性完全不同。所以没有。添加更多打印语句以遵循逻辑。您也可以打印__name__
本身以查看这些值。
答案 1 :(得分:0)
您的代码中发生了一些事情:
首先,您的导入行import bad.py
Isn&#39;我导入文件bad.py.它正在执行搜索see here for the search logic以查找名为bad
的模块,其中的查找和= n一次bad
被导入后,它会在该模块中查找对象调用py
,它没有找到而是返回导入错误。 (在退出()。导入bad
之前退出的版本已完成,因此它没有机会尝试查找py
其次名称。由解释器和导入逻辑为每个模块定义,当文件加载名称时,您可以在此之后更改它(如bad.py)。它也适用于模块,更改bad.__name__
不会更改main__name