01
函数与代码组织 · 2 / 6
1.2 参数:位置、关键字、默认
💡 推理请求有 prompt、max_tokens、temperature... 怎么整齐地传给函数?
1.2 参数:位置、关键字、默认
三种参数形式
- 位置参数:按顺序传。
f(prompt, temperature) - 关键字参数:按名字传,可打乱顺序。
f(temperature=0.7, prompt="hi") - 默认参数:定义时给个默认值,调用时可以不传。
为什么默认参数重要
推理接口通常有一堆“可调旋钮”——temperature、top_p、max_new_tokens、repetition_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
💡 思路提示
点开看提示
messages应该是个 list,比如[{"role": "user", "content": "hi"}]len(list)返回列表里元素个数,正好就是num_messages- 默认参数必须放在非默认参数后面:
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']
推理服务里几乎不会踩这个坑(因为配置项几乎都是字符串数字),但要知道。