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

在这里插入图片描述

文章目录

  • 一、初识 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 3print("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.mzph.cn/web/15664.shtml

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

相关文章

嵌入式全栈开发学习笔记---C语言笔试复习大全22

目录 结构体 结构体的声明 定义结构体变量 访问结构体成员进行初始化 通过结构体变量名访问结构体成员 结构体指针 结构体指针的定义 通过结构体指针访问结构体成员 结构体数组 结构体数组的定义 遍历结构体数组 结构体的长度(笔试重点) 上一…

哈希双指针

文章目录 一、哈希1.1两数之和1.2字母异位词分组1.3最长子序列 二、双指针2.1[移动零](https://leetcode.cn/problems/move-zeroes/description/?envTypestudy-plan-v2&envIdtop-100-liked)2.2[盛最多水的容器](https://leetcode.cn/problems/container-with-most-water/d…

蓝桥楼赛第30期-Python-第三天赛题 统计学习数据题解

楼赛 第30期 Python 模块大比拼 统计学习数据 介绍 JSON(JavaScript Object Notation, /ˈdʒeɪsən/)是一种轻量级的数据交换格式,最初是作为 JavaScript 的子集被发明的,但目前已独立于编程语言之外,成为了通用的…

使用pyqt绘制一个爱心!

使用pyqt绘制一个爱心! 介绍效果代码 介绍 使用pyqt绘制一个爱心! 效果 代码 import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget from PyQt5.QtGui import QPainter, QPen, QBrush, QColor from PyQt5.QtCore import Qt, Q…

[保姆式教程]使用目标检测模型YOLO V8 OBB进行旋转目标的检测:训练自己的数据集(基于卫星和无人机的农业大棚数据集)

最近需要做基于卫星和无人机的农业大棚的旋转目标检测,基于YOLO V8 OBB的原因是因为尝试的第二个模型就是YOLO V8,后面会基于YOLO V9模型做农业大棚的旋转目标检测。YOLO V9目前还不能进行旋转目标的检测,需要修改代码 PS:欢迎大家分享农业大…

【研发日记】Matlab/Simulink技能解锁(九)——基于嵌入式处理器仿真

文章目录 前言 基于嵌入式处理器仿真 使用方式 第一步,硬件连接 第二步,配置硬件资源 第三步,配置XCP协议 第四步,加载Contrl Model 第五步,运行仿真 第六步,仿真报告 分析和应用 总结 参考资料 前言…

无线技术整合到主动噪声控制(ANC)增强噪声降低性能

主动噪声控制(ANC)已成为一种广泛使用的降噪技术。基本原理是通过产生与外界噪音相等的反向声波,将噪音中和,从而达到降噪的效果。ANC系统通常包括以下几个部分:参考麦克风、处理芯片、扬声器和误差麦克风。参考麦克风…

家政保洁服务小程序怎么做?家政公司快速搭建专属小程序

在数字化时代背景下,家政保洁服务行业也迎来了线上转型的新机遇。家政保洁服务小程序,作为一种新型的线上服务平台,不仅能够提升家政公司的服务效率,还能为顾客提供更加便捷的预约上门服务体验。那么家政保洁服务小程序怎么做呢&a…

从零开始搭建一个SpringBoot项目

目录 Spring BootSpring Boot 项目开发环境1、快速创建SpringBoot项目2、pom.xml 添加 Meavn 依赖3、配置application.yml4、验证数据库是否连接成功5、配置 Druid 数据源 Spring Boot 整合 MyBatis1、准备依赖2、application-dev.yml 配置3、启动类添加Mapper接口扫描器4、设置…

BWVS 靶场测试

一、PHP弱类型 is_numeric() 输入:127.0.0.1/BWVS/bug/php/code.php # 1、源代码分析 如果num不是数字,那么就输出num,同时如果num1,就输出flag。即num要是字符串又要是数字 # 2、函数分析: is_numeric()函数&…

《最新出炉》系列入门篇-Python+Playwright自动化测试-40-录制生成脚本

宏哥微信粉丝群:https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介 各种自动化框架都会有脚本录制功能, playwright这么牛叉当然也不例外。很早之前的selenium、Jmeter工具,发展到每种浏览器都有对应的录制插件。今天我们…

牛客NC392 参加会议的最大数目【中等 贪心+小顶堆 Java/Go/PHP 力扣1353】

题目 题目链接: https://www.nowcoder.com/practice/4d3151698e33454f98bce1284e553651 https://leetcode.cn/problems/maximum-number-of-events-that-can-be-attended/description/ 思路 贪心优先级队列Java代码 import java.util.*;public class Solution {/**…

java面试高级篇(JVM、Mysql、Redis、Kafka)

文章目录 面试专题-java高级篇1. JVM有做过jvm的调优吗?常用的jvm参数调优有哪些?如果jvm持续一段时间频繁的发生Young GC (轻GC) 可能原因有哪些? 2. Mysql2.1. 基本功(见为知笔记)2.2. 什么是索引2.3. 索引的优劣势2.4. MySQL的索引结构2.4.1. B-Tree索引2.4.2. BTree索引…

外卖系统源码开发全攻略:外卖小程序与后台管理系统的设计与实现

今天,小编将详细介绍外卖系统源码的开发全攻略,从需求分析到设计与实现,为开发者提供全面指导。 一、需求分析 1.用户需求 用户是外卖系统的核心,需满足以下基本需求: -浏览菜单并下单 -实时追踪订单 -多种支付方…

每日一题——博弈论(枚举与暴力)

博弈论 题目描述 运行代码 #include<iostream> #include<vector> using namespace std; int main(){int n;cin >> n;vector<int> d(n,0);for(int i 0;i < n;i){cin >> d[i];}vector<int> in(1000,0);for(int k 1;k<3;k){for(int…

ESP32烧录AT固件并进行MQTT通讯

首先下载AT固件 发布的固件 - ESP32 - — ESP-AT 用户指南 latest 文档 下载烧录工具 下载指导 - ESP32 - — ESP-AT 用户指南 latest 文档 烧录后注意usb的串口是不能发AT指令的 需要用16和17脚 用AT指令确认OK后连WIFI ATCWMODE1 //设置客户端模式 ATCWLAP …

mysql误删后使用binlog恢复数据

1 预期效果 使用 binlog 恢复数据的预期效果是将误删的数据还原到误删之前的状态&#xff0c;以减少或消除数据丢失的影响。通过正确解析和执行 binlog 中的操作记录&#xff0c;可以重新执行误删操作之后的插入、更新或删除操作&#xff0c;从而恢复被误删的数据。 数据恢复&…

Go微服务: Grpc服务注册在Consul的示例(非Go-Micro)

概述 现在&#xff0c;我们使用consul客户端的api来把GRPC服务实现注册到consul上&#xff0c;非Go-Micro的形式其实&#xff0c;consul官方提供了对应的接口调用来实现&#xff0c;golang中的consul/api包对其进行了封装我们使用consul/api来进行展示 目录结构 gitee.com/g…

springboot+mysql在线考试系统-计算机毕业设计源码82584

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对在线考试等问题&#xff0c;对如何通过计算…

Websocket助手

功能介绍 WS助手是WebSocket调试的开发工具&#xff0c;该客户端工具可以帮助开发人员快速连接到测试/生产环境&#xff0c;它可以帮助您监视和分析 Websocket 消息&#xff0c;并在开发过程中解决问题&#xff1b;可以模拟客户端实现与服务器的数据交互&#xff0c;并完成批量…