page contents

Python中pass语句的作用是什么?

在写 Python 的时候,我们经常会碰到一个神奇的关键字——pass。它看起来啥也不干,代码里放一个 pass,运行也没报错,好像就是个“摆设”。那这东西到底是干嘛的?是不是可以当它不存在?今天咱们就来掰扯掰扯这个“看似无用”的 pass,到底有啥猫腻。
attachments-2025-09-P6wiWr4368d34bc93658b.png在写 Python 的时候,我们经常会碰到一个神奇的关键字——pass。它看起来啥也不干,代码里放一个 pass,运行也没报错,好像就是个“摆设”。那这东西到底是干嘛的?是不是可以当它不存在?今天咱们就来掰扯掰扯这个“看似无用”的 pass,到底有啥猫腻。
先说个小故事。我第一次写 Python 项目的时候,有段代码是这样的:
def do_something():
    # TODO: 实现逻辑
然后我就跑程序,结果报错了。一看,提示是 IndentationError: expected an indented block。我当时心里一万头草泥马奔腾而过:Python 你这是跟我玩什么文字游戏啊?函数里我都还没写内容呢,你咋就急着发火?
后来同事告诉我,Python 是不允许一个函数、类、循环语句啥都不写的,它必须得有个“身体”,哪怕你现在什么都不想做,也得给它个形式上的交代,这时候你就可以用 pass。
于是我把代码改成这样:
def do_something():
    pass
完美运行。从那以后,我就知道,这 pass 吧,是 Python 的“占位符”,用来打太极的。不过,别看它看起来啥都不干,其实在实际开发中,它用处还真不少。下面我就结合我自己写代码踩的坑,说说我在哪些地方用过它,怎么用的,以及有没有更好的替代方案。
第一种典型用法就是写骨架代码。
你写个框架或者类结构,先把函数和类名搭出来,细节之后再填充,pass 就是你的临时搭脚手架的工具。比如我写个类:
class DataProcessor:
    def __init__(self):
        pass

    def load_data(self):
        pass

    def process_data(self):
        pass

    def save_result(self):
        pass
你说我一开始也不可能啥都一口气写完,毕竟有时候逻辑没理清呢,这时候用 pass 就不会报错,还能让我慢慢填空。
但问题来了,有时候你写完这堆 pass,结果忘记回头改,就容易上线一堆空逻辑,这可太坑了。我之前线上出过问题,一看日志,调用了个“处理数据”的函数,结果里面啥都没写,还是个 pass。我当时都想锤自己一顿。后来养成个习惯,先写 raise NotImplementedError(),这样至少跑起来直接炸,不会悄咪咪啥都不干。
第二个场景,是配合异常处理写的。这个场景我印象特别深。
有次我们项目里用了个第三方库,偶尔会抛一个特定的异常,但其实对业务流程没啥影响,于是我们决定静默处理掉。
try:
    do_some_risky_stuff()
except SomeSpecificException:
    pass
很多人看到这里就不爽了,说你这不就是“吞异常”吗?是的,确实是吞了。但关键是,有些场景你就得这么干,比如你轮询一个接口,偶尔 timeout,但下一轮就恢复了,这种非致命异常你不想让它打断整个流程,pass 就能给你一条“装死”的路。当然,这种写法也得谨慎用。后来我学聪明了,加个日志记录最起码得有,不然排查问题你都不知道是哪个点偷懒了。
except SomeSpecificException:
    logger.warning("遇到预期异常,暂时跳过")
    pass
第三个用法,是当你写类继承但暂时不想实现某些方法时用的。举个例子:
class BaseHandler:
    def handle(self):
        raise NotImplementedError()

class NullHandler(BaseHandler):
    def handle(self):
        pass  # 什么都不做,就是个空实现
这种场景在设计模式里还挺常见的,像什么“空对象模式”、“占位模式”,就是让系统在某些时候提供一个“啥也不干”的默认实现,免得到处判断 None。这时候 pass 就成了你实现“空行为”的利器。讲到这里你可能会问了,这玩意儿除了“啥也不干”,还能干点啥不?
说实话,还真就不能。pass 就是 Python 的“NOOP”指令,相当于 C 语言里的分号;但 Python 又不能直接写个空行代表语句块结束,所以 pass 就顶上了。
不过它的意义不在于它做了什么,而在于它“什么都没做但又不让你出错”。有点像一个“沉默的老大哥”,你知道他在那里站着,你放心,不会被系统追杀说你没写代码,也不会莫名其妙跑个啥副作用。
对了,还有一个冷门但我经常用的场景,就是写完循环结构但还没想好逻辑的时候。
for i in range(10):
    pass
或者:while True:
    pass
这个其实是个小陷阱。我们有一次写了个 while True: pass,结果部署后 CPU 打满了。为啥?因为这东西每一毫秒都在疯狂地执行空操作,压根没停下来。正确做法应该是:import time

while True:
    time.sleep(1)
这才是你想要的“什么都不做但别浪费 CPU”的行为。
最后我想说,pass 这东西,看似无用,实则很重要。它像是程序员思考时留的空格,是在你脑子还没转过来的时候先画的草稿线。用好了,它是你的开发加速器;用不好,它是你上线炸锅的雷。
我个人觉得吧,不要滥用 pass,也不要鄙视它。有些场景,它确实是最优解,比如占位、结构搭建、默认空实现,但你要明确这个地方“暂时不做”和“永远不做”的区别。
像我现在写项目,遇到那种还没想好怎么实现的地方,绝不留 pass,一定写 raise 或者注释写清楚“TODO 实现 xxx”。这样半年后你再回来,至少知道当时留的是个坑,不至于掉进去都不知道。
当然,如果你做的是开源项目,那更得避免用 pass 糊弄,毕竟你丢出来的代码别人也在看,“pass 一大片”的代码是没有说服力的。
总之,这玩意儿虽然简单,但你别小看它的存在,它是一门语言对于“留白”的一种表达,一种语法上的必要妥协,也是一种程序员写代码时的“先写再说”的小聪明。
要说 Python 的精髓,很多时候就藏在这些不起眼的小细节里。你看似写了个啥也不干的 pass,其实已经在程序里给出了你的意图——我知道这里需要逻辑,只是现在我还没准备好。这就像画画,草图也得打上几笔,哪怕最后会擦掉,它的存在,曾经帮助你构建起了整个轮廓。

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

  • 发表于 2025-09-24 09:40
  • 阅读 ( 45 )
  • 分类:Python开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
小柒
小柒

2228 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 2228 文章
  3. Pack 1479 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章