如何真正理解 if name 的作用
admin
2023-07-08 18:44:50
0

前言

在 Python 中,我们经常会看到

if__name__ =='__main__':

那么你真的理解此写法的作用吗?今天我们就来聊一聊它真正的含义。

笔者最喜欢的就是用示例讲明白一个问题,这次也不例外,依然是看例子来说话!

示例说话

举个例子来说:

有一个物体质量 m=10,g=9.8 (重力参数),求它的重力。

公式:G=m*g

所以创建一个 param.py 的文件,其中代码如下:


如何真正理解 if name 的作用

在创建一个 sum.py 的文件求 G ,代码如下:


如何真正理解 if name 的作用

结果如下:


如何真正理解 if name 的作用

结果可以看到,在 param.py 文件中的 main 函数也被执行了,而实际上我们并不希望它被执行,只是想 G 被打印出来即可。

此时 if __name__ == '__main__' 便派上了用场。我们将 param.py 中稍作修改:


如何真正理解 if name 的作用


如何真正理解 if name 的作用

加上后,Pycharm 中多了一个绿色小按钮,点击后:

如何真正理解 if name 的作用

可以看到,在 param.py 中加上这么一句话,起到了一个入口函数的作用,也就是说对于 param.py 来说,程序入口是从这里开始的。同时不影响它自身的 g 打印输出,那么来看下求 G 中的程序。

如何真正理解 if name 的作用

求重力 G 的程序中,我们是没有改变任何代码的,可以看到结果已经变了。

结论

if __name__ == '__main__' 相当于 Python 模拟的程序入口。Python 本身并没有规定这么写,这只是一种编码习惯。由于模块之间相互引用,不同模块可能都有这样的定义,而入口程序只能有一个。到底哪个入口程序被选中,这取决于 name 的值。

__name__是内置变量,用于表示当前模块的名字。

所以,

if __name__ == '__main__'

我们简单的理解就是:如果本模块是被直接运行的,则代码块被运行,如果本模块是被导入到其它模块中去,则处于 name 中的代码不被运行。

官方文档

查阅官方文档可以看到相应的解释:

如何真正理解 if name 的作用

什么?看不懂,来个中文的!~

如何真正理解 if name 的作用

原文链接

https://docs.python.org/3/library/main__.html?highlight=__name

关于 Flask 中的拓展知识

学过 Flask 的同学,可以看下此知识点,没有学过的也可以了解一下,万一后续用到了呢,有可能面试中会问到的一个小知识点。

在 Flask 框架中,我们通常使用下面的代码来进行项目的启动:


如何真正理解 if name 的作用

上面的代码是官方给出来的一段最快启动的小 demo。不难发现,在官方定义的代码中,入口函数把 app.run() 放在了if __name__ == '__main__'里。

但是有没有想过为什么要放在里面呢?

正常开发情况下调用 app.run() 启动,使用的 web 服务器是 Flask 自带的一个简单内置服务器。

对于生产环境而言,启动一个 Flask 项目是不能直接通过 Python 去运行的,因为还面临着很多问题,比如并发性不好,无法监控项目各指标等。。。

所以在正式的生产环境中,我们是不会使用 Flask 自带的服务器的,而是通过 nginx + uwsgi 来部署项目。nginx 作为前置服务器,用来接收浏览器发来的请求,接着会把请求转发给 uwsgi ,uwsgi 会以配置文件的形式加载我们写好的项目,而加载入口则是本地开发环境下的 app.run() 方法所在的入口模块。就像下图:

如何真正理解 if name 的作用

于是,在生产环境下, app.run() 所在的模块相对于 uwsgi 来说便不是入口文件了,它是需要被导入到 uwsgi 中的一个普通模块。使用if __name__ == '__main__' 的用途就是,不让 app.run()进行启动。也就是禁止所谓 Flask 自带的服务器启动。


相关内容

热门资讯

美前副总统:共和党失去了方向,... 2026年是美国的中期选举年,共和党选情不利,可能在年底的选举中遭遇挫败。美国前副总统彭斯5月31日...
南枝原来去过中国?《给阿嬷的情... 《给阿嬷的情书》票房口碑双丰收,目前票房已突破13亿。凤凰卫视最新一期《问答神州》专访了该片导演蓝鸿...
法国海军扣押一艘俄“影子舰队”... 近日,法国海军在大西洋海域扣押了一艘据称从俄罗斯摩尔曼斯克出发的油轮,引发俄方强烈不满。俄新社6月1...
凤凰晚报丨面粉染头模仿黄仁勋,... 今日人物【面粉染头模仿黄仁勋,农村青年走红后称遭“法务”警告】“先赔偿5000元肖像侵权使用费,再删...
亲特朗普极右派候选人领跑哥伦比... 【文/观察者网 熊超然】当地时间5月31日,哥伦比亚总统选举拉开帷幕,首轮投票计票工作已完成逾99%...
2026年度网络举报系列宣传活... 5月28日至29日,以“每一件举报,都是共治的力量——豫你e行 同心护网”为主题的2026年度网络举...
中原首例帝企鹅DNA性别鉴定!... 近日,郑州海昌海洋公园正式对外公布中原首对人工繁育的帝企鹅萌宝的DNA性别鉴定报告。这是中原首个将 ...
我国科学家为细胞信号“导航”开... 新华社济南5月31日电(记者张力元)人体细胞犹如一座精密的通信城市,每天都有大量“指令”穿梭传递,调...
极端大风突袭哈尔滨!过山车停摆... 极目新闻记者 詹钘5月31日,受强对流天气影响,哈尔滨国际会展中心体育场相关设施受到损坏,原计划当晚...
三原电缆取得电缆接头连接用防护... 国家知识产权局信息显示,上海三原电缆附件有限公司取得一项名为“一种电缆接头连接用防护结构”的专利,授...