Python专家编程系列: 11.为什么在python使用__name__ == __main__

0. 标题

Python专家编程系列: 11.为什么在python使用__name__ == ‘main

id: 104

作者: quantgalaxy@outlook.com   
欢迎交流   

1. 单个 python 文件中的 __name__ 是什么?

我们先看一个简单的python程序脚本a.py:

# 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__ 是什么?

我们来看下,如果有两个文件,a.py 和 b.py:

# b.py
def hello_b():
    print('hello_b __name__:', __name__)

a.py 来使用 b.py 的函数:

# 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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rockwood573

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值