2016-06-21 92 views
-2

我创建一个字符串,打印列表中的字段。该领域应该由“;”分隔,代码片段看起来像这样(简化代码,而不是实际的)exec with';'在python

list = ["abc","xyz","pqr"] 
str = "print " + "list[0]" + ";" + "list[2]" # This is dynamically generated 
exec (str) 

我在这里的问题是,与exec语句,它打印因为分号的只有“XYZ”, 。什么是解决这个的最好方法,从而使exec语句打印 “XYZ;焊接工艺评定”

+1

这似乎是一个真正的不必要使用EXEC的...你确定你需要它而不是字符串格式? – mgilson

回答

4

您生成下面的代码:

print list[0];list[2] 

请注意,;未引用。由于Python使用;来分隔一行上的多个简单语句,所以Python首先执行print list[0],然后执行list[2](最终不做任何事情)。

你不得不代替生成验证码:

print list[0] + ';' + list[2] 

,你可以用做:

str = "print " + "list[0]" + " + ';' + " + "list[2]" 

但是,你不应该使用的代码生成在所有。使用标准的Python方法来加入或格式化字符串。你可以使用str.format()

print '{};{}'.format(list[0], list[2]) 

或者你可以使用str.join()

print ';'.join([list[0], list[2]]) 

如果你必须改变是基于一些其他变量是什么代码执行,尽量避免exec依然。您可以使用from __future__ import print_function或将print语句封装在新函数中,然后动态调用函数。例如,您总是可以使用dispatch table将字符串映射到要调用的函数。

0

试试这个:

str = "print" + "list[0]" + "';'" + "list[2]" 

str = "print" + "list[0]" + "/;" + "list[2]" 
0

这里的问题是,Python可以选择允许分号分隔两个单独的语句(Compound statements)。因此,当您在评估语句print "abc";"xyz"上使用exec时,Python认为它们是两个单独的语句,因此只有print ing​​。

你可以使用单引号括起来的分号,以表明它是一个字符串,并与他们周围的字符串将它们连接起来:

# Refrain from using list and str as they are built-ins 
l = ["abc", "xyz", "pqr"] 
s = "print " + "l[0]" + "+';'+" + "l[2]" 
exec(s)