为了理解这个表达式,我们需要先了解两个概念:__name__
变量和 Python 脚本的两种使用方式——作为主程序运行和作为模块导入。
-
__name__
变量:- 当 Python 解释器运行一个脚本时,它会先设置一些特殊变量,
__name__
就是其中之一。 - 如果这个脚本是作为主程序直接运行的,其
__name__
被设置为字符串'__main__'
。 - 如果这个脚本是作为模块被其他脚本导入的,其
__name__
被设置为该脚本的模块名。
- 当 Python 解释器运行一个脚本时,它会先设置一些特殊变量,
-
主程序与模块导入:
- 作为主程序运行:当你直接运行脚本时(比如通过命令行
python script.py
),该脚本被视为主程序。 - 作为模块导入:当一个脚本被另一个脚本通过
import
语句导入时,被导入的脚本被视为模块。
- 作为主程序运行:当你直接运行脚本时(比如通过命令行
if __name__ == '__main__':
这个表达式允许我们确定某个脚本是被直接运行还是被导入为模块。这非常有用,因为有时我们希望只在脚本作为主程序运行时执行某些代码,而在作为模块导入时不执行。
例子:
假设现在有两个python脚本文件分别为billing.py
和app.py
,其代码分别如下
billing.py
的代码:
def calculate_tax(price, tax):
return price * tax
def print_billing_doc():
tax_rate = 0.1
products = [{'name': 'Book', 'price': 30},
{'name': 'Pen', 'price': 5}]
# print billing header
print(f'Name\tPrice\tTax')
# print the billing item
for product in products:
tax = calculate_tax(product['price'], tax_rate)
print(f"{product['name']}\t{product['price']}\t{tax}")
if __name__ == '__main__':
print_billing_doc()
和app.py
的代码
import billing
然后我们执行python billing.py
会得到输出如图,
执行python app.py
此时没有任何输出,因为虽然app.py
将 billing.py
全体objects导入了,但是由于此时 billing.py
的__name__
属性值为模块名billing
,所以执行app.py不会执行print_billing_doc()
函数
但是,如果我们把
billing.py
里的if __name__ == '__main__':
这行代码注释掉,则再执行app.py
此时会输出