Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:使用字符串作为对象参数?_Python_String_Object_Types_Type Conversion - Fatal编程技术网

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

Python:使用字符串作为对象参数?,python,string,object,types,type-conversion,Python,String,Object,Types,Type Conversion,基本上我的问题如下 在Python中,我有一个函数将以以下形式返回输出字符串: 'union(symbol(a), symbol(b))' 在此字符串中找到的函数形式实际上存在于名为RegExTree的对象类中。此外,该类还包含一个使用函数“construct()”构建树数据结构的函数,如下所示: tree = RegExTree() tree.construct(union(symbol(a), symbol(b)) 上述两行代码将正常工作,基于对construct函数中的参数进行

基本上我的问题如下

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

'union(symbol(a), symbol(b))'
在此字符串中找到的函数形式实际上存在于名为RegExTree的对象类中。此外,该类还包含一个使用函数“construct()”构建树数据结构的函数,如下所示:

tree = RegExTree()    
tree.construct(union(symbol(a), symbol(b))
上述两行代码将正常工作,基于对construct函数中的参数进行解析来构建树。我想以类似的方式传递字符串,也许这行代码说明了我想要的:

tree = RegExTree()      
expression = 'union(' + 'symbol(' + 'a' + ')' + ', ' +  'symbol(' + 'b' + ')' + ')'
tree.construct(expression)
现在,按照上面编写代码的方式,它会产生一个错误(在Linux终端中),如下所示:

$ Attribute Error: 'str' object has no attribute 'value'
可以强制Python将字符串解释为有效的参数/代码行。本质上,不是作为字符串,而是作为对象构造函数

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

编辑:使用Michael在下面提出的涉及“eval()”的解决方案,有一种方法可以将其转换为表单:

tree = RegExTree()
a = 'a'
b = 'b'    
expression = 'union(' + 'symbol(' + a + ')' + ', ' +  'symbol(' + b + ')' + ')'
tree.construct(eval(expression))
有更好的方法吗?或者只是我的输出本质上是表示函数的字符串不是一个好主意?
[感谢martineau对我的解决方案编辑的更正!]

您可以使用python内置语句

不过要提醒一下。。。您不希望对作为用户提供的外部输入进入程序的字符串运行
eval()
。这可能会造成一个安全漏洞,您的程序的用户可以在其中运行自己设计的任意Python代码

在您的示例中,它看起来像这样:

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

您可以使用
eval
函数对字符串中的表达式求值,但这有点像后门。也许有更好的办法。您实际想要完成什么?为什么您的函数返回字符串?您应该传递函数。计算字符串可能不是这样做的方法。创建字符串输出的算法本质上是递归的,其目的是生成一个完全随机的“正则表达式”,格式如我上面所示[即并集(x,y)表示xuy)。本质上,对于函数中的每个参数点,这可能是另一个函数调用。例如:union(x,y)可能是x=union(a,b)和y=star(c),产生union(union(a,b),star(c))。您仍然可以使用以下内容:
def lazy_apply(x,*args):返回lambda:x(*args)
在不切换到字符串的情况下构造复杂对象。在编辑过程中,您真正需要做的就是
a='a'
b='b'
使其工作(假设这些是调用
symbol()
时希望
a
b
的值)。这是一个好主意!几乎成功了,但它似乎不像参数char a或char b,但是,现在我得到了错误:$NameError:name a没有定义,实际上,您的解决方案可以工作,但需要稍加修改,我将在上面的问题中作为编辑发布。为什么不直接编写
expression='union(symbol(a),symbol(b)“
?请注意,在调用
eval()
之前,必须定义所有使用的名称:
union
symbol
a
b
,否则将引发
namererror
异常。另一个选项(但要做的工作稍微多一些)是,不构建字符串,而是构建AST节点(请查看)并将其编译为代码对象,然后在需要时传递/调用它。。。