Add Day_3: 函数与异常(日志/参数校验)
This commit is contained in:
+112
@@ -0,0 +1,112 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Day_3 参考解答
|
||||
=============
|
||||
主题:函数与异常。
|
||||
建议:先自己写,写不出来再看;看完后关掉文件自己默写一遍。
|
||||
"""
|
||||
|
||||
import time
|
||||
|
||||
# ============================================================
|
||||
# 题目一:万能日志记录器
|
||||
# ============================================================
|
||||
|
||||
def log_call(func, label=""):
|
||||
"""给函数包一层日志。func 被调用时打印参数和耗时。"""
|
||||
def wrapper(*args, **kwargs):
|
||||
tag = f"[{label}] " if label else ""
|
||||
print(f"{tag}[LOG] 调用函数 {func.__name__},参数为 args={args}, kwargs={kwargs}")
|
||||
start = time.time()
|
||||
result = func(*args, **kwargs) # 原样透传参数
|
||||
elapsed = time.time() - start
|
||||
print(f"{tag}[LOG] {func.__name__} 执行完成,耗时 {elapsed:.4f} 秒")
|
||||
return result # 原样返回结果
|
||||
return wrapper
|
||||
|
||||
|
||||
@log_call # 等价于 add = log_call(add)
|
||||
def add(a, b):
|
||||
return a + b
|
||||
|
||||
|
||||
def multiply(a, b):
|
||||
return a * b
|
||||
|
||||
multiply = log_call(multiply, label="核心计算") # 进阶:带标签
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print(add(1, 2))
|
||||
print(multiply(3, 4))
|
||||
# 输出示例:
|
||||
# [LOG] 调用函数 add,参数为 args=(1, 2), kwargs={}
|
||||
# [LOG] add 执行完成,耗时 0.0000 秒
|
||||
# 3
|
||||
# [核心计算][LOG] 调用函数 multiply,参数为 args=(3, 4), kwargs={}
|
||||
# [核心计算][LOG] multiply 执行完成,耗时 0.0000 秒
|
||||
# 12
|
||||
|
||||
|
||||
# ============================================================
|
||||
# 题目二:模拟注册接口的参数校验
|
||||
# ============================================================
|
||||
|
||||
class ValidationError(Exception):
|
||||
"""自定义校验异常:参数不合法时抛出"""
|
||||
pass
|
||||
|
||||
|
||||
def validate_registration(data):
|
||||
username = data.get("username")
|
||||
email = data.get("email")
|
||||
age = data.get("age")
|
||||
|
||||
if not username or len(username) < 3:
|
||||
raise ValidationError("用户名必须存在且长度不少于 3")
|
||||
if not email or "@" not in email or "." not in email:
|
||||
raise ValidationError("邮箱必须包含 @ 和 .")
|
||||
if age is None:
|
||||
raise ValidationError("年龄必须存在")
|
||||
try:
|
||||
age_int = int(age) # 字符串 "20" 也能转
|
||||
except (TypeError, ValueError):
|
||||
raise ValidationError("年龄必须是整数")
|
||||
if not (1 <= age_int <= 120):
|
||||
raise ValidationError("年龄必须在 1~120 之间")
|
||||
|
||||
|
||||
def register():
|
||||
data = {"username": "zhangsan", "email": "zs@163.com", "age": "20"}
|
||||
try:
|
||||
validate_registration(data)
|
||||
print(f"注册成功,欢迎 {data['username']}!")
|
||||
except ValidationError as e:
|
||||
print(f"校验失败: {e}")
|
||||
|
||||
|
||||
# ---- 进阶:把规则做成数据 ----
|
||||
def is_valid_email(email):
|
||||
return isinstance(email, str) and "@" in email and "." in email
|
||||
|
||||
|
||||
def validate(data, rules):
|
||||
"""rules: {字段名: (校验函数, 错误信息)},返回所有错误列表"""
|
||||
errors = []
|
||||
for field, (check, message) in rules.items():
|
||||
if not check(data.get(field)):
|
||||
errors.append(f"{field}: {message}")
|
||||
return errors
|
||||
|
||||
|
||||
RULES = {
|
||||
"username": (lambda v: isinstance(v, str) and len(v) >= 3, "用户名长度不足 3"),
|
||||
"email": (is_valid_email, "邮箱格式不正确"),
|
||||
"age": (lambda v: isinstance(v, int) and 1 <= v <= 120, "年龄非法"),
|
||||
}
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
register() # 注册成功,欢迎 zhangsan!
|
||||
print(validate({"username": "zs", "email": "bad", "age": 200}, RULES))
|
||||
# ['username: 用户名长度不足 3', 'email: 邮箱格式不正确', 'age: 年龄非法']
|
||||
Reference in New Issue
Block a user