前言
初学 Python 时最常见的困惑不是"写法是什么",而是"我怎么知道有哪些可用的东西"。答案是:不用背——解释器自带了一套文档查询系统,入口就是内置的help()。
新手对它的两个典型误解:一是以为help()只能在交互式解释器里用,脚本里用不了(其实能用,只是输出方式不同);二是把help(obj)和print(obj.__doc__)当成一回事(前者会整理成员列表和签名,后者只吐一段未经排版的原始字符串)。
本文从零讲清help()的几种用法、怎么看懂它打印出来的签名、配套的dir()与pydoc怎么配合,并给出可以直接照着敲的示例。示例基于 Python 3.8+。
一、help() 的两种形态
官方给的签名有两种形式:
help()
help(request)| 调用形式 | 行为 |
|---|
help() | 进入交互式帮助系统(仅在解释器里合适) |
help("名字") | 按字符串查找模块、函数、类、方法、关键字或文档主题 |
help(对象) | 为这个对象生成帮助页 |
关键在于:help()这个函数是由site模块在解释器启动时加进内置命名空间的。也就是说,如果你用python -S启动(关闭 site 模块),help这个名字根本不存在。平时不用管,但遇到"我的 Python 里没有 help"时,先想想是不是被 -S 关掉了。
# 适用于 Python 3.8+
help("keywords") # 打印 Python 关键字列表
help("modules") # 打印当前环境可导入的模块清单
help("topics") # 打印可用的帮助主题这三条是入门阶段最有用的"索引"。不过要注意,help("modules")会真的去扫描可导入模块,输出很长,在交互式解释器里更合适。想程序化地拿关键字列表,用keyword模块更稳:
# 适用于 Python 3.9+(kwlist 与 iskeyword 在 3.8 也有,softkwlist 需 3.9+)
import keyword
print(keyword.kwlist)
print(keyword.iskeyword("while")) # True
print(keyword.iskeyword("match")) # False,match 是「软关键字」,不在 kwlist 里
print(keyword.softkwlist) # ['_', 'case', 'match', ...],需 3.9+二、给对象生成帮助页
传入对象是最常用的形式,模块、函数、类、实例都可以。
# 适用于 Python 3.8+
help(str) # 字符串类型的所有方法
help(str.split) # 只看 split 这一个方法
import json
help(json.dumps) # 第三方/标准库模块同理对自定义的类也一样,只要写好文档字符串(docstring),help()就能展示出来:
# 适用于 Python 3.8+
class Rect:
"""矩形。
width 与 height 都是正数。
"""
def area(self):
"""返回面积(宽乘高)。"""
return self.width * self.height
help(Rect)
help(Rect.area)类、函数、模块的第一条字符串语句会自动成为它们的__doc__属性,help()就是把它整理后打印出来。如果某处没有文档字符串,help()会提示找不到文档——这不是报错,只是说明作者没写。
三、怎么看懂 help 打印的签名
help()输出里最需要注意的是函数签名中的两个符号:斜杠/和星号*。
| 符号 | 含义 | 例子 |
|---|
/ | 它前面的参数是仅位置参数(positional-only) | help(len)显示len(obj, /) |
* | 它后面的参数是仅关键字参数(keyword-only) | help(sorted)显示sorted(iterable, /, *, key=None, reverse=False) |
代入结论就是:len()的参数只能按位置传;sorted()的第一个参数可以按位置传,而key和reverse必须写成关键字。
# 适用于 Python 3.8+
import inspect
print(inspect.signature(sorted))
# (iterable, /, *, key=None, reverse=False)help()的输出是给人看的,格式随版本会变;要在程序里稳定地取签名,用inspect.signature()。
四、配套工具:dir、doc 与 pydoc
help()只列出"比较大"的东西,dir()则把对象所有名字都列出来,速度更快,适合快速探索。
# 适用于 Python 3.8+
import json
names = dir(json)
print(names[:10])
print([n for n in names if not n.startswith("_")]) # 只看公开名字对照记忆:
| 工具 | 作用 | 适合场合 |
|---|
help(obj) | 整理后的文档 + 成员列表 | 想读懂怎么用 |
dir(obj) | 全部名字的列表 | 快速看有哪些名字 |
obj.__doc__ | 原始文档字符串 | 程序里读取、测试断言 |
inspect.signature(f) | 结构化的签名对象 | 程序里做分析 |
pydoc命令行 | 把help能力搬到终端/浏览器 | 不在解释器里时 |
命令行版更灵活,不用先进入解释器:
# 查看某个模块的文档
python -m pydoc json
# 用关键词搜索所有已安装模块的摘要
python -m pydoc -k csv
# 起一个本地文档服务器并打开浏览器
python -m pydoc -b-k特别适合"我记得有个模块能干这件事,但想不起叫什么"。
五、一段可照着敲的入门练习
# 适用于 Python 3.8+
import keyword
import inspect
def show(name, obj):
print("=" * 40)
print(f"{name}: {type(obj).__name__}")
try:
print("签名:", inspect.signature(obj))
except (TypeError, ValueError):
print("签名: (无法获取)")
doc = inspect.getdoc(obj)
print("首行:", (doc or "(无文档)").splitlines()[0])
show("len", len)
show("sorted", sorted)
show("str.split", str.split)
show("dict.get", dict.get)
print("关键字:", keyword.kwlist)inspect.getdoc()会帮你把文档字符串的缩进处理好,比直接读__doc__干净。
常见坑点
坑 1:用变量名把 help 覆盖掉。
❌help = "查看文档"—— 之后help(...)立刻变成"字符串不可调用"的TypeError。
✅ 换个变量名;同理别用dir、type、vars、format当变量名。
坑 2:在脚本里调不带参数的help()。
❌ 脚本里写help()—— 它会尝试进入交互式帮助系统,在非交互环境下会读到 EOF,行为不是你想要的效果。
✅ 用help("模块名")或help(对象)这种带参数的形式。
坑 3:把help()的输出当稳定格式解析。
❌ 用正则去抠help(f)里的参数名 —— 输出格式在版本间会变。
✅ 程序里要签名就用inspect.signature(f),要文档就用inspect.getdoc(f)。
坑 4:以为print(obj.__doc__)和help(obj)等价。
❌ 只print(json.dumps.__doc__)就以为看全了 —— 你只拿到一段原始字符串,看不到整体的成员结构。
✅help(obj)看全貌,inspect.getdoc(obj)在程序里取干净文本。
坑 5:以为dir()只列公开名字。
❌ 看到dir(...)结果里一堆双下划线就懵了。
✅dir()列出全部名字,过滤用[n for n in dir(x) if not n.startswith("_")]。
坑 6:python -S之后找不到 help。
❌ 以为解释器坏了 ——-S跳过了site模块,而help正是它加进内置命名空间的。
✅ 去掉-S,或者改用python -m pydoc这种不依赖内置help的方式。
坑 7:没写文档字符串,然后抱怨 help 没用。
❌ 自己定义的类不写 docstring,help(MyClass)只显示Help on class MyClass,什么信息都没有。
✅ 类、公开函数、模块顶部都写一段一句话摘要 + 需要的补充说明。
坑 8:对可选依赖的模块在没装的情况下help("它")。
❌help("numpy")在没装 numpy 的环境里报ModuleNotFoundError。
✅help("名字")对模块名会尝试导入;不确定是否安装时用python -m pydoc 名字或先importlib.util.find_spec("名字")探测。
总结
| 你想知道的事 | 用什么 |
|---|
| 有哪些关键字、主题、模块 | help("keywords")、help("topics")、help("modules") |
| 某个对象怎么用 | help(obj)或help("模块名") |
| 有哪些成员 | dir(obj)(配合下划线过滤) |
| 参数怎么传 | 看help里的签名,或inspect.signature(obj) |
| 强制文档怎么打 | 「/」之前是仅位置参数,「*」之后是仅关键字参数 |
| 不在解释器里怎么查 | python -m pydoc 名字、python -m pydoc -k 关键词 |
help()是 Python 送给初学者最好的礼物:不懂就问,问到的内容直接来自官方文档字符串,比任何二手教程都准。入门阶段把它和三件事绑在一起用就够了——dir()看有哪些名字、help()看怎么用、inspect.signature()在程序里拿签名。养成"遇到不认识的函数先help一下"的习惯,比背 API 清单高效得多。
(Python 2 中print是语句而非函数,写print("x")会被当成带括号的表达式;Python 3 中print才是函数。Python 2 的raw_input()也已改名为input()。Python 2.7 自 2020 年 1 月 1 日停止维护,本文一律使用 Python 3 写法。)