关于python中的 if __name__ == 'main'
name 是内置变量,它表示的是当前所在模块的名字,同时还能反应一个包的结构。
a
├── b
│ ├── c.py
│ └── __init__.py
└── __init__.py
目录中所有的py文件的内容都为:
python(__name__)
模块名其实就是import时,要用到的名字。
如果一个模块直接被运行,则其没有包结构。其__name__值就为__main__。
python属于脚本语言,不像编译型语言那样先将程序编译成二进制再运行,而是动态的逐行解释运行。也就是从脚本第一行开始运行,没有统一的入口。
一个 Python
源码文件除了可以被直接运行外,还可以作为模块(也就是库)被导入。不管是导入还是直接运行,最顶层的代码都会被运行(Python
用缩进来区分代码层次)。而实际上在导入的时候,有一部分代码我们是不希望被运行的。
举一个例子来说明一下,假设我们有一个 const.py 文件,内容如下:
PI = 3.14 def main(): print "PI:", PI main()
我们在这个文件里边定义了一些常量,然后又写了一个 main 函数来输出定义的常量,最后运行 main 函数就相当于对定义做一遍人工检查,看看值设置的都对不对。然后我们直接执行该文件(python const.py),输出:
PI: 3.14
现在,我们有一个 area.py 文件,用于计算圆的面积,该文件里边需要用到 const.py 文件中的 PI 变量,那么我们从 const.py 中把 PI 变量导入到 area.py 中:
from const import PI def calc_round_area(radius): return PI * (radius ** 2) def main(): print "round area: ", calc_round_area(2) main() 运行 area.py,输出结果: PI: 3.14 round area: 12.56
可以看到,const 中的 main 函数也被运行了,实际上我们是不希望它被运行,提供 main
也只是为了对常量定义进行下测试。这时,if __name__ == '__main__' 就派上了用场。把 const.py 改一下:
PI = 3.14 def main(): print "PI:", PI if __name__ == "__main__": main() 然后再运行 area.py,输出如下: round area: 12.56 再运行下 const.py,输出如下: PI: 3.14
这才是我们想要的效果。
if __name__ == '__main__' 就相当于是
Python 模拟的程序入口。Python
本身并没有规定这么写,这只是一种编码习惯。由于模块之间相互引用,不同模块可能都有这样的定义,而入口程序只能有一个。到底哪个入口程序被选中,这取决于 __name__ 的值。
参考链接:
http://blog.konghy.cn/2017/04/24/python-entry-program/
最新文章
- ReflectUitls类的编写和对反射机制的解析
- 构建第一个maven工程
- [转载]WiFi有死角? 巧用旧无线路由器扩展覆盖
- JDBC Thin Driver 的formats三种格式
- 纯真IP数据库导入mysql
- LeetCode: Reverse Words in a String:Evaluate Reverse Polish Notation
- hdu2208之搜索
- HTML5管理与实际历史的分析(history物)
- 3505: [Cqoi2014]数三角形
- 理解Twisted与非阻塞编程
- 数据挖掘学习笔记--AdaBoost算法(一)
- springMVC源码分析--@SessionAttribute用法及原理解析SessionAttributesHandler和SessionAttributeStore
- SQLAchemy模块
- TCP-IP详解笔记3
- Sublime text 3搭建Python开发环境及常用插件安装
- [js]this关键字代表当前执行的主体
- ros navigation stack 各个包的作用
- Git 命令收集
- 20165326 java第三周学习笔记
- 逻辑卷(lv)管理(LVM)