python位置参数必须严格按定义顺序传入,错序会报typeerror;关键字参数提升可读性但不可滥用;*分隔符后参数仅支持关键字传入,python 3.0+支持。

位置参数传错顺序会直接报错
Python 函数调用时,位置参数必须严格按定义顺序传入,错一位就可能触发 TypeError 或逻辑错误。比如 open(file, mode),把 mode 放前面会导致打开文件失败,因为 Python 会把字符串当文件路径处理。
- 常见错误现象:
TypeError: expected str, bytes or os.PathLike object, not int(实际传了整数当路径) - 使用场景:函数参数少、调用频繁且顺序稳定(如
range(start, stop, step)) - 参数差异:位置参数不能跳过,而关键字参数可以省略有默认值的参数
- 性能影响:位置参数略快于关键字参数,但差距微乎其微,别为这点优化牺牲可读性
混用位置和关键字参数时,关键字必须在位置之后
这是硬性语法限制。一旦用了关键字参数,后面所有参数都必须是关键字形式,否则抛出 SyntaxError: positional argument follows keyword argument。
- 正确写法:
print("hello", end="", sep="|") - 错误写法:
print(end="", "hello")→ 直接语法错误 - 容易踩的坑:动态构造参数时用字典解包(
**kwargs)后又追加位置参数,会触发该错误 - 兼容性注意:所有 Python 版本都强制此规则,不是版本差异问题
关键字参数能提升可读性,但别滥用覆盖默认行为
用关键字传参能让调用意图一目了然,尤其参数多或含义不直观时(如 json.dumps(obj, indent=2, sort_keys=True))。但过度显式反而干扰重点。
- 推荐场景:参数超过 3 个、含布尔开关(
strip=True)、或默认值易被忽略(encoding="utf-8") - 风险点:显式传
None覆盖默认值,可能导致函数内部空值检查失效(如func(value=None)和未传value行为可能不同) - 参数差异:关键字参数允许跳过中间默认参数,位置参数不行;但关键字参数名拼错会报
TypeError: got an unexpected keyword argument
想强制只接受关键字参数?用 * 分隔符
在函数定义中插入单个 *,它后面的参数只能用关键字方式传入。这是明确接口契约的有效手段,尤其适合配置类函数。
立即学习“Python免费学习笔记(深入)”;
- 示例:
def connect(*, host, port, timeout=30): ...→connect("127.0.0.1", 8080)报错,必须写connect(host="127.0.0.1", port=8080) - 为什么这样做:防止调用方误以为前两个参数是位置参数,避免未来加参数时破坏兼容性
- 容易踩的坑:PyCharm 等 IDE 可能不会高亮提示这种限制,靠文档或类型注解(
host: str)辅助识别 - 兼容性:Python 3.0+ 支持,2.x 不支持 —— 如果还在用 2.7,这个语法直接报错
函数签名里那个 * 很小,但漏掉它,或者在调用时没意识到某个参数已被设计成仅限关键字,就很容易卡在“明明参数都给了,怎么还报错”上。










