我正在用Django写一些东西,它变得有点混乱。我正在尝试创建一个应用程序,该应用程序可以运行并从可上载的python模块返回数据,并带有用于调用函数的文本输入字段。
它大部分都在工作,我可以调用没有参数的函数。
问题在于输入需要参数的函数,因为传递给python的任何输入都是字符串形式,这意味着如果我输入:param('a',[foo])
来调用函数:
def param(a,b):
return "Hello world" + a + b
该功能将返回:
"Hello world'a'[foo]"
基本上我需要一种方法来获取一个字符串并将其转换为文字python代码......如果可能的话,我可以将此输入框视为python控制台。
有什么想法吗?任何帮助将非常欢迎!我确实意识到这不是一种非常pythonic的做事方式。
由于对安全性的担忧而编辑:我不太担心安全问题,因为这只会是本地项目。
答案 0 :(得分:1)
您可以使用eval
。
def param(a, b):
return "Hello world" + eval(a) + eval(b)
如果您尝试连接字符串和列表,肯定会产生错误:
>>> param('", an unsafe world!"', '"!!!"')
'Hello world, an unsafe world!!!!'
>>> param('", an unsafe world!"', '[]')
TypeError: cannot concatenate 'str' and 'list' objects
在删除引号时,我猜您可以自己添加引号(如eval('"{0}"'.format(a))
)或使用Padraic建议的ast.literal_eval()
。
答案 1 :(得分:1)
你可以使用ast.literal_eval,它比eval更有限但不会带来风险:
安全地评估表达式节点或包含Python文字或容器显示的Unicode或Latin-1编码字符串。提供的字符串或节点可能只包含以下Python文字结构:字符串,数字,元组,列表,dicts,布尔值和无。
from ast import literal_eval
def param(a,b):
return "Hello world" + literal_eval(a) + literal_eval(b)
In [9]: param('" foo"', "'bar'")
Out[9]: 'Hello world foobar'
你可以使用try / except来捕捉你想要a或b只是意味着字符串: