Python小白常见的一行代码,90%的人都没搞明白它的真正作用

374 阅读4分钟

大家好,我是花姐,一个写Python写到半夜饿得啃馒头的技术博主。今天咱不聊高深的AI,也不整复杂的框架,咱就聊聊一个你八成见过,但可能还真没太懂的Python语法:if __name__ == '__main__'

image.png

是不是经常在别人代码里看见这句,像👇这样:

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.pyprint就不会被执行啦!


再说一个实际开发中会用到的场景

比如你写了一个模块,里面有个爬虫脚本。你平时要测试它能不能运行,但又想把这个模块给别人用,别人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的部分)。


一些容易忽略的小细节

  1. if __name__ == '__main__' 这个判断并不影响你模块里定义的函数和类,它只影响它下面缩进的代码
  2. __name__ 是字符串,不是变量名,也不是函数。不要手抖写成 __name__ == __main__(我刚学的时候干过一次,调试了半小时)。
  3. 如果你用Jupyter Notebook,那这个判断没啥用,因为notebook没有“运行这个文件”的概念。
  4. 大项目里,很多时候都会在main.py里看到这个判断,它其实是整个项目的入口点,像一扇门,你从这里进去,整个程序就开始跑了

总结一句话:

这个判断就像是在门口挂个牌子:

“只有我自己启动我自己,我才会做下面这些事;别人叫我来帮忙,我就安静点儿。”


嘿,说点题外话

刚学Python的时候,看见这些__xx__的玩意儿,总觉得它们是黑魔法。后来才明白,其实Python挺通透的,一切都在明面上写着,只是我们一开始没看懂而已。

如果你也是刚开始学Python,别怕,看不懂说明你正在进步!
花姐刚开始学的时候,连冒号和缩进都搞不明白,但现在照样可以写出几十万阅读的技术文章。

所以别急,慢慢来,Python的门槛低,但深度高,你只需要坚持住,后面会越学越顺。