Python 中的 __name__
变量
在 Python 中,__name__
是一个特殊的内置变量,用于表示当前模块的名称。它的值取决于模块是如何被使用的。如果模块是被直接执行的,__name__
的值为 "__main__"
;如果模块是被导入的,__name__
的值为模块的名称。
- 直接执行模块:当一个 Python 文件被直接执行时,
__name__
的值为"__main__"
。 - 导入模块:当一个 Python 文件被作为模块导入时,
__name__
的值为模块的名称(即文件名,不包括.py
扩展名)。
示例
示例1:直接执行模块
假设我们有一个名为 mymodule.py
的文件,内容如下:
# 文件名: mymodule.py
def greet(name):
return f"Hello, {name}!"
if __name__ == "__main__":
print("This module is being run directly.")
print(greet("Alice"))
在这个例子中,如果直接执行 mymodule.py
,__name__
的值为 "__main__"
,因此会执行 if
语句块中的代码:
python mymodule.py
输出:
This module is being run directly.
Hello, Alice!
示例2:导入模块
假设我们有一个名为 main.py
的文件,内容如下:
# 文件名: main.py
import mymodule
print("This module is being imported.")
print(mymodule.greet("Bob"))
在这个例子中,如果执行 main.py
,mymodule
模块被导入,__name__
的值为 "mymodule"
,因此不会执行 mymodule.py
中的 if
语句块:
python main.py
输出:
This module is being imported.
Hello, Bob!
使用场景
__name__
变量常用于以下场景:
- 模块测试:在模块中编写测试代码,只在直接执行模块时运行测试。
- 避免重复执行:确保某些代码只在模块被直接执行时运行,而不是在被导入时运行。
示例3:模块测试
假设我们有一个名为 calculator.py
的文件,内容如下:
# 文件名: calculator.py
def add(a, b):
return a + b
def subtract(a, b):
return a - b
def multiply(a, b):
return a * b
def divide(a, b):
if b == 0:
raise ValueError("Cannot divide by zero.")
return a / b
if __name__ == "__main__":
print("Running tests...")
assert add(2, 3) == 5
assert subtract(5, 2) == 3
assert multiply(3, 4) == 12
assert divide(10, 2) == 5
print("All tests passed.")
在这个例子中,如果直接执行 calculator.py
,会运行测试代码:
python calculator.py
输出:
Running tests...
All tests passed.
如果 calculator.py
被导入到其他模块中,测试代码不会被执行。