Python 基础知识 | 如何理解 Python 中的 if __name__ == `__main__` 这行代码的含义
if __name__ == '__main__'的意思是:当.py文件被直接运行时,if __name__ == '__main__'之下的代码块将被运行;当.py文件以模块形式被导入时,if __name__ == '__main__'之下的代码块不被运行car.py#!/usr/bin/env python# -*- encoding: utf-8 -*-"""一个可用于表示汽车的类,该模块
Python中__name__
的含义
__name__
是 Python 的一个内置变量
核心 变量
__name__
的取值为'__main__'
或脚本文件名
当你直接执行一段脚本的时候,这段脚本的 __name__
变量等于'__main__'
,当这段脚本被导入其他程序的时候,__name__
变量等于脚本本身的名字(不包括.py)
具体地:
(1) 当前.py文件被直接运行时:if __name__ == '__main__'
之下的代码块会被运行
(2)当前.py文件以模块形式被其他.py文件导入并运行那个.py 文件时:if __name__ == '__main__'
之下的代码块不会被运行,因为__name__
等于当前文件名
示例
有两个 py 文件,其中 action.py 文件调用了 human.py 文件
不管是哪种 import 导入方式,都会隐式地导入 human 所有内容,运行 action.py 时会先运行 human.py
而当前文件能用 human.py 中的哪些函数或类,则需要看你 import 的方法
action.py
from human import walk
print("action.py: ", end="")
walk()
运行 action.py,输出结果如下
human
human.py: I'm saying now.
action.py: I'm walking now.
human.py
运行 action.py 时, human.py 中所有内容去隐式地替换 from human import walk
但此时__name__
的值为human
,不是'__main__'
,所以 if 下的代码块不会被执行。同时由于当前文件没有声明 say 函数,所以不能用 say 函数,只能用 walk 函数
def say():
print("I'm saying now.")
def walk():
print("I'm walking now.")
if __name__ == '__main__':
print("human.py: ", end="")
walk()
print(__name__)
print("human.py: ", end="")
say()
直接运行 human.py 输出结果如下
human.py: I'm walking now.
__main__
human.py: I'm saying now.
说明:
建议以后在写 Python 程序时所有执行语句放在 if __name__ == '__main__'
下面,防止它被作为脚本导入时,运行多余的代码
更多示例
car.py
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""一个可用于表示汽车的类,该模块被my_car.py调用"""
# 如果直接运行这个模块,输出__main__
# 如果这个模块被调用,则在调用程序中会输出car(该模块名)
print(__name__)
# 直接运行该模块会输出Hello,被别的文件调用时不会输出Hello
if __name__ == '__main__':
print("Hello")
print("World!") # 被别的文件调用时会先输出World
class Car():
--snip--
abs.py
如果别的程序想调用 abs.py的几个函数,那if __name__ == "__main__":
下的代码就不会被运行,这从逻辑上讲也很正确
"""Absolute Value."""
def abs_val(num):
"""
Find the absolute value of a number.
>>> abs_val(-5.1)
5.1
>>> abs_val(-5) == abs_val(5)
True
>>> abs_val(0)
0
"""
return -num if num < 0 else num
def test_abs_val():
"""
>>> test_abs_val()
"""
assert 0 == abs_val(0)
assert 34 == abs_val(34)
assert 100000000000 == abs_val(-100000000000)
if __name__ == "__main__":
print(abs_val(-34)) # --> 34
参考资料
[1] @ Python中的 name 变量,到底是个什么东西?
[2] 如何简单地理解Python中的 if name == ‘main’
更多推荐
所有评论(0)