为什么要写 __name__ == “__main__”

简介: if __name__ == "__main__" 模式在Python中用于区分模块是被直接运行还是被导入。通过这种模式,可以编写既可以作为独立脚本运行又可以作为模块导入的代码,从而提高代码的重用性和可维护性。

在Python中,__name__ == "__main__" 用于确定一个模块是作为脚本直接运行还是被另一个模块导入。

模块和脚本

  • 模块:模块是一个包含Python代码的文件,可以通过import语句在其他Python文件中导入。
  • 脚本:脚本是一个可以直接运行的Python文件。

__name__ 变量

  • __name__ 是一个特殊的内置变量。当Python解释器运行一个模块时,它会为该模块定义一些特殊变量,其中之一就是 __name__。
  • 如果模块是被直接运行的,那么 __name__ 的值将是 "__main__"。
  • 如果模块是被导入的,那么 __name__ 的值将是模块的名字(即模块文件名,不包括路径和文件扩展名)。

示例

考虑以下代码:

# example.py
def main():
    print("This is the main function.")
if __name__ == "__main__":
    main()

直接运行模块

如果你直接运行 example.py:

python example.py

输出将是:

This is the main function.

这是因为当 example.py 被直接运行时,__name__ 的值是 "__main__",因此 if 条件为真,main() 函数被调用。

导入模块

如果你在另一个文件中导入 example 模块:

# another_file.py
import example

没有输出。这是因为当 example 模块被导入时,__name__ 的值是 "example",而不是 "__main__",因此 if 条件为假,main() 函数不会被调用。

修改name

将__name__修改为文件的名称

# example.py
def main():
    print("This is the main function.")
if __name__ == "example":
    main()

这样在其他的文件中调用这个module时会输出内容。

本质和用途

  • 模块重用:通过使用 if __name__ == "__main__",你可以将模块中的代码组织成可重用的函数和类,同时保留一些只能在直接运行时执行的代码。这有助于代码的模块化和重用。
  • 测试代码:你可以在 if __name__ == "__main__" 块中包含测试代码。这些代码只有在直接运行模块时才会执行,而在导入模块时不会执行。

使用main的用途

假设有两个文件 module.py 和 main.py:

# module.py
def function():
    print("Function in module.")
if __name__ == "__main__":
    print("Module is being run directly.")
else:
    print("Module has been imported.")
# main.py
import module
module.function()

运行 module.py:

python module.py

输出:

Module is being run directly.

运行 main.py:

python main.py

输出:

Module has been imported.
Function in module.

使用example的用途

在Python中,__name__ 变量的常用值有 "__main__" 和模块的名称(例如 "example")。虽然 __name__ == 'example' 这种写法并不常见,但它确实可以用于一些特定场景。以下是一些可能的使用场景:

特定模块初始化

某个特定模块被导入时执行一些初始化代码。例如:

# module.py
def initialize():
    print("Initializing module...")
if __name__ == "module":
    initialize()

在这种情况下,如果模块 module 被导入,初始化代码将会被执行。

总结

if __name__ == "__main__" 模式在Python中用于区分模块是被直接运行还是被导入。通过这种模式,可以编写既可以作为独立脚本运行又可以作为模块导入的代码,从而提高代码的重用性和可维护性。

相关文章
|
传感器 数据采集 数据处理
基于STM32的温湿度监测系统设计与实现
基于STM32的温湿度监测系统设计与实现
1726 1
|
测试技术 iOS开发 数据格式
WDA原理分析
1、什么是WDA WebDriverAgent是Facebook 在17年的 SeleniumConf 大会上推出了一款新的iOS移动测试框架。 下面摘录一段官方对于WebDriverAgent的介绍字段:(官方文档:https://github.com/facebook/WebDriverAgent) WebDriverAgent 在 iOS 端实现了一个 WebDriver server ,借助这个 server 我们可以远程控制 iOS 设备。
12648 0
|
2月前
|
Ubuntu 安全 Linux
centos和ubuntu有什么区别
总的来说,CentOS 更适合用于服务器和企业级应用,因为它稳定、可靠、安全,并且提供长期支持。而 Ubuntu 则更适合用于桌面应用程序和开发环境,因为它更加注重用户体验和新技术支持。
|
7月前
|
Kubernetes Java 开发工具
CI/CD(五)Flink 应用部署
Flink 应用需要解决的是任务的灵活增加(通常以 maven module 的方式存在同一个git仓库中),不能依赖手工注册应用或.polaris-ci.yml自动注册
203 2
|
8月前
|
SQL 关系型数据库 MySQL
Python中使用MySQL模糊查询的方法
本文介绍了两种使用Python进行MySQL模糊查询的方法:一是使用`pymysql`库,二是使用`mysql-connector-python`库。通过这两种方法,可以连接MySQL数据库并执行模糊查询。具体步骤包括安装库、配置数据库连接参数、编写SQL查询语句以及处理查询结果。文中详细展示了代码示例,并提供了注意事项,如替换数据库连接信息、正确使用通配符和关闭数据库连接等。确保在实际应用中注意SQL注入风险,使用参数化查询以保障安全性。
|
存储 分布式计算 数据处理
解释弹性分布式数据集(RDD)的概念
【8月更文挑战第13天】
1057 4
|
IDE 开发工具 Python
【Python】已解决:IndentationError: unindent does not match any outer indentation level
【Python】已解决:IndentationError: unindent does not match any outer indentation level
1235 0
|
11月前
|
机器学习/深度学习 存储 算法
基于Actor-Critic(A2C)强化学习的四旋翼无人机飞行控制系统matlab仿真
基于Actor-Critic强化学习的四旋翼无人机飞行控制系统,通过构建策略网络和价值网络学习最优控制策略。MATLAB 2022a仿真结果显示,该方法在复杂环境中表现出色。核心代码包括加载训练好的模型、设置仿真参数、运行仿真并绘制结果图表。仿真操作步骤可参考配套视频。
372 0
|
C# 微服务 Windows
模块化革命:揭秘WPF与微服务架构的完美融合——从单一职责原则到事件聚合器模式,构建高度解耦与可扩展的应用程序
【8月更文挑战第31天】本文探讨了如何在Windows Presentation Foundation(WPF)应用中借鉴微服务架构思想,实现模块化设计。通过将WPF应用分解为独立的功能模块,并利用事件聚合器实现模块间解耦通信,可以有效提升开发效率和系统可维护性。文中还提供了具体示例代码,展示了如何使用事件聚合器进行模块间通信,以及如何利用依赖注入进一步提高模块解耦程度。此方法不仅有助于简化复杂度,还能使应用更加灵活易扩展。
308 0
探究Python中的函数与模块
在本篇文章中,我们深入探讨了Python中的函数与模块。从函数的定义、参数处理,到模块的导入、自定义模块和包的使用,您已经掌握了如何通过这些工具来编写结构化、模块化的代码。 在实际开发中,合理地使用函数和模块可以大大提高代码的可读性和可维护性,为您编写更复杂的程序奠定了基础。