如何在Python中创建通用'template'函数?测试函数前后执行命令最优方案
嘿,这两个问题都是Python里很常见的复用代码场景,我来给你拆解下最简洁的实现方式:
一、创建通用的Template函数
核心思路是把模板结构和填充数据分离,根据需求不同,有两种实用的实现方式:
1. 轻量字符串模板函数(适合简单场景)
直接基于Python内置的字符串格式化功能封装,灵活度拉满:
def render_template(template_str, **context): """通用模板渲染:传入模板字符串和关键字参数数据""" return template_str.format(**context) # 用法示例 user_notice = "用户{id}({name})的订单{order_no}已发货,预计{days}天送达" print(render_template( user_notice, id=1001, name="张三", order_no="20240501001", days=3 )) # 输出:用户1001(张三)的订单20240501001已发货,预计3天送达
你可以随便定义模板的格式,只要用{变量名}占位,然后通过关键字参数传数据就行。
2. 高阶函数生成专用模板(适合固定模板重复使用)
如果有某个模板需要反复渲染不同数据,可以用高阶函数封装成专用函数,调用更简洁:
def create_template(template_str): """绑定固定模板,返回一个只需要传数据的渲染函数""" def render(**context): return template_str.format(**context) return render # 用法示例 greeting_tpl = create_template("嗨,{nickname}!今天的天气是{weather}") print(greeting_tpl(nickname="小李", weather="晴转多云")) print(greeting_tpl(nickname="老王", weather="小雨"))
这样每次渲染同一个模板时,不用再重复写模板字符串,直接传数据就行。
二、给测试函数统一加前后置操作(避免重复代码)
不想把初始化/清理代码复制到每个测试函数里,最优雅的方式是用装饰器,如果用测试框架的话还有更专业的方案:
1. 自定义装饰器(通用场景,无需测试框架)
把前后置逻辑封装成装饰器,然后给每个测试函数加个装饰器标记就行:
def test_with_hooks(func): def wrapper(*args, **kwargs): # 测试前执行的操作:比如初始化环境、打印日志 print(f"\n=== 开始测试:{func.__name__} ===") print("初始化测试数据...") # 执行核心测试逻辑 test_result = func(*args, **kwargs) # 测试后执行的操作:比如清理环境、生成报告 print("清理测试数据...") print(f"=== 测试结束:{func.__name__} ===") return test_result return wrapper # 给测试函数添加装饰器 @test_with_hooks def test_login_success(): print("执行登录成功的测试逻辑") @test_with_hooks def test_login_fail(): print("执行登录失败的测试逻辑") # 调用测试函数 test_login_success() test_login_fail()
所有测试的前后置逻辑都集中在装饰器里,后续要修改的话只改一处就行。如果需要不同的前后置,还可以给装饰器加参数,实现差异化配置:
def test_hook(setup_func, teardown_func): def decorator(func): def wrapper(*args, **kwargs): setup_func() result = func(*args, **kwargs) teardown_func() return result return wrapper return decorator # 定义不同的前后置函数 def setup_db(): print("连接测试数据库") def teardown_db(): print("断开数据库连接") def setup_api(): print("启动API测试服务") def teardown_api(): print("停止API测试服务") # 给不同测试绑定不同钩子 @test_hook(setup_db, teardown_db) def test_db_query(): print("执行数据库查询测试") @test_hook(setup_api, teardown_api) def test_api_post(): print("执行API POST请求测试")
2. 用测试框架的Fixture(推荐,比如pytest)
如果你的测试是用pytest写的,那用fixture是更专业的选择,它支持不同作用域(函数/类/模块级),还能传递数据:
import pytest # 定义一个函数级的fixture,每个测试函数都会触发一次 @pytest.fixture() def test_environment(): # 前置操作:初始化环境 print("\n=== 初始化测试环境 ===") # 可以在这里返回数据给测试函数使用 yield {"test_url": "http://localhost:8000"} # 后置操作:清理环境 print("=== 清理测试环境 ===") # 测试函数通过参数接收fixture def test_user_create(test_environment): print(f"使用测试地址:{test_environment['test_url']}") print("执行用户创建测试") def test_user_delete(test_environment): print(f"使用测试地址:{test_environment['test_url']}") print("执行用户删除测试")
运行pytest时,fixture会自动在测试前后执行对应的逻辑,完全不用手动调用,非常省心。
内容的提问来源于stack exchange,提问作者user2503227
相关产品推荐
相关产品推荐

