Python专家编程系列: 11.为什么在python使用__name__ == __main__
发布时间
阅读量:
阅读量
0. 标题
Python专家编程系列: 11.为什么在python使用__name__ == ‘main ’
id: 104
作者: quantgalaxy@outlook.com
欢迎交流
1. 单个 python 文件中的 name 是什么?
# a.py
print(__name__)
# python a.py
# __main__
如果在命令行中运行 a.py,比如 python a.py 的方式,name 变量默认就打印的是 “main ”。
再看一个例子:
# b.py
print(__name__)
# python b.py
# __main__
If we run a.py directly, the __name__ inside that file will automatically become '__main__'
2. 多个 python 文件引用中的 name 是什么?
# 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 脚本,会看到,输出的不再是"main ",而是"b"。
这是因为,b.py 不是直接运行的,这时候 b.py 中的 name 就是 b.py 脚本本身的名字了。这是因为 b.py 是被导入的,不是被直接执行的。
可以看下面的例子:
# b.py
def hello_b():
print('hello_b __name__:', __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
可以看到,被导入的脚本内部的 name 都是文件本身或者说模块本身的名字。
3. name 的使用
先看一下下面的例子:
# b.py
def hello_b():
print('from b.py:', __name__)
print('hahaha')
# a.py
from b import hello_b
hello_b()
执行 python a.py,输出是:
hahaha
from b.py: b
可以看到,“hahaha” 也被输出了,这是因为在import b的时候,所有b的脚本都会被执行。
如果想一些语句只在脚本被直接访问的时候执行,而不是被import的时候执行,这时候,就需要用到 name 来识别:
上面的 b.py 可以改为:
# b.py 改进版
def hello_b():
print('from b.py:', __name__)
if __name__ == '__main__':
# this only runs if we run b.py directly
# eg. by using 'python b.py'
print('hahaha')
这时候执行 python a.py,输出如下:
from b.py: b
这是因为我们利用了 if name == ‘main ’ 这个语句,来识别 b.py 脚本到底是被import的,还是被python执行器直接执行的。
这就是我们在一个程序的入口程序脚本中,经常会看到 if name == ‘main ’ 这个语句的原因。
非入口脚本,所有的语句,都应该封装在类或者函数中,这样才能保证语句都是被明确调用执行的,而不会被import的时候就被执行。
4. 作者信息
作者: quantgalaxy@outlook.com
欢迎交流
全部评论 (0)
还没有任何评论哟~
