百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

python小课堂37 - 你并没有真正的理解 if name 的作用

off999 2025-01-07 14:54 21 浏览 0 评论

前言

在 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(咪哥杂谈)。

相关推荐

在NAS实现直链访问_如何访问nas存储数据

平常在使用IPTV或者TVBOX时,经常自己会自定义一些源。如何直链的方式引用这些自定义的源呢?本人基于armbian和CasaOS来创作。使用标准的Web服务器(如Nginx或Apache...

PHP开发者必备的Linux权限核心指南

本文旨在帮助PHP开发者彻底理解并解决在Linux服务器上部署应用时遇到的权限问题(如Permissiondenied)。核心在于理解“哪个用户(进程)在访问哪个文件(目录)”。一、核心...

【Linux高手必修课】吃透sed命令!文本手术刀让你秒变运维大神!

为什么说sed是Linux运维的"核武器"?想象你有10万个配置文件需要批量修改?传统方式要写10万行脚本?sed一个命令就能搞定!这正是运维工程师的"暴力美学"时...

「实战」docker-compose 编排 多个docker 组成一个集群并做负载

本文目标docker-compose,对springboot应用进行一个集群(2个docker,多个类似,只要在docker-compose.yml再加boot应用的服务即可)发布的过程架构...

企业安全访问网关:ZeroNews反向代理

“我们需要让外包团队访问测试环境,但不想让他们看到我们的财务系统。”“审计要求我们必须记录所有第三方对内部系统的访问,现在的VPN日志一团糟。”“每次有新员工入职或合作伙伴接入,IT部门都要花半天时间...

反向代理以及其使用场景_反向代理实现过程

一、反向代理概念反向代理(ReverseProxy)是一种服务器配置,它将客户端的请求转发给内部的另一台或多台服务器处理,然后将响应返回给客户端。与正向代理(ForwardProxy)不同,正向代...

Nginx反向代理有多牛?一篇文章带你彻底搞懂!

你以为Nginx只是个简单的Web服务器?那可就大错特错了!这个看似普通的开源软件,实际上隐藏着惊人的能力。今天我们就来揭开它最强大的功能之一——反向代理的神秘面纱。反向代理到底是什么鬼?想象一下你...

Nginx反向代理最全详解(原理+应用+案例)

Nginx反向代理在大型网站有非常广泛的使用,下面我就重点来详解Nginx反向代理@mikechen文章来源:mikechen.cc正向代理要理解清楚反向代理,首先:你需要搞懂什么是正向代理。正向代理...

centos 生产环境安装 nginx,包含各种模块http3

企业级生产环境Nginx全模块构建的大部分功能,包括HTTP/2、HTTP/3、流媒体、SSL、缓存清理、负载均衡、DAV扩展、替换过滤、静态压缩等。下面我给出一个完整的生产环境安装流程(C...

Nginx的负载均衡方式有哪些?_nginx负载均衡机制

1.轮询(默认)2.加权轮询3.ip_hash4.least_conn5.fair(最小响应时间)--第三方6.url_hash--第三方...

Nginx百万并发优化:如何提升100倍性能!

关注△mikechen△,十余年BAT架构经验倾囊相授!大家好,我是mikechen。Nginx是大型架构的核心,下面我重点详解Nginx百万并发优化@mikechen文章来源:mikechen....

在 Red Hat Linux 上搭建高可用 Nginx + Keepalived 负载均衡集群

一、前言在现代生产环境中,负载均衡是确保系统高可用性和可扩展性的核心技术。Nginx作为轻量级高性能Web服务器,与Keepalived结合,可轻松实现高可用负载均衡集群(HA+LB...

云原生(十五) | Kubernetes 篇之深入了解 Pod

深入了解Pod一、什么是PodPod是一组(一个或多个)容器(docker容器)的集合(就像在豌豆荚中);这些容器共享存储、网络、以及怎样运行这些容器的声明。我们一般不直接创建Pod,而是...

云原生(十七) | Kubernetes 篇之深入了解 Deployment

深入了解Deployment一、什么是Deployment一个Deployment为Pods和ReplicaSets提供声明式的更新能力。你负责描述Deployment中的目标状...

深入理解令牌桶算法:实现分布式系统高效限流的秘籍

在高并发系统中,“限流”是保障服务稳定的核心手段——当请求量超过系统承载能力时,合理的限流策略能避免服务过载崩溃。令牌桶算法(TokenBucket)作为最经典的限流算法之一,既能控制请求的平...

取消回复欢迎 发表评论: