Advertisement

Python专家编程系列: 11.为什么在python使用__name__ == __main__

阅读量:

0. 标题

Python专家编程系列: 11.为什么在python使用__name__ == ‘main

id: 104

复制代码
    作者: quantgalaxy@outlook.com   
    欢迎交流

1. 单个 python 文件中的 name 是什么?

我们先看一个简单的python程序脚本a.py:

复制代码
    # a.py
    
    print(__name__)    
    
    # python a.py
    # __main__

如果在命令行中运行 a.py,比如 python a.py 的方式,name 变量默认就打印的是 “main ”。

再看一个例子:

复制代码
    # b.py
    
    print(__name__)
    
    # python b.py
    # __main__
复制代码
    If we run a.py directly, the __name__ inside that file will automatically become '__main__'

2. 多个 python 文件引用中的 name 是什么?

我们来看下,如果有两个文件,a.pyb.py

复制代码
    # b.py
    def hello_b():
    print('hello_b __name__:', __name__)

a.py 来使用 b.py 的函数:

复制代码
    # a.py
    from b import hello_b
    
    hello_b()
    
    # python a.py
    # hello_b __name__: b

如果执行 a.py 脚本,会看到,输出的不再是"main ",而是"b"。
这是因为,b.py 不是直接运行的,这时候 b.py 中的 name 就是 b.py 脚本本身的名字了。这是因为 b.py 是被导入的,不是被直接执行的。

可以看下面的例子:

复制代码
    # b.py
    def hello_b():
    print('hello_b __name__:', __name__)
复制代码
    # c.py
    
    def hello_c():
    print('from c.py:', __name__)
复制代码
    # a.py
    
    from b import hello_b
    from c import hello_c
    
    hello_b()  # from b.py: b
    hello_c()  # from c.py: c

可以看到,被导入的脚本内部的 name 都是文件本身或者说模块本身的名字。

3. name 的使用

先看一下下面的例子:

复制代码
    # b.py
    
    def hello_b():
      print('from b.py:', __name__)
    
    print('hahaha')
复制代码
    # a.py
    
    from b import hello_b
    
    hello_b()

执行 python a.py,输出是:

复制代码
    hahaha
    from b.py: b

可以看到,“hahaha” 也被输出了,这是因为在import b的时候,所有b的脚本都会被执行。
如果想一些语句只在脚本被直接访问的时候执行,而不是被import的时候执行,这时候,就需要用到 name 来识别:

上面的 b.py 可以改为:

复制代码
    # b.py 改进版
    
    def hello_b():
      print('from b.py:', __name__)
    
    if __name__ == '__main__':
    # this only runs if we run b.py directly
    # eg. by using 'python b.py'
    print('hahaha')

这时候执行 python a.py,输出如下:

复制代码
    from b.py: b

这是因为我们利用了 if name == ‘main ’ 这个语句,来识别 b.py 脚本到底是被import的,还是被python执行器直接执行的。

这就是我们在一个程序的入口程序脚本中,经常会看到 if name == ‘main ’ 这个语句的原因。
非入口脚本,所有的语句,都应该封装在类或者函数中,这样才能保证语句都是被明确调用执行的,而不会被import的时候就被执行。

4. 作者信息

复制代码
    作者: quantgalaxy@outlook.com   
    欢迎交流

全部评论 (0)

还没有任何评论哟~