把错误挡在发请求之前
本课写一个配置校验函数:服务地址、模型名、超时、重试次数。先用虚构地址,不创建真实密钥。你会学到为什么“配置已经填了”不等于格式正确,也能把这套方法用于普通应用配置。
使用自己已有的 GLM 聊天或编程助手入口,把下面材料作为普通代码任务。Coding Plan 与通用 API 是不同接入安排,本文不替你配置套餐,也不需要现在调用服务。智谱模型入口说明。
先给出合法配置与三个反例
{"base_url":"https://api.example.com/v1","model":"demo-model","timeout":30,"retries":2}
这只是教学地址,不能拿来调用。下面三种输入都应拒绝:timeout=0,retries=true,model 为空格。布尔值在一些语言和库里可能被当作数字,必须写清本题不接受。
把任务发送给助手:
请实现 validate_config(data),返回规范化后的新字典,不修改输入。
必填字段只有 base_url、model、timeout、retries,额外字段拒绝。
地址必须为https且有主机名,不允许用户名密码、查询参数和片段。
model 必须为非空字符串,去掉首尾空白。
timeout 为1~120整数,retries 为0~3整数,拒绝布尔值。
非法输入抛 ValueError;只用Python标准库。提供合法与边界断言。
保存并运行参考实现
from urllib.parse import urlsplit
def validate_config(data):
fields = {"base_url", "model", "timeout", "retries"}
if not isinstance(data, dict) or set(data) != fields:
raise ValueError("配置字段不完整或含未知字段")
address, model = data["base_url"], data["model"]
if not isinstance(address, str) or any(c.isspace() for c in address):
raise ValueError("地址格式错误")
url = urlsplit(address)
if (url.scheme != "https" or not url.hostname or url.username is not None
or url.password is not None or url.query or url.fragment):
raise ValueError("地址必须是无凭据的 HTTPS 地址")
if not isinstance(model, str) or not model.strip():
raise ValueError("model 不能为空")
for name, low, high in [("timeout", 1, 120), ("retries", 0, 3)]:
value = data[name]
if type(value) is not int or not low <= value <= high:
raise ValueError(f"{name} 类型或范围错误")
return {**data, "model": model.strip()}
good = dict(base_url="https://api.example.com/v1", model=" demo ", timeout=30, retries=2)
assert validate_config(good)["model"] == "demo"
assert good["model"] == " demo "
for change in [{"timeout": 0}, {"retries": True}, {"model": " "}, {"extra": 1}]:
try:
validate_config({**good, **change})
except ValueError:
pass
else:
raise AssertionError(change)
print("配置格式与边界样例通过")
保存为 config_check.py,运行 python config_check.py。这里不连网,也不验证模型是否存在;仅检查本题约定的配置格式。HTTPS 格式通过也不能证明地址值得信任,生产应用的允许域名与网络权限属于另外的控制层。
如果模型悄悄修正非法配置
例如把 timeout=0 自动改成 30,表面上避免报错,却隐藏了输入错误。给出明确修订:
本题要求非法输入立即抛 ValueError,不能偷偷使用默认值。请让 timeout=0 失败,同时保留 timeout=1 合法;不要改变传入字典。补充这两条边界断言后再运行。
如果它返回原字典并直接修改 model,你可以检查调用前后的值,要求返回新字典。用可见的输入变化说明问题,比只说“注意副作用”有效。
怎样接到真正项目里
读取配置后先校验,通过才创建客户端。报错显示字段名与允许范围,不打印完整配置,尤其不要输出密钥。将来加入凭据时,单独从服务端环境读取,不放进这份教学 JSON。