美文网首页Python小哥哥每天学一点python
小蛇学python(21)Python中的if __name__

小蛇学python(21)Python中的if __name__

作者: 跌跌撞撞小红豆 | 来源:发表于2020-01-07 15:34 被阅读0次

    在具体说明if name == 'main'功能前,先从一个简单的实例直观上感受一下。

    # const.py
    PI = 3.14
     
    def train():
        print("PI:", PI)
     
    train()
    
    # area.py
     
    from const import PI
     
    def calc_round_area(radius):
        return PI * (radius ** 2)
     
    def calculate():
        print("round area: ", calc_round_area(2))
    
    calculate()
    

    现在运行area.py文件。运行结果后可以看见,const.py中的train()也被运行了,实际上我们是不希望它被运行,只是想把const.py中 PI 变量导入到 area.py。现在把 const.py 改一下:

    PI = 3.14
     
    def train():
        print("PI:", PI)
     
    if __name__ == "__main__":
        train()
    

    运行area.py文件发现没有执行const.py中train()。

    1. if name == 'main'功能

    从上述实例可以发现,运行const.py文件时if name=="main": 语句之前与之后代码都被执行,但作为area.py导入文件时就不会执行if name=="main": 语句之后代码。

    实际上if name=="main":就相当于是 Python 模拟的程序入口。由于模块之间相互引用,不同模块可能都有这样的定义,而入口程序只能有一个,选中哪个入口程序取决于 name 的值。

    可以做一下测试:

    # test.py
    print("hahaha")
    print(__name__)
     
    if __name__ == '__main__':
        print("I'm test.py")
    

    可以发现,此时变量name的值为"main",即打印“I'm test.py”。如果运行其他文件,通过运行的文件调用本文件,则不会打印该语句,因为程序入口不对,该语句不执行。

    举个栗子:

    # receiver.py
    print("receiver_haha")
    
    def test():
        print("test can be called!")
     
    def receiver_print():
        print("I'm receiver.py")
     
    if __name__ == '__main__':
        receiver_print()
    
    # caller.py
    import receiver
     
    print("caller_haha")
    
    def test():
        print("caller_test can be called!")
     
    def caller_print():
        print("I'm caller.py")
    
    if __name__ == '__main__':
        caller_print()
        test()
    

    运行caller.py。可以发现receiver.py中if name=="main"后语句没有执行,因为此时运行的是caller.py,而找不到进去receiver.py的入口!使用这种方法可以控制代码的执行!

    2. name

    2.1 name是内置变量,可用于表示当前模块的名字

    2.2 name是内置变量,可用于反映一个包的结构。

    相关文章

      网友评论

        本文标题:小蛇学python(21)Python中的if __name__

        本文链接:https://www.haomeiwen.com/subject/pvnractx.html