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
相关产品推荐
相关产品推荐

