python以字符串形式评估命令
Posted
技术标签:
【中文标题】python以字符串形式评估命令【英文标题】:python evaluate commands in form of strings 【发布时间】:2013-08-16 23:39:49 【问题描述】:在 Python 中,我试图弄清楚如何评估程序中作为字符串给出的命令。例如,考虑内置数学函数sin
、cos
和tan
假设我被赋予了这些功能作为一个列表;
li = ['sin', 'cos', 'tan']
现在,我想遍历列表中的每个元素并将每个函数应用于数字参数:
x = 45
for func in li:
func(x)
上面显然不起作用,因为 func 是一个字符串,只是显示了这个想法。在 lisp 中,我可以将每个函数设为带引号的符号,然后与上面类似地进行评估(当然在 lisp 语法中很好,但想法是一样的)。
这在 python 中是如何完成的?
谢谢,如果您需要更多信息,请告诉我!
【问题讨论】:
你可以制作一个字典来将字符串名称映射到它们各自的函数? 无论您选择哪个答案,请不要在生产环境中使用eval
,尤其是在您获得用户输入的情况下。考虑用户输入'import os; os.remove('/etc/passwd')'
或类似的东西......
【参考方案1】:
只使用函数本身:
from math import sin, cos, tan
li = [sin, cos, tan]
如果你真的需要使用字符串,创建一个字典:
funcs = 'sin': sin, 'cos': cos, 'tan': tan
func = funcs[string]
func(x)
【讨论】:
【参考方案2】:这里有几个选项,我在下面列出了一些更好的选项:
如果所有功能都来自同一个模块,您可以使用module.getattr(func)
来访问该功能。在这种情况下,sin、cos 和 tan 都是数学函数,因此您可以执行以下操作:
import math
li = ['sin', 'cos', 'tan']
x = 45
for func in li:
x = getattr(math, func)(x)
创建一个将名称映射到函数的字典,并将其用作查找表:
import math
table = 'sin': math.sin, 'cos': math.cos, 'tan': math.tan
li = ['sin', 'cos', 'tan']
x = 45
for func in li:
x = table[func](x)
将函数直接放入列表中:
import math
li = [math.sin, math.cos, math.tan]
x = 45
for func in li:
x = func(x)
【讨论】:
如果有人已经完成了from math import *
,那么globals()[func](x)
会起作用吗?
是的,这会起作用,但在这种情况下,我仍然认为创建一个包含一组有限的预期数学函数的字典会更好,而不是允许任何可能包含在要执行的命名空间。【参考方案3】:
假设您从诸如用户输入之类的东西中获取这些字符串,因此您不能只将输入更改为函数列表,您有几种方法可以做到这一点。一种方法是在 math
模块中查找函数:
import math
name = 'sin'
getattr(math, name) # Gives the sin function
或者,您可以构建一个将名称映射到函数的字典:
funcs = 'sin': math.sin, 'cos': math.cos, 'tan': math.tan
funcs['sin'] # Gives the sin function
【讨论】:
【参考方案4】:如果这些是模块的函数(示例中的函数是math
模块的函数),您可以使用getattr
:
import math
li = ['sin', 'cos', 'tan']
x = 45
for func in li:
f = getattr(math, func)
f(x)
如果你不需要是字符串,你可以制作一个函数列表:
import math
li = [sin, cos, tan]
x = 45
for func in li:
func(x)
【讨论】:
以上是关于python以字符串形式评估命令的主要内容,如果未能解决你的问题,请参考以下文章
字符串中的数字以“非数字”或错误形式出现 - Python [重复]