根据内容更改python变量

时间:2015-02-09 19:56:41

标签: python django

我正在用Django写一些东西,它变得有点混乱。我正在尝试创建一个应用程序,该应用程序可以运行并从可上载的python模块返回数据,并带有用于调用函数的文本输入字段。 它大部分都在工作,我可以调用没有参数的函数。 问题在于输入需要参数的函数,因为传递给python的任何输入都是字符串形式,这意味着如果我输入:param('a',[foo])来调用函数:

def param(a,b): 
   return "Hello world" + a + b

该功能将返回:

"Hello world'a'[foo]"

基本上我需要一种方法来获取一个字符串并将其转换为文字python代码......如果可能的话,我可以将此输入框视为python控制台。

有什么想法吗?任何帮助将非常欢迎!我确实意识到这不是一种非常pythonic的做事方式。

由于对安全性的担忧而编辑:我不太担心安全问题,因为这只会是本地项目。

2 个答案:

答案 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只是意味着字符串: