初识 __name__
假设我们有一个 Python 脚本 a.py
# a.py
print(__name__)
# python a.py
# __main__
当我们用python a.py
命令运行a.py
时,a.py
内的__name__
变量会自动被设置为__main__
。
# b.py
print(__name__)
# python b.py
# __main__
同样,如果使用 python b.py
命令运行 b.py
,b.py
的 __name__
变量将自动变成 __main__
。
如果我们直接运行
.py
,文件中的__name__
会自动变成'__main__'
。
有 2 个 .py 文件
假设有 2 个文件 a.py
和 b.py
。
# b.py
def hello_b():
print('hello_b __name__:', __name__)
# a.py
from b import hello_b
hello_b()
# python a.py
# hello_b __name__: b
在 a.py
中,从 b.py
导入一个函数。在 b.py
中的这个函数中,打印 __name__
。然后使用 python a.py
直接运行a.py
(注意,b.py
不会直接运行)
由于直接运行了 a.py
,所以 a.py
中只有 __name__
是 '_main__'
。从 b.py
中导入的 __name__
将是 'b'
而不是 '__main__'
。
有 3 个 .py 文件
代码语言:javascript复制# b.py
def hello_b():
print('from b.py:', __name__)
# c.py
def hello_c():
print('from c.py:', __name__)
# a.py
from b import hello_b
from c import hello_c
hello_b() # from b.py: b
hello_c() # from c.py: c
在此示例中,a.py
分别从 b.py
和 c.py
中导入了一个函数,这两个函数都打印了 __name__
。由于我们直接运行 a.py
,因此 b.py
中的 __name__
是 'b'
,而 c.py
中的 __name__
是 'c'
。
这解释了为什么我们会在打印语句中看到 from b.py: b
和 from c.py: c
。
意外运行我们不想运行的代码
代码语言:javascript复制# b.py
def hello_b():
print('from b.py:', __name__)
print('@公众号:数据STUDIO')
# c.py
def hello_c():
print('from c.py:', __name__)
# a.py
from b import hello_b
from c import hello_c
hello_b()
hello_c()
在这里,我们在 b.py
中添加了额外的打印语句,并直接使用 python a.py
运行 a.py
。输出结果如下
@公众号:数据STUDIO
from b.py: b
from c.py: c
在这里,请注意 @公众号:数据STUDIO
也被打印出来了。这是因为我们从 b.py
中导入了一个函数。
添加 if __name__ == '__main__'
代码语言:javascript复制# b.py
def hello_b():
print('from b.py:', __name__)
if __name__ == '__main__':
# 只有直接运行 b.py 时才能运行
# 例如,使用 "python b.py"
print('@公众号:数据STUDIO')
# c.py
def hello_c():
print('from c.py:', __name__)
# a.py
from b import hello_b
from c import hello_c
hello_b()
hello_c()
在这里,如果我们运行 python a.py
,会得到这样的输出:
from b.py: b
from c.py: c
这是因为我们在文件 b.py
中添加了 if __name__ == '__main__'
的语句。只有在直接运行 Python 脚本时,才会执行此处的代码块。
在这个例子中,print('@公众号:数据STUDIO')
只有在我们直接运行 b.py
文件时才会被执行,也就是说,我们使用命令 python b.py
。
if __name__ == '__main__'
用于防止意外运行我们不想运行的代码。