大家好,我是花姐,一个写Python写到半夜饿得啃馒头的技术博主。今天咱不聊高深的AI,也不整复杂的框架,咱就聊聊一个你八成见过,但可能还真没太懂的Python语法:if __name__ == '__main__'。
是不是经常在别人代码里看见这句,像👇这样:
if __name__ == '__main__':
do_something()
一开始我也一头雾水,心想这都什么魔法代码,看着像咒语一样。直到有一天,我写了两个Python文件,互相调用,结果输出了一堆莫名其妙的东西,我才意识到——哦,这玩意儿,还真挺重要的!
一句话解释它是干啥的
它的作用就是:防止你写的代码在被“导入”到别的文件时乱跑。
听不懂?没关系,咱来一点点说清楚。
咱来点细节,不讲你听不懂
Python文件,每个都是一个模块。你运行它的时候,Python会自动给这个文件的__name__变量赋值为'__main__'。但如果这个文件是被别的文件导入的,那__name__就会是这个文件的模块名。
说白了,这句话其实就是在问:
“嘿,你是我自己运行的,还是别人导入我的?”
如果是你自己双击/命令行运行的,那就执行if下面的代码;
如果你是被当作模块import的,那就乖乖什么都别干。
一个真实的小例子,真事儿,别笑
有一次我写了一个utils.py,里面定义了好几个函数,比如:
# utils.py
def say_hello(name):
print(f'Hello, {name}')
print("我是utils.py,我已经被执行了")
然后我在另一个文件里导入它:
# main.py
import utils
utils.say_hello("花姐")
结果运行main.py的时候,控制台不但打印了“Hello, 花姐”,还多了句:“我是utils.py,我已经被执行了”。
我当时就一脸懵,什么情况?我又没让它print!
后来才发现:Python在import模块的时候,会把这个模块整个执行一遍。也就是说,只要在模块里写了print,它就会立刻执行。
解决办法就是在utils.py里加个判断:
# utils.py
def say_hello(name):
print(f'Hello, {name}')
if __name__ == '__main__':
print("我是utils.py,我已经被执行了")
这样你再运行main.py的时候,utils.py的print就不会被执行啦!
再说一个实际开发中会用到的场景
比如你写了一个模块,里面有个爬虫脚本。你平时要测试它能不能运行,但又想把这个模块给别人用,别人import的时候不要自动爬数据。
这个时候你就可以这样写:
# spider.py
def crawl():
print("正在抓取数据...")
if __name__ == '__main__':
# 你平时测试就直接跑这里
crawl()
别人用你模块的时候:
# main.py
import spider
# 这里只是调用你提供的函数,不会执行crawl
这样一来,你的模块就既能当脚本运行,也能当模块被调用,优雅地拿捏住双重身份,像不像是职场中左右逢源的高手?😎
附加知识:为什么叫 __name__ 和 __main__?
Python里有很多带双下划线的变量,像__init__、__str__这种,它们不是Python专门用来吓唬新手的(虽然一开始我确实被吓到了),而是所谓的“魔术方法(magic methods)”。
__name__ 是Python自动给每个模块设置的内置变量,
__main__ 是运行时自动赋的值。
你可以简单理解为:
print(__name__)
当你运行自己的脚本时,会输出:
__main__
但当这个文件被import时,它会输出的是文件名(不带.py的部分)。
一些容易忽略的小细节
if __name__ == '__main__'这个判断并不影响你模块里定义的函数和类,它只影响它下面缩进的代码。__name__是字符串,不是变量名,也不是函数。不要手抖写成__name__ == __main__(我刚学的时候干过一次,调试了半小时)。- 如果你用
Jupyter Notebook,那这个判断没啥用,因为notebook没有“运行这个文件”的概念。 - 大项目里,很多时候都会在
main.py里看到这个判断,它其实是整个项目的入口点,像一扇门,你从这里进去,整个程序就开始跑了。
总结一句话:
这个判断就像是在门口挂个牌子:
“只有我自己启动我自己,我才会做下面这些事;别人叫我来帮忙,我就安静点儿。”
嘿,说点题外话
刚学Python的时候,看见这些__xx__的玩意儿,总觉得它们是黑魔法。后来才明白,其实Python挺通透的,一切都在明面上写着,只是我们一开始没看懂而已。
如果你也是刚开始学Python,别怕,看不懂说明你正在进步!
花姐刚开始学的时候,连冒号和缩进都搞不明白,但现在照样可以写出几十万阅读的技术文章。
所以别急,慢慢来,Python的门槛低,但深度高,你只需要坚持住,后面会越学越顺。