Python脚本必加代码:99%的程序员都忽视了这个细节!

news2024/9/23 9:26:56

在这里插入图片描述

文章目录

  • 一、初识 if __name__ == '__main__'
  • 二、__name__ 和 __main__ 是什么?
  • 三、实战讲解
  • 四、实际应用场景
    • 测试代码
    • 提高代码可重用性
    • 避免不必要的执行
  • 五、深入理解和更多用法
    • 使用 argparse 解析命令行参数
    • 使用 unittest 进行单元测试
    • 使用 multiprocessing 创建子进程
  • 六、结语

今天,我要和大家聊聊一个在Python编程中看似不起眼,但其实非常关键的小技巧——if __name__ == '__main__'

一、初识 if name == ‘main

让我们先来看看这个神奇的代码行:

if __name__ == '__main__':
    # 这里是程序的主入口
    main()

这行代码,虽然简单,却蕴含着Python编程的精髓。它的作用是确保某些代码块只在模块作为主程序运行时执行,而不是在被其他模块导入时执行。

二、namemain 是什么?

  • __name__ 变量

    每个Python模块都有一个内置属性__name__,它的值就是模块的名字。如果模块是被导入的,那么__name__通常是模块的文件名,不包括路径和文件扩展名。

  • __main__

    当一个模块被直接运行时,Python会将特殊变量__name__赋值为'__main__'。这意味着,如果你运行一个脚本文件,__name__将被设置为'__main__'。而如果该模块是被导入的,那么__name__将被设置为模块的名字。

三、实战讲解

在这里插入图片描述

示例 1:没有 if __name__ == '__main__'

假设我们有以下代码:

# example.py
print("This will always be executed")
def main():
    print("This will also be executed")
main()

当你运行example.py

$ python example.py
This will always be executed
This will also be executed

现在,如果我们创建另一个脚本来导入example.py

# test_import.py
import example

运行test_import.py

$ python test_import.py
This will always be executed
This will also be executed

可以看到,不论是直接运行example.py,还是通过test_import.py导入,example.py里的所有代码都会被执行。这显然不是我们想要的结果。

示例 2:使用 if __name__ == '__main__'

我们来改进一下example.py

# example.py
print("This will always be executed")
def main():
    print("This will be executed only if run directly")
if __name__ == '__main__':
    main()

再次运行example.py

$ python example.py
This will always be executed
This will be executed only if run directly

然后运行test_import.py

$ python test_import.py
This will always be executed

我们发现,当example.py被导入时,main()函数不会被执行。这样就达到了区分直接运行和导入执行的目的。

四、实际应用场景

在这里插入图片描述

测试代码

在开发过程中,我们经常需要测试代码段。通过if __name__ == '__main__',我们可以方便地在模块底部添加测试代码,而不用担心它们在模块被导入时执行:

# math_functions.py
def add(a, b):
    return a + b
def subtract(a, b):
    return a - b
if __name__ == '__main__':
    print("Testing add function:")
    print(add(1, 2))  # Should output 3
    print("Testing subtract function:")
    print(subtract(5, 3))  # Should output 2

提高代码可重用性

很多时候,我们编写的脚本不仅仅是一次性运行的工具,而是需要被其他模块调用的函数库。if __name__ == '__main__'可以保证模块在导入时不会执行测试代码或其他非必要代码,提高代码的可重用性。

避免不必要的执行

当我们有一段需要耗时或影响全局状态的代码时,避免在导入时执行就显得尤为重要:

# data_analysis.py
import pandas as pd
def load_data(filepath):
    data = pd.read_csv(filepath)
    return data
if __name__ == '__main__':
    filepath = 'data.csv'
    data = load_data(filepath)
    print(data.head())

在导入data_analysis.py时,不会自动加载数据文件,只有调用模块的相应方法才会加载数据,避免了不必要的资源占用。

五、深入理解和更多用法

使用 argparse 解析命令行参数

在写脚本工具时,常常需要解析命令行参数。我们可以结合if __name__ == '__main__'来实现这一功能:

# script.py
import argparse
def main():
    parser = argparse.ArgumentParser(description="A sample command-line tool")
    parser.add_argument('name', type=str, help='Your name')
    args = parser.parse_args()
    print(f'Hello, {args.name}!')
if __name__ == '__main__':
    main()

通过命令行运行脚本:

$ python script.py Alice
Hello, Alice!

使用 unittest 进行单元测试

在模块中添加单元测试,用if __name__ == '__main__'来运行测试:

# test_math_functions.py
import unittest
from math_functions import add, subtract
class TestMathFunctions(unittest.TestCase):
    def test_add(self):
        self.assertEqual(add(1, 2), 3)
    def test_subtract(self):
        self.assertEqual(subtract(5, 3), 2)
if __name__ == '__main__':
    unittest.main()

运行测试:

$ python test_math_functions.py

使用 multiprocessing 创建子进程

当我们需要并行处理时,使用 multiprocessing 模块时也需要注意if __name__ == '__main__'的使用:

# parallel_script.py
import multiprocessing
def worker(num):
    print(f'Worker: {num}')
if __name__ == '__main__':
    jobs = []
    for i in range(5):
        p = multiprocessing.Process(target=worker, args=(i,))
        jobs.append(p)
        p.start()

如果不加if __name__ == '__main__',在Windows系统上运行会导致无限递归创建子进程,最终导致崩溃。

六、结语

if __name__ == '__main__'是Python中一个简单却非常重要的习惯用法,它不仅可以让我们的代码更加清晰和模块化,还能避免许多潜在的问题和错误。

通过本文的多个示例,相信大家对if __name__ == '__main__'的理解更加深入,并能在实际开发中灵活运用。

原文:https://mp.weixin.qq.com/s/-ckOrOBkY8f7V8ltkOyxLQ

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1696082.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

任推邦:实力强劲的APP推广拉新平台,号称不扣量

任推邦简介 任推邦是国内数一数二的项目分发平台,也是一个不扣量的项目APP推广拉新平台,隶属于聚名科技集团股份有限公司。聚名科技成立时间在2012年,是安徽省老牌互联网企业,历经11年的飞速发展,聚名科技成功布局打造…

Adobe Bridge BR v14.0.3 安装教程 (多媒体文件组织管理工具)

Adobe系列软件安装目录 一、Adobe Photoshop PS 25.6.0 安装教程 (最流行的图像设计软件) 二、Adobe Media Encoder ME v24.3.0 安装教程 (视频和音频编码渲染工具) 三、Adobe Premiere Pro v24.3.0 安装教程 (领先的视频编辑软件) 四、Adobe After Effects AE v24.3.0 安装…

探秘NumPy的奥秘:元素级操作与广播机制

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、NumPy基础与元素级操作 元素级操作的引入 元素级操作详解 广播机制初探 二、NumPy矩…

PostgreSQL基础(三):PostgreSQL的基础操作

文章目录 PostgreSQL的基础操作 一、用户操作 二、权限操作 三、操作任务

全免费的数据恢复工具哪个好?分享2024年性价比超高的12款数据恢复软件!

当您丢失重要文件时,您应该可不想遇到措手不及的情况吧?相反,您需要在系统中使用一些可靠的数据恢复软件,但是全免费的数据恢复工具哪个好呢?别担心,本文将帮助您选择最适合您的解决方案。 如何挑选一款合适…

Linux 基本使用和 web 程序部署云端

目录 1.Linux发行版 2.Linux常用命令 ls pwd cd touch mkdir cat rm cp mv man vim grep ps netstat 绝对路径 vs 相对路径 使用 tab 键补全 使用 ctrl c 重新输入 粘贴与复制快捷键 3.Linux环境搭建 环境搭建方式 使用云服务器 4.搭建Java部署环境 …

CnosDB:深入理解时序数据质量函数

在CnosDB中,我们设计并实现了计算数据质量的多个指标,这些指标可以从多个维度评估时序数据的质量,对于时间戳列,我们考虑数据的缺失点、冗余点和延迟点。对于值列,我们考虑数据的异常值、范围、变化、速度和加速度。 C…

AI应用案例:影像报告智能辅助编辑系统

今天给大家介绍一个医疗行业的案例“影像报告智能辅助编辑系统”!该案例已经在某三甲医院落地,模型准确度超过80%。 该项目上线后,保守估计,能为每位医生的每一张报告至少省下1分钟时间和2分钟的精力,20位初级医生&…

大作业爬取手机数据,实现手机推荐系统以及朋友圈手机论坛

1、功能简介 (1)用户注册与用户登录 (2)手机搜索、手机比拼、手机个性化推荐 (3)点击搜索的手机图片会就用户行为,轮播展示用户行为,推荐点击次数靠前的手机 (4&#xf…

Day01-Web开发、介绍、HTML

一、什么是 Web ? Web:全球广域网&#xff0c;也称为万维网(www World Wide Web)&#xff0c;能够通过浏览器访问的网站。 <!-- 文档类型为HTML --> <!DOCTYPE html> <html lang"en"> <head><!-- 字符集 --><meta charset"U…

【Python001】python批量下载、插入与读取Oracle中图片数据(已更新)

1.熟悉、梳理、总结数据分析实战中的python、oracle研发知识体系 2.欢迎点赞、关注、批评、指正,互三走起来,小手动起来! 文章目录 1.背景说明2.环境搭建2.1 参考链接2.2 `oracle`查询测试代码3.数据请求与插入3.1 `Oracle`建表语句3.2 `Python`代码实现3.3 效果示例4.问题链…

2024最新 Jenkins + Docker实战教程(二) - Jenkins相关配置

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

深入了解Nodejs模块机制

深入了解Nodejs模块机制 我们都知道Nodejs遵循的是CommonJS规范&#xff0c;当我们require(moduleA)时&#xff0c;模块是怎么通过名字或者路径获取到模块的呢&#xff1f;首先要聊一下模块引用、模块定义、模块标识三个概念。 1 CommonJS规范 1.1 模块引用 模块上下文提供…

操作符详解(上)(新手向)

操作符详解&#xff08;上&#xff09; 一&#xff0c;算术操作符&#xff08;双目操作符&#xff09;1:‘’,‘-’,‘*’2&#xff1a;‘/’&#xff0c;‘%’ 一&#xff0c;单目操作符1:‘’,‘-’2&#xff1a;‘!’3&#xff1a;‘&’4&#xff1a;‘*’5&#xff1a;…

c++(一)

c&#xff08;一&#xff09; C与C有什么区别命名空间使用 输入输出流引用指针和引用的区别定义拓展 函数重载例子测试函数重载原理 参数默认值什么是参数默认值注意 在c中如何引入c的库动态内存分配new、delete与malloc、free的区别&#xff1f; C与C有什么区别 <1>都是…

.NET 一款内部最新的免杀WebShell

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

释放Mac潜能,选择Magic Disk Cleaner for Mac

想要让Mac运行更加流畅、性能更加出色吗&#xff1f;那就选择Magic Disk Cleaner for Mac吧&#xff01; Magic Disk Cleaner for Mac v2.7.7激活版下载 这款软件是Mac用户的得力助手&#xff0c;它拥有强大的扫描和清理功能&#xff0c;能够迅速找出并删除硬盘上的无用文件和垃…

亲测使用frp获得访问者真实ip

怎么访问都只有127.0.0.1这个内网ip,获取不到访问者的真实ip 1.打开frp的配置文件(一般是frpc.toml&#xff0c;无需设置frps.toml) 在每一个tcp协议中添加 transport.proxyProtocolVersion "v2" 实例&#xff1a; # frpc.toml [[proxies]] name "web" …

Docker+nginx部署SpringBoot+vue前后端分离项目(保姆及入门指南)

前后分离项目部署 项目回顾工具上线准备1、win1.1、前端1.2、后端 2、linux环境2.1、安装docker2.2、安装docker compose2.3、编写Dockerfile文件2.4、编写docker-compose.yml文件2.5、修改application-pro.yml2.6、准备好nginx的挂载目录和配置2.7、部署后端服务 项目回顾 书…

Studio 3T 2024.3 (macOS, Linux, Windows) - MongoDB 的专业 GUI、IDE 和 客户端,支持自然语言查询

Studio 3T 2024.3 (macOS, Linux, Windows) - MongoDB 的专业 GUI、IDE 和 客户端&#xff0c;支持自然语言查询 The professional GUI, IDE and client for MongoDB 请访问原文链接&#xff1a;https://sysin.org/blog/studio-3t/&#xff0c;查看最新版。原创作品&#xff…