根据其内容更改python变量

问题描述:

我正在用Django编写一些东西,它变得有点乱。我试图创建一个应用程序,它可以从可上载的Python模块运行并返回数据,并带有用于调用函数的文本输入字段。 大部分工作,我可以调用没有参数的函数。 问题是与进入需要的参数功能,则传递到Python是字符串形式的任何输入,这意味着如果我输入:param('a',[foo])调用的函数:根据其内容更改python变量

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

该函数将返回:

"Hello world'a'[foo]" 

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

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

编辑由于担心安全问题:我不太担心安全问题,因为这只会是一个本地项目。

+4

你可以用'eval',但它是危险的,这样对用户输入。 – 2015-02-09 19:57:58

+1

一定要知道你在那里做什么。运行上传的代码会打开几个安全问题!我不知道你在建什么,但是想一想,如果这真的是必要的,以及如何使它安全... – kratenko 2015-02-09 20:00:12

+2

@ Alistair401更好的问题是为什么你认为这是解决这个问题的正确方法(提示:它不) – 2015-02-09 20:00:50

可以使用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()