前言
在 Python 中,我们经常会看到
if __name__ == '__main__':
那么你真的理解此写法的作用吗?今天我们就来聊一聊它真正的含义。
笔者最喜欢的就是用示例讲明白一个问题,这次也不例外,依然是看例子来说话!
示例说话
举个例子来说:
有一个物体质量 m=10,g=9.8 (重力参数),求它的重力。 公式:G=m*g 所以创建一个 param.py 的文件,其中代码如下:
# 重力参数
g = 9.8
def main():
print("g:", g)
main()
>>> 控制台会打印出 --> g : 9.8。
在创建一个 sum.py 的文件求 G ,代码如下:
# 在这里我们将上面文件定义的param中的g作为重力参数引入到其中
from param import g
# 计算重力的函数
def calc_G(m):
G = m * g
return G
def main():
print("G:", calc_G(10))
main()
结果如下:
结果可以看到,在 param.py 文件中的 main 函数也被执行了,而实际上我们并不希望它被执行,只是想 G 被打印出来即可。
此时 if __name__ == '__main__' 便派上了用场。我们将 param.py 中稍作修改:
# 重力参数
g = 9.8
def main():
print("g:", g)
if __name__ == '__main__':
main()
加上后,Pycharm 中多了一个绿色小按钮,点击后:
可以看到,在 param.py 中加上这么一句话,起到了一个入口函数的作用,也就是说对于 param.py 来说,程序入口是从这里开始的。同时不影响它自身的 g 打印输出,那么来看下求 G 中的程序。
求重力 G 的程序中,我们是没有改变任何代码的,可以看到结果已经变了。
结论
if __name__ == '__main__' 相当于 Python 模拟的程序入口。Python 本身并没有规定这么写,这只是一种编码习惯。由于模块之间相互引用,不同模块可能都有这样的定义,而入口程序只能有一个。到底哪个入口程序被选中,这取决于 name 的值。
name 是内置变量,用于表示当前模块的名字。
所以,
if __name__ == '__main__'
我们简单的理解就是: 如果本模块是被直接运行的,则代码块被运行,如果本模块是被导入到其它模块中去,则处于 name 中的代码不被运行。
官方文档
查阅官方文档可以看到相应的解释:
什么?看不懂,来个中文的!~
https://docs.python.org/3/library/main.html?highlight=name
原文链接
关于 Flask 中的拓展知识
学过 Flask 的同学,可以看下此知识点,没有学过的也可以了解一下,万一后续用到了呢,有可能面试中会问到的一个小知识点。
在 Flask 框架中,我们通常使用下面的代码来进行项目的启动:
from flask import Flask
app = Flask(__name__)
# Flask quickly start
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run(host='0.0.0.0',port=81)
上面的代码是官方给出来的一段最快启动的小 demo。不难发现,在官方定义的代码中,入口函数把 app.run() 放在了if __name__ == '__main__'里。
但是有没有想过为什么要放在里面呢?
正常开发情况下调用 app.run() 启动,使用的 web 服务器是 Flask 自带的一个简单内置服务器。
对于生产环境而言,启动一个 Flask 项目是不能直接通过 Python 去运行的,因为还面临着很多问题,比如并发性不好,无法监控项目各指标等。。。
所以在正式的生产环境中,我们是不会使用 Flask 自带的服务器的,而是通过 nginx + uwsgi 来部署项目。 nginx 作为前置服务器,用来接收浏览器发来的请求,接着会把请求转发给 uwsgi ,uwsgi 会以配置文件的形式加载我们写好的项目,而加载入口则是本地开发环境下的 app.run() 方法所在的入口模块。就像下图:
于是,在生产环境下, app.run() 所在的模块相对于 uwsgi 来说便不是入口文件了,它是需要被导入到 uwsgi 中的一个普通模块。使用if __name__ == '__main__' 的用途就是,不让 app.run()进行启动。也就是禁止所谓 Flask 自带的服务器启动。
这块儿算是一点小小的拓展,关于拓展知识,若是哪里有疑问,欢迎沟通交流呐!
有想交流Python的同学,欢迎关注公号:migezatan(咪哥杂谈)。
推荐阅读:潮州网
-
手机像素真不是越高越好,不要再被手机厂商误导
关于手机像素不是越高越好这件事说过很多次了,但还是有很多人来问,这次就索性说清楚点,让大家明白像素到底是怎样一回事。其实大部分人是被手机厂商的宣传给忽悠了,从1...
2019-10-09 -
国产手机品牌排行榜出炉:华为成智能手机新国牌
近年来,国货潮正在中国悄然兴起。手机作为人们不可或缺的产品,在这方面有更直观的体现。近年来国产品牌大幅上涨,国民使用手机中,国产手机占七成以上,国牌几乎是以直线...
2019-10-09 -
苹果可能重新夺回手机销量第二名的位置
苹果可能重新夺回手机销量第二名的位置,将华为拉回到第三名。华为目前处境艰难,其最令人期待的秋季旗舰机型Mate 30系列受到美国规定的影响。这体现在Mate30...
2019-10-09 -
长条外型看似遥控器 安卓之父展示新手机设计
自Essential Phone发布后,安卓之父的安迪·鲁宾已有较长一段时间没有更新发布新款手机产品,甚至还传出了Essential Phone只有一代没有后续...
2019-10-09 -
iPhone11好评数17万条,华为mate
高端手机市场目前也是三分天下,在国际市场上三星、苹果占据大头,这几年的华为mate、p系列也是在后面穷追猛赶,在部分地区实现了对苹果和三星的超越,而在国内市场,...
2019-10-09 -
iPhone11“鬼影门”持续发酵!这里面到
近期一些iPhone用户反映新买的iPhone11系列手机在夜间拍照时会出现很明显的“鬼影”。这里的“鬼影”一般出现在强逆光拍摄的照片中,这种现象主要是强烈光线...
2019-10-09 -
它不是金条,它是安卓之父的下一部手机
如果你觉得今年的折叠手机的玩法已经超乎你心中所想,那么Essential(安卓之父的手机品牌)的下一部手机应该会让你大吃一惊,因为他们似乎做出了一款类似折叠的细...
2019-10-09 -
荣耀宣布EMUI10升级计划:11款机型在列
基于安卓10打造的EMUI10系统伴随着华为Mate30系列正式发布。新系统带来了全新的UI设计以及人性化功能。国庆节前,华为官方公布了EMUI10升级计划,华...
2019-10-09