根据python变量的内容更改该变量

根据python变量的内容更改该变量,python,django,Python,Django,我正在和Django写一些东西,现在有点乱了。我正在尝试创建一个应用程序,该应用程序可以运行并返回可加载python模块中的数据,其中包含一个用于调用函数的文本输入字段。 它大部分工作正常,我可以调用没有参数的函数。 问题在于输入需要参数的函数,因为传递给python的任何输入都是字符串形式,这意味着如果我输入:param('a',[foo])来调用函数: def param(a,b): return "Hello world" + a + b 该函数将返回: "Hello world

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

def param(a,b): 
   return "Hello world" + a + b
该函数将返回:

"Hello world'a'[foo]"
基本上,我需要一种方法来获取字符串并将其转换为文字python代码。。。如果可能的话,我可以把这个输入框当作python控制台来处理

有什么想法吗?欢迎任何帮助!我确实意识到这不是一种很像蟒蛇的做事方式


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

您可以使用
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更有限,但不会带来风险:

安全地计算表达式节点或包含Python文本或容器显示的Unicode或Latin-1编码字符串。提供的字符串或节点只能由以下Python文本结构组成:字符串、数字、元组、列表、dicts、boolean和None


当您希望a或b只是字符串时,可以使用try/except-to-catch:

您可以使用
eval
,但这样做对用户输入很危险。请确保知道您在那里做什么。运行上传的代码会带来很多安全问题!我不知道你在建什么,但如果真的有必要,请仔细想想,以及如何使它安全…@Alistair401一个更好的问题是,为什么你认为这是解决这个问题的正确方法(提示:不是)@JoranBeasley谢谢。有点神秘,但我会尝试想出一些其他的方法。我的代码运行了一个基本的系统,可以根据字符串的内容对你的意思进行预测,但这很难看,我一点也不自豪。还有其他提示吗?@Alistair401您希望
param
函数如何工作?
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'