You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:38:55