彩虹然

rainbow-ran

Python3.7之if __name__ == '__main__'

原文链接:https://blog.csdn.net/qq_33254870/article/details/81668297

在具体说明if __name__ == '__main__' 功能前,先从一个简单的实例直观上感受一下。

const. py

PI = 3.14


def train():
    print("PI:", PI)

train()

area. py

from const import PI


def calc_round_area(radius):
    return PI * (radius ** 2)


def calculate():
    print("round area: ", calc_round_area(2))

calculate()

现在运行area. py文件,看结果:

PI: 3.14
round area:  12.56

可以看见,const. py中的train()也被运行了,实际上我们是不希望它被运行,只是想把const. py中 PI 变量导入到 area. py。现在把 const. py 改一下:

PI = 3.14


def train():
    print("PI:", PI)


if __name__ == "__main__":
    train()

运行area. py文件发现没有执行const. py中train()。

round area:  12.56

if _name_ == '__main__' 功能

丛上述实例可以发现,运行const. py文件时if __name__== "__main__": 语句之前与之后代码都被执行,但作为area. py导入文件时就不会执行if __name__=="__main__": 语句之后代码。

实际上if __name__=="__main__":就相当于是 Python 模拟的程序入口。由于模块之间相互引用,不同模块可能都有这样的定义,而入口程序只能有一个,选中哪个入口程序取决于 __name__ 的值。

可以做一下测试:

test. py

print("hahaha")
print(__name__)

if __name__ == '__main__':
    print("I'm test.py")

'''
hahaha
__main__
I'm test.py
'''

可以发现,此时变量__name__的值为"__main__",即打印“I'm test. py”。如果运行其他文件,通过运行的文件调用本文件,则不会打印该语句,因为程序入口不对,该语句不执行。

举个栗子:

receiver. py

print("receiver_haha")


def test():
    print("test can be called!")


def receiver_print():
    print("I'm receiver.py")


if __name__ == '__main__':
    receiver_print()

caller. py

print("caller_haha")


def test():
    print("caller_test can be called!")


def caller_print():
    print("I'm caller.py")


if __name__ == '__main__':
    caller_print()
    test()

运行caller. py,结果如下:

receiver_haha
caller_haha
I'm caller.py
caller_test can be called!

可以发现receiver. py中if __name__=="__main__"后语句没有执行,因为此时运行的是caller. py,而找不到进去receiver. py的入口!使用这种方法可以控制代码的执行。

posted @ 2020-03-24 23:43  彩虹然  阅读(546)  评论(0编辑  收藏  举报