python以字符串形式评估命令

Posted

技术标签:

【中文标题】python以字符串形式评估命令【英文标题】:python evaluate commands in form of strings 【发布时间】:2013-08-16 23:39:49 【问题描述】:

在 Python 中,我试图弄清楚如何评估程序中作为字符串给出的命令。例如,考虑内置数学函数sincostan

假设我被赋予了这些功能作为一个列表;

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 中评估单词字符串的辅音/元音组成

Python 的几个命令行参数

评估字符串的布尔函数

字符串中的数字以“非数字”或错误形式出现 - Python [重复]

python 知识点:反射 之 getattr()实现以字符串形式导入模块和执行函数

Python:将字符串列表转换为布尔值,其中布尔值以字符串形式存在[重复]