【发布时间】:2016-06-23 13:31:41
【问题描述】:
假设我得到一个要评估的字符串
temperature*x
我有两组变量 - 简单的一组:
easy_ns = {'x':3, 'y':4}
还有一个更难的:
harder = ['temperature', 'sumofall']
每个都需要大量时间来计算,除非它们是用户提供的表达式的一部分,否则我不想计算它们
例如除非我知道需要,否则我不想开始检测“温度”
我的命名空间中可能有一些“便宜”的变量,但其他变量我想尽可能推迟计算
如何在评估之前从我的 eval 字符串中获取变量列表
我知道我可以尝试:eval() except: 我会得到一个:
NameError: name 'temperature' is not defined
有没有一种pythonic方法来提取确切的变量名?
有没有一种很好的方法来构建你的命名空间以进行延迟评估?
类似
namespace = {'x':3, 'y':4, 'temperature':lazy_temperature_function}
所以只有当我的表达式被评估时
res=eval('temperature*x')
是我的惰性温度函数调用
当然是的 - 我绝对必须使用“eval” - 这就是我发布这些问题的原因
场景是我得到一个包含一组键和值的输入文件,然后用户可以提供一个他希望我根据这些值和一些我不想计算的生成变量的组合来计算的表达式,除非用户将它们包含在他/她的表达中
【问题讨论】:
-
你为什么要这样对自己?这听起来很难编程和使用。你真正想做的是什么?
-
您是否考虑过绝对不尝试评估字符串?
-
我拒绝相信你“绝对必须使用 eval”。您或您正在使用其输出的其他程序员做出了一个糟糕的决定,使您陷入了困境。如果可能,您应该撤消该决定。
-
如果
temperature在您对字符串调用 eval 的范围内的任何地方都不是变量,您如何拥有它?我不知道你到底想做什么。 -
“有没有一种很好的方法来构建你的命名空间以进行惰性求值?” - 你的命名空间没有理由不能成为具有 @ 惰性实现的字典包装器987654328@.
标签: python