今天在参考别人代码学习tensorflow时(代码如下),总觉得代码中的main函数内FLAGS变量没有定义,当时觉得好神奇哦(因为我把if name == ‘main’:及下面这一段当做的一个函数,类似于java中的psvm了),然后翻看了半天if name==‘main’ 的解释,然后恍然大悟,python是按行解释的呀,if name == 'main’只是一个判断语句,里面的都是全局变量啊。
def main(_):
print('FLAGS:',FLAGS)
if not tf.gfile.Exists(FLAGS.data_dir):
tf.gfile.MakeDirs(FLAGS.data_dir)
if __name__ == '__main__':
FLAGS, unparsed = parser.parse_known_args()
tf.app.run()
虽然是个乌龙,但是正好学习了一下__name__
。
__name__
是python的一个内置属性,用来表示当前模块的名字,那么这个属性值是什么样的呢?假设建立一个test1.py文件,文件内容如下:
def test1():
print(__name__)
test1()
运行文件,将会输出:
__main__
此时__name__
的值就是__main__
。
若此时在创建一个test2.py文件,并且在test2中调用test1:
from test1 import test1
test1()
print(__name__)
此时的输出为:
test1
test1
__main__
即无论是test1.py文件内的调用的test1()还是test2.py文件中调用的test1(),此时__name__
值都为test1,正式test1()还是所在的模块名,而test2.py内的运行的__name__
仍然是__main__
,这其实是一个指代问题,其模块自我调用运行时,此时我的名字__name__
就可以用“我”(__name__
)来指代,而运行其他模块时,则需明确模块的名字。
朋友眼中你是小明(
__name__ == '小明'
),
你自己眼中你是你自己(__name__ == '__main__'
),你编程很好, 朋友调你去帮他写程序(import 小明, 这时你在朋友眼中:
__name__ == '小明'
),
但你晚上也会打开xx网站, 做一些自己的事情(直接运行小明.py,__name__ == '__main__'
)
上面一段的引用个人觉得解释的非常清楚。
所以, if __name_ _=='_ _main__'
是python对自己模块进行验证的时候进行的一个假性程序入口。