使用regex避免if-elifs

2024-09-28 01:29:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Python新手,我用Python做了一个很难看的put-this-tabular-data-into-a-db转换。程序查看数据,在MySQL中创建一个表,然后将数据读入表中。在本节中,检查标题行文本以决定数据类型。我有一个想法,我可以很聪明,用一个regex而不是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)]

Tags: 数据retxtiddataifputdef
2条回答

当然,你得到的是data-driven programming。一般来说,它是一种好的样式,因为它允许您轻松地进行更改,而不必担心代码部分的重复。你知道吗

就性能而言,它不太可能有太大的区别;重要的是,它比备选方案更具可读性和可维护性。你知道吗

我同意@ecatmur的回答;我只是想发布一些对注释来说有点太长的代码建议。你知道吗

没有必要做re.search(re.compile('...', re.IGNORECASE), header_text)。相反,您可以直接将字符串作为re.search('...', header_text, re.IGNORECASE)传入。如果您反复使用同一个regex,re.compile会更快,但是re.search如果您不使用,朋友会为您调用它

尽管我不认同Colin对命名lambdas的蔑视(因为它们仍然是一行而不是两行,所以很方便),但这里根本不需要内部函数:

return colspecs[max(m.groups()).lower() if m else 'def']

如果只创建一个捕获组而不是四个:'(ID|Date|Comments|Flag)$',那么max(m.groups())技巧也是不必要的。然后你可以做m.group(1)。你知道吗

相关问题 更多 >

    热门问题