3

我是 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)]
4

2 回答 2

2

绝对地; 你所拥有的是所谓的数据驱动编程。一般来说,这是一种很好的风格,因为它允许您轻松进行更改,而不必担心重复代码部分。

就性能而言,它不太可能产生太大影响。重要的是它比替代方案更具可读性可维护性。

于 2012-07-31T16:33:56.453 回答
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)

于 2012-07-31T17:32:36.223 回答