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

Python动态添加/返回表达式:自定义装饰器或内部修改需求

嘿,这两个需求其实都挺有意思的,我直接给你上可运行的代码和简单解释,你一看就懂~

1. 向Python动态添加或返回表达式

动态处理表达式分两种常见场景,根据你的需求选就行:

场景1:动态执行表达式并返回结果

用eval()就能快速实现,但要注意绝对别执行不可信的字符串,不然会有安全风险:

def run_dynamic_expression(expr_str):
    # 传入表达式字符串,返回执行后的结果
    return eval(expr_str)

# 测试示例
result = run_dynamic_expression("10 + 2 * (3 - 1)")
print(result)  # 输出14

场景2:返回表达式的AST节点(更安全)

如果只是想获取表达式的结构而不执行,用Python内置的ast模块更稳妥,能避免执行恶意代码:

import ast

def get_expression_ast(expr_str):
    # 解析表达式字符串,返回对应的抽象语法树节点
    return ast.parse(expr_str, mode='eval').body

# 示例:解析一个含变量的表达式
expr_ast = get_expression_ast("x ** 2 + y * 3")
print(ast.dump(expr_ast))
# 输出:BinOp(left=BinOp(left=Name(id='x', ctx=Load()), op=Pow(), right=Constant(value=2)), op=Add(), right=BinOp(left=Name(id='y', ctx=Load()), op=Mult(), right=Constant(value=3)))
2. 实现@special_decorator让调用fo()等价于yield fo()

这个装饰器的核心是把普通函数包装成生成器函数,让调用函数时返回一个生成器,里面自动yield原函数的执行结果。直接看代码:

def special_decorator(func):
    def wrapper(*args, **kwargs):
        # 先执行原函数拿到结果,再yield这个结果
        yield func(*args, **kwargs)
    return wrapper

基础测试用例

给普通函数加上装饰器,调用后就会得到生成器:

@special_decorator
def fo():
    return "我是原函数的返回值"

# 调用fo()得到生成器,用next()取出结果
gen = fo()
print(next(gen))  # 输出:我是原函数的返回值

支持带参数的函数

这个装饰器也兼容带参数的函数,适配各种场景:

@special_decorator
def calculate_area(radius):
    return 3.14 * radius ** 2

gen = calculate_area(5)
print(next(gen))  # 输出78.5

内容的提问来源于stack exchange,提问作者rawinput

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:27:50