我是Python的新手,我正在使用它来做一个丑陋的小小的put-this-tabular-data-into-a-db转换。程序查看数据,在MySQL中创建表,然后将数据读入表中。在本节中,将检查标题行文本以对数据类型做出一些决定。我有一个想法,我可以聪明,用一个正则表达式而不是if / elifs来做到这一点。我的解决方案至少适用于这种情况,我不必担心多个匹配。我要问的是,这种方法在效率方面有什么真正的优点吗?
def _typeMe(self, header_txt):
# data typing
colspecs = {
'id':'SMALLINT(10)',
'date':'DATE',
'comments':'TEXT(4000)',
'flag':'BIT(1)',
'def':'VARCHAR(255)'
}
# regex to match on header text e.g. 'Provisioner ID'
r = re.search(re.compile('(ID$)|(Date)|(Comments$)|(FLAG$)', re.IGNORECASE), header_txt)
checktype = lambda m: max(m.groups()).lower() if m else 'def'
return colspecs[checktype(r)]
答案 0 :(得分:2)
绝对;你得到的是data-driven programming。一般来说它的风格很好,因为它允许您轻松地进行更改,而不必担心重复代码段。
就性能而言,它不太可能产生太大影响;重要的是,它比其他选择更容易可读和更多可维护。
答案 1 :(得分:1)
我同意@ ecatmur的回答;我只想发布一些有点太长的评论建议。
没有必要re.search(re.compile('...', re.IGNORECASE), header_text)
。相反,您可以直接将字符串传递为re.search('...', header_text, re.IGNORECASE)
。如果你反复使用相同的正则表达式,re.compile
会更快,但re.search
和朋友会为你调用它,如果你没有。
虽然我不同意Colin对名为lambdas的蔑视(它可能只是因为它们仍然是一行而不是两行),所以你根本不需要内部函数:
return colspecs[max(m.groups()).lower() if m else 'def']
如果您只创建一个捕获组而不是四个捕获组,则不需要max(m.groups())
技巧:'(ID|Date|Comments|Flag)$'
。然后你可以m.group(1)
。