if __name__ == '__mian__'的作用?

if _name_ == __mian__的作用?

当python的解释器在读取一个python源文件时,它会做两件事:

  • 为该文件设置一些特殊变量,如__name__

  • 逐行执行原文件中的代码

源文件有一个特殊的变量_name_,它的作用是标识源文件是作为主程序来执行,还是作为模块被其他主程序导入

我们来举一个例子来说明__name__实际起到的作用是怎么样的。

When your module is the main porgram

假设有一个foo.py文件:

# this is foo.py
print("before import")
import math

print("before functionA")
def functionA():
    print("Function A")

print("before functionB")
def functionB():
    print("Function B {}".format(math.sqrt(100)))

print("before __name__ guard")
if __name__ == '__main__':
    functionA()
    functionB()
print("after __name__ guard")
print(__name__)

如果将foo.py作为主程序来运行,其执行结果如下:

before import
before functionA
before functionB
before __name__ guard
Function A
Function B 10.0
after __name__ guard
__main__

可以看到,这个时候foo.py的特殊变量__name__的值为__main__

When your module is imported by another

如果我们将foo.py作为一个模块导入到另一个py文件中,且将这个py文件作为主程序来运行的时候会发生什么呢?

假设我们有一个foo1.py文件

print("before foo")
import foo

print("after foo")

print("this is foo1")

我们将foo1.py作为主程序来运行,其执行结果为:

before foo
before import
before functionA
before functionB
before __name__ guard
after __name__ guard
foo
after foo
this is foo1

我们发现,foo.py文件的_name__变量的值为foo,即文件名,而且,foo.py文件中中if _name==__main__中的代码块没有执行。

这是因为当一个py文件作为模块被外部程序调用时,编译器会将__name__设置为该文件的文件名(不包含后缀.py)。

Summary
  • __name__是python源文件的一个特殊变量,当解释器在读取源文件时会设置这些特殊变量的值
  • 当一个py文件作为主程序运行时,解释器会把该文件的__name__值设置为__main__
  • 当一个py文件作为模块被其他文件导入时,解释器会把该文件的__name__的值设置为该文件的文件名,不包含.py后缀
Why do that?

因为一个源文件中,可能有一段代码是当该文件作为模块被外部程序调用时你不想执行的,那么我们就可以通过__name__的值来将这部分代码设置为只有该文件作为主程序才会被执行。

__name__的作用就是实现在两种情况中:

  1. py文件作为主程序运行
  2. py文件作为模块被其他主程序导入

根据情况的不同,选择执行py文件的代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值