Python 基础知识 | 如何理解 Python 中的 if __name__ == `__main__` 这行代码的含义

Python中__name__的含义

__name__ 是 Python 的一个内置变量

核心 变量__name__的取值为'__main__'脚本文件名

当你直接执行一段脚本的时候,这段脚本的 __name__变量等于'__main__',当这段脚本被导入其他程序的时候,__name__变量等于脚本本身的名字(不包括.py)

具体地:

(1) 当前.py文件被直接运行时:if __name__ == '__main__'之下的代码块会被运行

(2)当前.py文件以模块形式被其他.py文件导入并运行那个.py 文件时:if __name__ == '__main__'之下的代码块不会被运行,因为__name__等于当前文件名

示例

有两个 py 文件,其中 action.py 文件调用了 human.py 文件

不管是哪种 import 导入方式,都会隐式地导入 human 所有内容,运行 action.py 时会先运行 human.py
而当前文件能用 human.py 中的哪些函数或类,则需要看你 import 的方法

action.py

from human import walk 


print("action.py: ", end="")
walk()

运行 action.py,输出结果如下

human
human.py: I'm saying now.
action.py: I'm walking now.

human.py
运行 action.py 时, human.py 中所有内容去隐式地替换 from human import walk
但此时__name__的值为human,不是'__main__',所以 if 下的代码块不会被执行。同时由于当前文件没有声明 say 函数,所以不能用 say 函数,只能用 walk 函数

def say():
    print("I'm saying now.")


def walk(): 
    print("I'm walking now.") 


if __name__ == '__main__': 
    print("human.py: ", end="") 
    walk() 

print(__name__) 
print("human.py: ", end="") 
say()

直接运行 human.py 输出结果如下

human.py: I'm walking now.
__main__
human.py: I'm saying now.

说明:
建议以后在写 Python 程序时所有执行语句放在 if __name__ == '__main__' 下面,防止它被作为脚本导入时,运行多余的代码

更多示例

Python 基础知识 | 如何理解 Python 中的 if __name__ == `__main__` 这行代码的含义_第1张图片
car.py

#!/usr/bin/env python
# -*- encoding: utf-8 -*-

"""一个可用于表示汽车的类,该模块被my_car.py调用"""
# 如果直接运行这个模块,输出__main__
# 如果这个模块被调用,则在调用程序中会输出car(该模块名)
print(__name__)

# 直接运行该模块会输出Hello,被别的文件调用时不会输出Hello
if __name__ == '__main__':
    print("Hello")  
    
print("World!")  # 被别的文件调用时会先输出World


class Car():
	--snip--

abs.py

如果别的程序想调用 abs.py的几个函数,那if __name__ == "__main__":下的代码就不会被运行,这从逻辑上讲也很正确

"""Absolute Value."""


def abs_val(num):
    """
    Find the absolute value of a number.

    >>> abs_val(-5.1)
    5.1
    >>> abs_val(-5) == abs_val(5)
    True
    >>> abs_val(0)
    0
    """
    return -num if num < 0 else num


def test_abs_val():
    """
    >>> test_abs_val()
    """
    assert 0 == abs_val(0)
    assert 34 == abs_val(34)
    assert 100000000000 == abs_val(-100000000000)


if __name__ == "__main__":
    print(abs_val(-34))  # --> 34

参考资料

[1] @ Python中的 name 变量,到底是个什么东西?
[2] 如何简单地理解Python中的 if name == ‘main

你可能感兴趣的:(Python)