何以准确领会

作者: 网络编程  发布:2019-12-07

前言:

情人眼中你是小明(__name__ == '小明'),
你协调眼中你是你和睦(__name__ == '__main__'),

您编制程序很好, 朋友调你去帮她写程序(import 小明, 此时你在朋友眼中: __name__ == '小明'),
但你深夜也会展开xx网址, 做一些团结的业务(间接运转小明.py, __name__ == '__main__')

 

 

程序入口

对此广大编制程序语言来讲,程序都必必要有叁个入口,举个例子C,C ,以致完周到向对象的编制程序语言 Java,C# 等。如若你接触过那个语言,对于程序入口那一个概念应该很好驾驭,C 和 C 都急需有三个 main 函数来作为程序的入口,约等于前后相继的运营会从 main 函数起先。同样,Java 和 C# 应当要有一个包含 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__ 的值。

__name__

__name__ 是放到变量,用于表示方今模块的名字,同时还是能展现三个包的协会。来举个例证,就算有如下一个包:

a
├── b
│   ├── c.py
│   └── __init__.py
└── __init__.py

  

目录中享有 py 文件的剧情都为:

print __name__

我们执行 python -c "import a.b.c",输出结果:

a
a.b
a.b.c

  

一句话来说,__name__ 能够清楚的反映二个模块在包中的档期的顺序。其实,所谓模块名正是import 时索要接纳的名字,举例:

import tornado
import tornado.web

此间的 tornado 和 tornado.web 就被称呼模块的模块名。

万生龙活虎多少个模块被一向运行,则其没有包构造,其 __name__ 值为 __main__。比如在上例中,大家直接运维c.py 文件(python a/b/c.py),输出结果如下:

__main__

所以,if __name__ == '__main__' 大家大约的知情正是: 要是模块是被一直运营的,则代码块被周转,借使模块是被导入的,则代码块不被运转

事实上,那么些主题素材还能衍生出其它的部分知识点,举个例子 __main__.py 文件与 Python 的 -m 参数。

__main__.py 文件与 python -m

Python 的 -m 参数用于将多个模块恐怕包作为二个剧本运营,而 __main__.py 文件则一定于是八个包的”入口程序“。

率先大家须求来探视 python xxx.py 与 python -m xxx.py金沙澳门官网 , 的区别。二种运转Python 程序的点子的分化点在于,大器晚成种是直接运行,生机勃勃种是作为模块来运营。

先来看八个差十分少的例证,假诺有二个 Python 文件 run.py,其内容如下:

#!/user/bin/python
#coding=utf-8

import sys

print __name__
print sys.path

 

我们用直接运转的办法运行(python run.py),输出结果(为了求证难题,输出结果只截取了关键片段,下同卡塔尔国:

__main__
['/yh1', '/usr/lib/python27.zip', '/usr/lib64/python2.7', '/usr/lib64/python2.7/plat-linux2', '/usr/lib64/python2.7/lib-tk', '/usr/lib64/python2.7/lib-old',
 '/usr/lib64/python2.7/lib-dynload', '/usr/lib64/python2.7/site-packages', '/usr/local/lib64/python2.7/site-packages', '/usr/local/lib/python2.7/site-packages', '/usr/lib/python2.7/site-packages']

  

下一场以模块的艺术运维(python -m run.py):

run
['', '/usr/lib/python27.zip', '/usr/lib64/python2.7', '/usr/lib64/python2.7/plat-linux2', '/usr/lib64/python2.7/lib-tk', '/usr/lib64/python2.7/lib-old', '/usr/lib64/python2.7/lib-dynload', '/usr/lib64/python2.7/site-packages', '/usr/local/lib64/python2.7/site-packages', '/usr/local/lib/python2.7/site-packages', '/usr/lib/python2.7/site-packages']
/usr/bin/python: No module named run.py

  

下一场大家来总计一下:

  • 1、 累积 -m 参数时会把当前专门的学问目录增添到 sys.path 中,而不加时则会把脚本所在目录增加到 sys.path 中
  • 2、 累积 -m 参数时 Python 会先将模块只怕包导入,然后再试行
  • 3、 __main__.py 文件是三个包照旧目录的输入程序。无论是是用 python package 还是用 python -m package 运行时,__main__.py 文件一而再一而再被实行。

本文由金沙澳门官网发布于网络编程,转载请注明出处:何以准确领会

关键词: 金沙澳门官网

上一篇:金沙澳门官网如何使用
下一篇:没有了