推理基础设施 · Python1.2 参数:位置、关键字、默认
01
函数与代码组织 · 2 / 6

1.2 参数:位置、关键字、默认

💡 推理请求有 prompt、max_tokens、temperature... 怎么整齐地传给函数?

1.2 参数:位置、关键字、默认

三种参数形式

  1. 位置参数:按顺序传。f(prompt, temperature)
  2. 关键字参数:按名字传,可打乱顺序。f(temperature=0.7, prompt="hi")
  3. 默认参数:定义时给个默认值,调用时可以不传。

为什么默认参数重要

推理接口通常有一堆“可调旋钮”——temperaturetop_pmax_new_tokensrepetition_penalty。 如果每个都要调用方传,参数列表会爆炸。给它们一个合理的默认值,调用方只需要传想覆盖的。

def generate(prompt, max_tokens=512, temperature=0.7):
    return f"{prompt} | max={max_tokens} t={temperature}"

generate("hi")                        # 用默认
generate("hi", temperature=0.0)      # 覆盖一个
generate("hi", 256, 0.0)              # 全位置
generate("hi", max_tokens=256)        # 用关键字

示范

def log_request(endpoint, latency_ms, level="INFO"):
    print(f"[{level}] {endpoint} took {latency_ms}ms")

log_request("/v1/chat", 123)
log_request("/v1/chat", 456, level="WARN")
log_request(endpoint="/v1/embed", latency_ms=88, level="DEBUG")

✍️ 练习

写一个函数 chat(messages, model="qwen2.5-7b", temperature=0.7, max_tokens=1024),返回一个字典:

{
    "model": model,
    "temperature": temperature,
    "max_tokens": max_tokens,
    "num_messages": len(messages),
}

至少调用它两次:

  • 一次只传 messages
  • 一次用关键字参数覆盖 temperature=0.0

💡 思路提示

点开看提示
  1. messages 应该是个 list,比如 [{"role": "user", "content": "hi"}]
  2. len(list) 返回列表里元素个数,正好就是 num_messages
  3. 默认参数必须放在非默认参数后面:def f(a, b=1) ✅ ,def f(a=1, b)

✅ 参考解法

写不出来再打开
def chat(messages, model="qwen2.5-7b", temperature=0.7, max_tokens=1024):
    return {
        "model": model,
        "temperature": temperature,
        "max_tokens": max_tokens,
        "num_messages": len(messages),
    }

print(chat([{"role": "user", "content": "hi"}]))
print(chat([{"role": "user", "content": "hi"}], temperature=0.0))

🔍 进阶思考

默认参数有个经典坑:默认参数不要用可变对象(list / dict)

# ❌ 危险:所有调用共享同一个 list
def add(item, seen=[]):
    seen.append(item)
    return seen

print(add("a"))   # ['a']
print(add("b"))   # ['a', 'b']   ← 不是你以为的 ['b']

推理服务里几乎不会踩这个坑(因为配置项几乎都是字符串数字),但要知道。