7.3 模块的name

每个模块都有一个名称,而模块中的语句可以找到它们所处的模块的名称。这对于确定模块是独立运行的还是被导入进来运行的这一特定目的来说大为有用。

当模块第一次被导入时,它所包含的代码将被执行。我们可以通过这一特性来使模块以不同的方式运行,这取决于它是为自己所用还是从其它从的模块中导入而来。这可以通过使用模块的__name__ 属性来实现。

例如:7.3-模块name/noname.py

# 没有设置模块name的模块
def nonameAdd(a, b):
    return a + b

# 查看__name__的值
print(__name__)
# 函数外的语句
num = nonameAdd(10, 20)
print('In module noname: num = {}'.format(num))

当直接运行noname.py文件时,结果为:

__main__
In module noname: num = 30

文件本身直接运行时,__name__的值为:__main__。

当使用另外的文件引入noname这个模块时:7.3-模块name/testname.py

# 测试模块name
# 模块没有使用name,导入的时候,模块里函数外边的代码将被执行
import noname

结果为:

noname
In module noname: num = 30

注意这时__name__的值为:noname,被引入的时候,__name__的值为模块名,而不是__main__。

更为重要的是:当引入这个模块时,模块里面函数外面的代码都会执行,这样很容易会产生很多预期之外的输出。

所以我们可以使用__name__的值来判断,当直接执行时,执行里面的代码。否则不执行。例如:7.3-模块name/withname.py

# 有设置模块name的模块
def withnameAdd(a, b):
    return a + b

# 函数外的语句,利用__name__判断模块是否被直接运行
if __name__ == '__main__':
    num = withnameAdd(10, 20)
    print('In module withname: num = {}'.format(num))

这时,在其它文件中引入这个模块时,将不会有额外的输出:

# 模块使用name判断,不会有额外输出
import withname