我有一个SQL字符串,例如
SELECT * FROM benchmark WHERE xversion = 1.0
实际上,xversion是别名变量,而self.alias具有所有别名信息,如
{'CompilationParameters_Family': 'chip_name', 'xversion': 'CompilationParameters_XilinxVersion', 'opt_param': .... 'chip_name': 'CompilationParameters_Family', 'CompilationParameters_Device': 'device'}
使用此别名,我应该将字符串更改为如下。
SELECT * FROM benchmark WHERE CompilationParameters_XilinxVersion = 1.0
对于这一变化,我想出了以下内容。
def processAliasString(self, sqlString):
components = sqlString.split(' ')
resList = []
for comp in components:
if comp in self.alias:
resList.append(self.alias[comp])
else:
resList.append(comp)
resString = " ".join(resList)
return resString
但是,我希望更好的代码不使用for循环。你觉得怎么样?
答案 0 :(得分:1)
这应该这样做:
def processAliasString(self, sqlString):
return ' '.join(self.alias.get(comp, comp) for comp in sqlString.split(' '))
答案 1 :(得分:1)
如果您可以更改输入字符串的格式,以使替换更清晰可见,例如
s = 'SELECT * FROM benchmark WHERE %(xversion)s = 1.0'
然后s % self.alias
就足够了(根据您最喜欢的格式化语法和Python级别,还有其他一些替代方案可用)。
如果输入字符串格式为“nailed down”,re
可以提供帮助,因为它提供了识别字边界的便利性(因此,如果缺少其他无关紧要的空间,您将不会意外错过替换)例如在xversion
之后。考虑(s
具有其原始形式,并且可替代地随意地与不可替代的混合):
import re
sre = re.compile('|'.join(r'\b%s\b' % re.escape(s) for s in self.alias))
def repl(mo):
return self.alias[mo.group()]
news = sre.sub(repl, s)
这些方法很快,因为%
- 格式化和re
s'sub
非常适合此类任务。