在 Python 中,每个模块(module)都有内置的 __name__
变量,它的值取决于模块的使用方式。当模块被直接执行时,__name__
的值是 __main__
。当模块被导入时,__name__
的值是模块的名字。
self.scope['__name__'] = '__main__'
例如,在模块 module1.py 中有:
代码语言:javascript复制print(__name__)
如果直接执行 python module1.py
,输出会是:
__main__
如果在其他模块 module2.py
中 import module1
,输出会是:
module1
利用这个特点,我们可以在模块中写一段代码来判断模块是被直接执行还是被导入,比如:
代码语言:javascript复制python
if __name__ == '__main__':
# 直接执行代码
else:
# 被导入时执行代码
这个技巧常常用于编写可以导入的脚本,在导入时提供函数和变量,在直接执行时执行主程序逻辑。例如,我们编写一个模块 module_demo.py
:
def func():
print('This is a function')
if __name__ == '__main__':
print('Executed when invoked directly')
else:
print('Executed when imported')
如果直接执行这个模块,输出会是:
代码语言:javascript复制Executed when invoked directly
如果在其他模块中导入这个模块,输出会是:
代码语言:javascript复制Executed when imported
这个模块既可以被直接执行,也可以被导入使用。再举一个实际例子,我们开发一个命令行工具,一般会编写一个入口模块,比如 tool.py
:
def main():
print('Tool started!')
if __name__ == '__main__':
main()
我们还可以编写其他模块导入和使用 tool.py
中的功能,同时当直接执行 tool.py
时,入口函数 main()
被调用,命令行工具启动。__name__
这个变量为我们实现模块的双重用途提供了可能,是 Python 中一个简单但非常有用的设计。熟练使用这个技巧可以让我们的代码更 modular, reusable 和 flexible。
总结
总之,记住:__name__ == '__main__'
表示模块被直接执行,否则模块被导入。运用这个技巧,我们可以编写既可以导入也可以直接执行的 Python 模块。