MEMOO
MEMOO
Published on 2025-04-20 / 1 Visits
0
0

Python __name__

摘要:在本教程中,你将了解 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__ 变量。


Comment