Python:使用字符串作为对象参数?

时间:2012-11-19 07:55:04

标签: python string object types type-conversion

基本上我的问题如下......

在Python中,我有一个函数将以下列形式返回输出字符串:

'union(symbol(a), symbol(b))'

在此字符串中找到的函数表单实际上存在于名为RegExTree的对象类中。此外,该类包含使用函数" construct()"来构造树数据结构的函数。如下图所示:

tree = RegExTree()    
tree.construct(union(symbol(a), symbol(b))

以上两行代码可以正常工作,基于解析构造函数中的参数构建树。我想以类似的方式传入一个字符串,也许这行代码说明了我想要的东西:

tree = RegExTree()      
expression = 'union(' + 'symbol(' + 'a' + ')' + ', ' +  'symbol(' + 'b' + ')' + ')'
tree.construct(expression)

现在我按照上面的方式编写代码会产生错误(在Linux终端中),如下所示:

$ Attribute Error: 'str' object has no attribute 'value'

您是否可以强制Python将字符串解释为有效的参数/代码行。本质上,不是作为字符串,而是作为对象构造函数。

有没有办法让Python解释一个字符串,而不是解析/编译成对象的东西,让它从字符串构造对象,好像它是一行代码,用于描述相同的最终目标? 是我要求进行某种后门类型转换?或者是我在编程语言中提出的不可能,特别是Python?

编辑:使用下面提到的涉及" eval()"的迈克尔解决方案,有一种方法可以解决这个问题:

tree = RegExTree()
a = 'a'
b = 'b'    
expression = 'union(' + 'symbol(' + a + ')' + ', ' +  'symbol(' + b + ')' + ')'
tree.construct(eval(expression))

有更好的方法吗?或者只是我输出的性质作为表示函数的字符串不是一个好主意? [感谢martineau纠正我的解决方案编辑!]

1 个答案:

答案 0 :(得分:2)

您可以使用python内置eval语句。

但请注意......您不希望在作为用户提供的外部输入进入程序的字符串上运行eval()。这可能会造成一个安全漏洞,程序的用户可以运行他们自己设计的任意Python代码。

在你的例子中,它看起来像这样:

tree = RegExTree()      
expression = 'union(' + 'symbol(' + 'a' + ')' + ', ' +  'symbol(' + 'b' + ')' + ')'
tree.construct( eval(expression) ) # Notice the eval statement here