Python如何实现元组内逻辑仅在引用时动态计算取值
实现方案
不需要强制将表达式转为字符串调用eval()实现需求,以下是两种可落地的实现方式:
方案1:lambda包装延迟求值(推荐,无安全风险)
用无参lambda包裹需要动态计算的表达式,读取对应元素时手动调用即可,计算时会自动读取变量a的最新值:
# 注意不要使用tuple作为变量名,会覆盖Python内置的tuple类型 my_tuple = (lambda: a + 1, 'hello', 'hello2') a = 1 print(my_tuple[0]()) # 初始a=1时读取,返回2 a = 2 print(my_tuple[0]()) # a更新为2后读取,返回3
如果不想每次取值都手动加()调用,可以自定义惰性元组类,下标取值时自动执行可调用对象:
class LazyTuple(tuple): def __getitem__(self, idx): item = super().__getitem__(idx) return item() if callable(item) else item my_lazy_tuple = LazyTuple((lambda: a + 1, 'hello', 'hello2')) a = 1 print(my_lazy_tuple[0]) # 直接下标访问,返回2 a = 2 print(my_lazy_tuple[0]) # 返回3
方案2:字符串+eval实现(不推荐,存在注入风险)
如果一定要用字符串存储表达式也可实现,但该方案存在任意代码执行风险,仅能在完全可信的内部环境使用:
my_tuple = ('a + 1', 'hello', 'hello2') a = 1 print(eval(my_tuple[0])) # 返回2 a = 2 print(eval(my_tuple[0])) # 返回3
内容的提问来源于stack exchange,提问作者Jonathan DOE
相关产品推荐
相关产品推荐

