丑陋代码:有趣的评论?

1 投票
2 回答
566 浏览
提问于 2025-04-15 16:16

这是我正在试验的一段代码,按理说它不应该被公开。我会在合并到我的项目之前对它进行重构和清理。

不过,它似乎是有效的,而我在写这段代码的时候正好在听阿尔洛·古斯里(Arlo Guthrie)的音乐。

#!/usr/bin/env python
import re

expr = re.compile(r'\[[0-9][-0-9,[]*\]')
def range2list(s):
    '''Given [x-y,a,b-c] return: range(x,y) + [a] + range(b,c)
       Handle decrements and zero-filling if necessary.

    '''
    assert s.startswith('[') and s.endswith(']') and len(s) > 2
    results = []
    r = s[1:-1]  # extract from enclosing brackets
    for i in r.split(','):  # each p
        if '-' not in i:
            results.append(i)
            continue
        # Else: (it's a range
        t = i.split('-')
        if len(t) != 2:   # punt on degenerate expressions
            results.append(i)
            continue
        # Else:
        if len(t[0]) > 1 and t[0].startswith('0'):
            fmt = "%%0%sd" % len(t[0])  ## Handle zero fill
        else:
            fmt = "%s"
        try:
            l, u = int(t[0]), int(t[1])
        except ValueError:  # punt on stuff that can't be converted
            results.append(i) # remember i? There's a song about i.
            continue
        if l > u:
            step=-1
        else:
            step=1
        results.extend([fmt % x for x in range(l,u,step)])
    return results 

... 还有一个测试套件:

if __name__ == '__main__':
    import sys
    testcases = [ '[0-5]', '[1]', '[1,2,3]', '[1-3,01-3,9,9-7]',
                  '[01-20]', '[020-1]', '[a,b,c,9-]' ]
    for i in testcases:
        print 
        print  'range2list(%s)' % i
        print "\t" + ' '.join(range2list(i))

... 这段代码的输出是:

range2list([0-5])
    0:1:2:3:4

range2list([1])
        1

range2list([1,2,3])
        1:2:3

range2list([1-3,01-3,9,9-7])
        1:2:01:02:9:9:8

range2list([01-20])
        01:02:03:04:05:06:07:08:09:10:11:12:13:14:15:16:17:18:19

range2list([020-1])
        020:019:018:017:016:015:014:013:012:011:010:009:008:007:006:005:004:003:002

range2list([a,b,c,9-])
        a:b:c:9-

我真的不喜欢里面那一团糟(尤其是在我写下“记住 i,有一首歌是关于 i 的。”的地方)。

等我把这段代码整理好后,我会把它合并成一个函数,用来扩展主机名范围模式(比如 ww[020-040,091,099].sfarm.mycorp.com ... 之类的)。其实这里显示的编译正则表达式是另一个函数的一部分,它从字符串中提取 [...] 表达式以便扩展。

所以,我有几个问题:

  • 我该如何整理这段代码呢?
  • 你见过的代码注释中,最有趣、最冷门、最搞笑的音乐引用是什么?
  • 有没有人写过类似的解析器/扩展器?用 Python 的?还有其他人会用这种东西吗?值得单独发布吗?
  • 还有什么其他的语法会更合理呢?比如 '{0:9,12,23,090:099}'?而不是用 -?

2 个回答

1

我在这里发布了一个用于这种格式的解析器 链接

4

如果你能把现在的 a-b 语法(这看起来很容易被负数搞混!)换成 a:b,那么 Python 的切片语法就会帮你处理这些了。这样你最终会得到一个包含切片和标量的元组(比如通过一个假类和索引方法来实现):

>>> class x(object):
...   def __getitem__(self, x): return x
... 
>>> x()[2, 3:6, 4]
(2, slice(3, 6, None), 4)

然后你可以顺序处理这个元组,来生成你想要的结果(通过不断地添加到一个最开始是 [] 的列表中,或者适当地扩展它)。

撰写回答