关于python:写-Python-脚本一定要加上这个

1次阅读

共计 2740 个字符,预计需要花费 7 分钟才能阅读完成。

应用 Python 的人,平时常常会写一些脚本,不论是为了晋升工作效率,还是为了满足一些特定的需要,Python 脚本都是一个常见又有用的货色。

然而,我最近发现了一个以前未曾觉察的问题,就是脚本外面是否增加 if __name__ == "__main__": 这个语句,对脚本的应用其实是有很大影响的,并且这外面还有很大的学识。

常见误区

很多敌人在写脚本时比拟随便,简略的脚本间接一溜写下来,没有函数,程序执行。简单点的脚本,可能会加函数。这种写法可读性比拟差,常常让人一眼找不到程序运行的入口和程序。

而 Python 社区比拟举荐的写法是在写脚本时,加上上面这个语句:

def main():
    # do something
    print("do something.")

if __name__ == "__main__":
    main()

大多数人看到这里,会不会说,这有什么,加不加这个没那么重要吧!

先不要忙着不屑,让咱们一起来认真掰扯掰扯!

有什么用

在具体阐明 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

的 PI 变量,在运行的时候,const.py 中函数 train() 中的打印也带过去了,而咱们只是援用变量,并没有援用函数,所以这是咱们不违心看到的。

解决这个问题的办法也很简略,咱们只需在 const.py 中加上一句:

PI = 3.14

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

if __name__ == "__main__":
   train()

再次运行 area.py,输入后果如下:

round area:  12.56

这是咱们预期的后果。

程序运行入口

丛上述实例能够发现,如果没有 if __name__=="__main__":,作为 area.py 导入文件时 const.py 中的所有代码都被执行了,而加上之后就只运行导入的局部代码。

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

咱们再来看一个小程序:

# test.py

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

程序的运行后果如下:

look here
__main__
I'm test.py

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

代码标准

有了 if __name__=="__main__": 相当于 Python 程序也有了一个入口函数,咱们能够清晰的晓得程序的逻辑开始于何处,当然还须要咱们盲目的把程序的开始逻辑都放在这里。其实,这也是 PyCharm 举荐的作法。

为什么很多优良的编程语言,比方 C、Java、Golang、C++ 都有一个 main 入口函数呢?我想很重要的一个起因就是就是程序入口对立,容易浏览。

多过程场景大作用

如果你用多过程来做并行计算,相似这样的代码:

import multiprocessing as mp

def useful_function(x):
    return x * x

print("processing in parallel")
with mp.Pool() as p:
    results = p.map(useful_function, [1, 2, 3, 4])
    print(results)

运行这段代码,控制台会始终打印:

processing in parallel
processing in parallel
processing in parallel
processing in parallel
processing in parallel
processing in parallel
processing in parallel
processing in parallel
processing in parallel

并且程序会不停的报错 RuntimeError。

如果你加上了 if __name__=="__main__":,程序就会依照预期的进行:

import multiprocessing as mp

def useful_function(x):
    return x * x

if __name__ == '__main__':
    print("processing in parallel")
    with mp.Pool() as p:
        results = p.map(useful_function, [1, 2, 3, 4])
        print(results)

Python 的多程序就是启动了多个 Python 解器器,每个 Python 解释器都会导入你这个脚本,复制一份全局变量和函数给子过程用,如果有了 if __name__=="__main__":,那它前面的代码就不会被 import,也就不会被反复执行。否则,这个创立多过程的代码就会被 import,就会被执行,从而有限递归的去创立子过程

总结

if __name__=="__main__": 尽管不是强制的,然而我强列举荐你写脚本时依照这个标准来做,它是 Python 社区的约定,对应 Python 之禅:明确优于费解。

以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python 编程学习圈 ,每日干货分享,发送“J”还可支付大量学习材料,内容笼罩 Python 电子书、教程、数据库编程、Django,爬虫,云计算等等。或是返回编程学习网,理解更多编程技术常识。

正文完
 0