避免复制粘贴和硬编码的最佳方法

时间:2016-07-28 08:10:40

标签: python design-patterns

'您好,SO社区。

问题:我有很多regEx模式,例如

r'to.*school', r'built.*in'

等等。在每种情况下,我都应该执行一个因情况而异的代码。

示例:如果模式是。* school',我想在'之前找到动词。这就是为什么我写这样的东西:

for num, part in enumerate(sentence):
    if part == 'to':
        result = sentence[num-1]

如果在'中构建了*。我希望找到时间,这就是为什么我写下这样的内容:

for num, part in enumerate(sentence):
    if part == 'in':
        result = sentence[num+1]

因此存在问题 - 如果有超过500种模式且每种模式都有自己的方法来获取结果,我如何避免复制粘贴代码?

我的想法:我知道它应该是某种存储模式和解决方案的数据库,但如果它是一个字符串,我该如何执行解决方案?我完全迷失了。

1 个答案:

答案 0 :(得分:1)

如果代码中有足够的规律性,你需要编写一个接受句子的函数和决定如何处理它的其他东西。这有时称为参数化。例如,使用您的上述(可能是简化的示例),您就拥有

def process(sentence, parttest, offset):
    for num, part in enumerate(sentence):
        if part == parttest:
            return sentence[num+offset]

分别要求第一和第二个例子

result = process( sentence, 'to', -1)
result2 = process( sentence, 'in', +1)

现在您可以从数据库中获取参数(parttest,offset)。从您的帖子判断,也可能有一个正常的表达式,以字符串形式从数据库中检索,并process扩展为包括一个按需编译的正则表达式字符串。

稍后进行优化:在dict中保留已编译的正则表达式的本地缓存,或者对它们进行pickle,因为重复编译同一个可能是一个非常浪费的CPU。

希望这有帮助。