摘要:在本教程中,你将了解 Python 中的 __name__
变量以及如何在模块中有效地使用它。
什么是 Python 的 __name__
?
如果你看过 Python 代码,很可能见过类似下面的 __name__
变量:
if __name__ == '__main__':
main()
你可能会好奇 __name__
变量是什么。
由于 __name__
变量两边都有双下划线,因此它被称为 dunder 名称(dunder 是 double underscores 的缩写)。
__name__
是 Python 中的一个特殊变量。它之所以特殊,是因为 Python 会根据其所在脚本的执行方式为其分配不同的值。
当你导入一个模块时,Python 会执行与该模块关联的文件。
通常,你希望编写一个既可以直接执行又可以作为模块导入的脚本,__name__
变量允许你实现这一点。
当你直接运行脚本时,Python 会将 __name__
变量设置为 '__main__'
。
然而,如果你将一个文件作为模块导入,Python 会将模块名设置为 __name__
变量的值。
Python __name__
变量示例
首先,创建一个名为 billing
的新模块,该模块包含两个函数:
calculate_tax()
print_billing_doc()
此外,添加一条语句,将 __name__
变量打印到屏幕上:
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}")
print(__name__)
第二,创建一个名为 app.py
的新文件并导入 billing
模块:
import billing
当你执行 app.py
时:
python app.py
…__name__
变量显示以下值:
billing
这意味着,当你将 billing
模块导入到 app.py
文件中时,Python 确实会执行 billing.py
文件。
在 app.py
中的 __name__
变量被设置为模块名,即 billing
。
如果你直接将 billing.py
作为脚本执行:
python billing.py
……你会看到以下输出:
__main__
在这种情况下billing.py
内部的 __name__
变量的值为 '__main__'
。
因此__name__
变量允许你检查文件是直接执行还是作为模块导入。
例如,如果你想在 billing.py
作为脚本直接执行时运行 print_billing_doc()
函数,你可以向 billing.py
模块中添加以下语句:
if __name__ == '__main__':
print_billing_doc()
第三,将 billing.py
作为脚本执行,你会看到以下输出:
Name Price Tax
Book 30 3.0
Pen 5 0.5
然而,当你执行 app.py
时,你不会看到 if
块被执行,因为 __name__
变量没有被设置为 '__main__'
,而是被设置为 'billing'
。
总结
当你直接运行脚本时,Python 会将
'__main__'
赋值给__name__
变量;而当你将脚本作为模块导入时,Python 会将模块名赋值给__name__
变量。