模块化和重用
假设我们有两个Python文件:math_utils.py
和 main.py
。
一. math_utils.py
这个文件包含了一些数学相关的函数,我们希望这些函数既可以被其他模块导入使用,也可以作为一个独立的脚本执行来测试其功能。
# math_utils.py
def add(a, b):
return a + b
def subtract(a, b):
return a - b
# 以下代码块用于测试函数
if __name__ == "__main__":
print("Testing add function:", add(5, 3))
print("Testing subtract function:", subtract(5, 3))
当你直接运行 math_utils.py 时,由于 __name__的值为 "__main__",因此会执行 if语句块内的测试代码,并看到输出:
Testing add function: 8
Testing subtract function: 2
二. main.py
这个文件现在想要使用 math_utils.py
中定义的函数。
import math_utils
# 调用 math_utils.py 中的函数
print("Using add function in main.py:", math_utils.add(10, 20))
print("Using subtract function in main.py:", math_utils.subtract(10, 20))
当你运行 main.py
时,它只会导入 math_utils.py
中的函数并使用它们,而不会执行 math_utils.py
中的测试代码,因为此时 math_utils.py
是被导入的模块,__name__
的值不再是 "__main__",结果如下:
Using add function in main.py: 30
Using subtract function in main.py: -10
三. 为什么要这样做?
- 模块化和重用:通过将测试代码放在
if __name__ == "__main__":
下,我们可以保持math_utils.py
文件的整洁和专注于其数学功能,同时仍然能够轻松地测试这些功能。 - 避免不必要的副作用:当我们从其他模块导入
math_utils
时,我们不希望它执行任何额外的代码(如测试代码),这可能会产生不必要的副作用或干扰我们的程序逻辑。 - 清晰的程序结构:这种做法有助于维护清晰的程序结构,使得代码更易于理解和维护。