根据其内容更改python变量
问题描述:
我正在用Django编写一些东西,它变得有点乱。我试图创建一个应用程序,它可以从可上载的Python模块运行并返回数据,并带有用于调用函数的文本输入字段。 大部分工作,我可以调用没有参数的函数。 问题是与进入需要的参数功能,则传递到Python是字符串形式的任何输入,这意味着如果我输入:param('a',[foo])
调用的函数:根据其内容更改python变量
def param(a,b):
return "Hello world" + a + b
该函数将返回:
"Hello world'a'[foo]"
基本上我需要一种方法来获取一个字符串并将其转换为文字python代码...如果这是可能的,这样我可以把这个输入框当作它是python控制台。
任何想法?任何帮助将非常欢迎!我意识到这不是一种非常pythonic的做事方式。
编辑由于担心安全问题:我不太担心安全问题,因为这只会是一个本地项目。
答
可以使用ast.literal_eval,它比的eval更有限,但不造成的风险:
安全评估的表达式节点或Unicode或含有一个Python字面或容器显示Latin-1的编码的字符串。提供的字符串或节点可能只包含以下Python文字结构:字符串,数字,元组,列表,字典,布尔值和无。
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 /除了赶上,当你想a或b只是意味着是字符串:
答
您可以使用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()
。
你可以用'eval',但它是危险的,这样对用户输入。 – 2015-02-09 19:57:58
一定要知道你在那里做什么。运行上传的代码会打开几个安全问题!我不知道你在建什么,但是想一想,如果这真的是必要的,以及如何使它安全... – kratenko 2015-02-09 20:00:12
@ Alistair401更好的问题是为什么你认为这是解决这个问题的正确方法(提示:它不) – 2015-02-09 20:00:50