在python中使用exec和compile

在python中使用exec和compile,python,dictionary,compilation,exec,Python,Dictionary,Compilation,Exec,我想要一本字典,其中的值是一个语句。我不需要动态构建语句。语句中出现的名称在本地范围内。下面是一个简单的例子。似乎“exec”是应该使用的东西,但这似乎是不受欢迎的,而且可能很慢。此代码将在随机建模器中使用,并将运行数百万次。你能建议我如何最好地实现这个想法(也许是通过预编译?)。是不是我已经有这个权利了 干杯 杰夫 假设您正在定义x的某个范围内执行exec(d['plusone']),否则您将得到namererror 将callable放入dict并显式传递x(并显式分配给x)似乎要好得多:

我想要一本字典,其中的值是一个语句。我不需要动态构建语句。语句中出现的名称在本地范围内。下面是一个简单的例子。似乎“exec”是应该使用的东西,但这似乎是不受欢迎的,而且可能很慢。此代码将在随机建模器中使用,并将运行数百万次。你能建议我如何最好地实现这个想法(也许是通过预编译?)。是不是我已经有这个权利了

干杯

杰夫


假设您正在定义
x
的某个范围内执行
exec(d['plusone'])
,否则您将得到
namererror

将callable放入
dict
并显式传递
x
(并显式分配给
x
)似乎要好得多:


谢谢关键是使用lambda函数并将参数传递给它。现在有一个关于速度的问题:这会很快吗?我想是的,因为字节码只编译了一次——第一次调用函数?@VortexProf是的,应该相当快,因为您只需要编译一次。导入操作符可能有助于提高性能,也可能没有帮助,但它允许您灵活使用。也就是说,您可以将裸操作符
add
放在dict中,然后执行类似
d['plus'](x,1)
的操作,以实现与
plusone
op相同的功能,并且可以灵活地加上任何数字。
d={'plusone':'x+=1','minusone':'x-=1'}
x=2
exec(d['plusone'])
print x  ::: output '3'
exec(d['minusone'])
print x  ::: output '2'
from operator import add, sub

d={'plusone':lambda x: add(x,1), 'minusone':lambda x: sub(x,1)}

x = 2

x = d['plusone'](x)

x
Out[17]: 3