上篇我们介绍了模块和如何使用模块,本篇将会介绍与模块共同会出现的问题,那就是在python规范写代码中会使用到__name__
这种特殊的变量。
大家可能已经见过,规范的python代码,入口代码应该类似
if __name__ == "__main__":
print("first line")
此处是否有if __name__ == "__main__":
,程序运行之后都会输出first line
,为什么要这样写呢?就需要从原理去了解。
1. __name__是什么
__name__
是一个特殊的“内置变量”,它的值会随着程序启动情况的不同而不同
python中使用这个变量,来区分模块和主文件。
- 所谓模块:被import的文件
- 所谓的主文件:被python直接执行的文件
为什么python会使用__name__
这个变量,这就需要从模块import的不方便来进行讨论
2. 模块import的不方便
如果(不规范地)写了一个模块,并且在这个模块中,包含了测试的代码,以上篇中使用到的mymodule.py
中增加两行测试程序,得到如下程序内容:
def add(x,y):
return x+y
def max(x,y):
if x > y:
return x
else:
return y
print(add(10,30))
print(add(30,40))
单独运行时,输出为40 70
这是正常的,但是如果我在另一个程序文件fistpy.py
中,importmymodule.py
,进行加法运算并显示,得到如下程序:
import mymodule
print("first.py",mymodule.add(30,30))
运行之后结果:
40
70
first.py 60
显然这与我们预期只关注add(30,30)
是存在差异的,程序将测试程序段也打印了出来。
这是因为import的本质就是将相应的python文件,复制粘贴到程序中运行,自然就会出现上述的结果。为了解决这个问题,就发明了__name__。
3. __name__的用处
__name__
的值会随着py文件的加载情况不同而变化 :
- 如果py文件作为主文件运行,则值为__main__
- 如果作为模块加载,则值为模块的名称(路径)
还是以上述的程序为例:
mymodule.py
代码改为如下:
def add(x,y):
return x+y
def max(x,y):
if x > y:
return x
else:
return y
print(__name__)
运行结果:代表其为主文件
__main__
fistpy.py
代码改为如下:
import mymodule
运行结果:代表其为模块
mymodule
有什么好处呢?
可以用这种方法来区分是在做测试当前模块有效,还是当做一个模块来使用。
因此可以将mymodule.py
改为如下:
def add(x,y):
return x+y
def max(x,y):
if x > y:
return x
else:
return y
if __name__ == "__main__":
print(add(20,40))
作为主程序运行输出为:60
作为模块在fistpy.py
中被使用时,if __name__ == "__main__":
不成立,就不会影响fistpy.py
本身程序的运行结果。
甚至,还有提倡在模块中类似C++/C的如下写法:
def add(x,y):
return x+y
def max(x,y):
if x > y:
return x
else:
return y
def main():
print(add(20,40))
if __name__ == "__main__":
main()
再经过几篇介绍完python中的几个标准库之后,将会介绍更为有趣的内容,无所不能的python。
4. 学习视频地址:main的作用