我目前正在尝试编写一个Python(3.4.4)图形用户界面与tkinter应该允许适合一些任意功能的数据点。为了简单起见,我想创建一些输入函数并对其进行评估。后来,我想用从scipy
进行绘制和拟合。替代执行
为了做到这一点,我想从用户输入字符串中创建一个动态(拟合)函数。我发现并阅读了exec
,但人们说(1)使用起来不安全,(2)总是有更好的选择(例如here和许多其他地方)。所以,我想知道在这种情况下会有什么替代方案?
下面是与工作两个嵌套函数的一些示例代码,但它不是动态:
def buttonfit_press():
def f(x):
return x+1
return f
print(buttonfit_press()(4))
这里是一些代码,引起NameError: name 'f' is not defined
之前,我甚至可以开始使用XVAL:
def buttonfit_press2(xval):
actfitfunc = "f(x)=x+1"
execstr = "def {}:\n return {}\n".format(actfitfunc.split("=")[0], actfitfunc.split("=")[1])
exec(execstr)
return f
print(buttonfit_press2(4))
与types.FunctionType
另一种方法在这里讨论(10303248)未成功要么...
小号o,我的问题是:是否有一个很好的选择可以用于这种情况?或者,如果没有,我如何使exec
运行代码?
我希望这是可以理解的,不要太模糊。预先感谢您的想法和意见。
@ GABOR鄂尔多斯:
要么我不明白,或者我不同意。如果我在主循环同一段程序代码,它承认f
,我可以从execstr
执行代码段:
actfitfunc = "f(x)=x+1"
execstr = "def {}:\n return {}\n".format(actfitfunc.split("=")[0], actfitfunc.split("=")[1])
exec(execstr)
print(f(4))
>>> 5
@卢卡斯Rogalski:
印刷execstr
似乎没什么问题:
def f(x):
return x+1
缩进错误不太可能是由于我的编辑器,但我仔细检查过 - 没关系。 介绍my_locals
,称其为exec
和印刷在事后表示:
{'f': <function f at 0x000000000348D8C8>}
但是,我仍然得到NameError: name 'f' is not defined
。
@ user3691475:
你举的例子非常相似,我的第一个例子。但是在我的理解中,这不是“动态的”,即在代码运行时不能改变函数的输出。
@Dunes:
我认为这是朝着正确的方向,谢谢。但是,我不明白我如何评估和使用此功能在下一步?我的意思是:为了能够适应它,我必须提取拟合变量(即f(x)=a*x+b
中的a
)或评估不同x值的函数(即print(f(3.14))
)。
@GáborErdős技术上它是,因为Exec将隐含引用传递'全局()'和'当地人()'和输入参数,他们会突变。 –
@nostradamus你的代码应该可以正常工作。你的缩进是否正确?你可以运行:'my_locals = {}; exec(execstr,globals(),my_locals)'然后显示存储在'my_locals'中的内容?通过打印'execstr'进行完整性检查也不会造成任何影响。 –