Python-传递变量句柄以进行计算

Python-传递变量句柄以进行计算,python,z3py,Python,Z3py,我正在使用python和z3py模块编写一些程序。 我试图做的是:从位于其他文件中的函数中提取if或while语句的约束。此外,我还提取语句中使用的变量及其类型。 由于我不想手动将约束解析为z3py友好的形式,所以我尝试使用evaluate来完成这项工作。因此,我使用了以下页面的提示: 现在的问题是:我不知道约束中的变量是如何调用的。但似乎我必须将每个变量的句柄命名为实际变量。否则,您将无法找到它。我的代码如下所示: solver = Solver() # Look up the constra

我正在使用python和z3py模块编写一些程序。
我试图做的是:从位于其他文件中的函数中提取if或while语句的约束。此外,我还提取语句中使用的变量及其类型。
由于我不想手动将约束解析为z3py友好的形式,所以我尝试使用evaluate来完成这项工作。因此,我使用了以下页面的提示:
现在的问题是:我不知道约束中的变量是如何调用的。但似乎我必须将每个变量的句柄命名为实际变量。否则,您将无法找到它。我的代码如下所示:

solver = Solver()
# Look up the constraint:
branch = bd.getBranchNum(0)
constr = branch.code
# Create handle for each variable, depending on its type:
for k in mapper.getVariables():
    var = mapper.getVariables()[k]
    if k in constr:
        if var.type == "intNum":
            Int(k)
        else:
            Real(k)
# Evaluate constraint, insert the result and solve it:
f = eval(constr)
solver.insert(f)
solve(f)
如您所见,我将变量和约束保存在类中。执行此代码时,我得到以下错误:

NameError: name 'real_x' is not defined
如果我不在变量上使用循环,而是使用以下代码,则一切正常:

solver = Solver()
branch = bd.getBranchNum(0)
constr = branch.code
print(constr)
real_x = Real('real_x')
int_y = Int('int_y')
f = eval(constr)
print(f)
solver.insert(f)
solve(f)
问题是:我不知道,这些变量被称为“real_x”或“int_y”。此外,我不知道使用了多少变量,这意味着我必须使用一些动态的东西,比如循环


现在我的问题是:有办法解决这个问题吗?如何告诉python句柄已经存在,但名称不同?还是我的方法完全错误,我必须做一些完全不同的事情?

这种事情几乎总是一个坏主意(请参阅了解更多详细信息),但“几乎总是”并不是“总是”,而且看起来您正在使用一个专为这种方式使用而设计的库,在这种情况下,您发现了一个例外

乍一看,您似乎也遇到了指南中罕见的例外之一(另请参见)。但你没有

你需要像
real\x
这样的变量存在的唯一原因是
eval
可以看到它们,对吗?但是函数已经知道如何在字典中而不是在全局名称空间中查找变量。看起来你从映射器中得到的是一本字典

因此,跳过整个混乱的循环,只需执行以下操作:

variables = mapper.getVariables()
f = eval(constr, globals=variables)
(在Python的早期版本中,
globals
是一个仅用于位置的参数,因此如果出现错误,请删除
globals=

正如文档所解释的,这使
eval
函数能够访问实际变量,以及
mapper
想要生成的变量,并且它可以执行各种不安全的操作。如果要防止不安全的事情发生,请执行以下操作:

variables = dict(mapper.getVariables())
variables['__builtins__'] = {}
f = eval(constr, globals=variables)

k==“Real\ux”
时,调用
Real(k)
显然不是为您创建名为
Real\ux
的变量。你期待它吗?for循环只是需要测试的东西。我实际上做的是:将变量保存为类实例。这意味着:我保存名称、当前值、所有使用的值以及我创建的句柄。我认为创建句柄并将其保存在某个地方就足够了。我不知道python需要这样的输入。非常感谢。关于环球队的事正是我要找的。现在一切都好了。