gpt4 book ai didi

python - 丑陋的代码 : Amusing comment?

转载 作者:太空宇宙 更新时间:2023-11-04 09:21:43 25 4
gpt4 key购买 nike

这是我正在制作原型(prototype)的一段代码,从各方面来看,它应该永远不会出现。在将其合并到我的项目中之前,我将对其进行重构和清理。

但是,它似乎在工作,而且我在工作时碰巧正在听 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-

我真的不喜欢里面乱七八糟的东西(尤其是在我写评论“记住我,有一首关于我的歌。

当我把它清理干净后,我会将它合并到一个扩展主机名范围模式的函数中(ww[020-040,091,099].sfarm.mycorp.com ... 等等)。 (实际上,此处显示的编译正则表达式是其他函数的一部分,它从字符串中提取 [...] 表达式以进行扩展)。

所以,我的问题:

  • 我怎样才能收拾这个烂摊子?
  • 您在源代码评论中看到的最有趣、最晦涩、最有趣等音乐引用是什么?
  • 有没有人写过一个解析器/扩展器已经做了类似的事情?在 Python 中?其他人会使用这样的东西吗?是否值得单独提供?
  • 哪些替代语法有意义? '{0:9,12,23,090:099}'? .. 而不是 -?

最佳答案

如果您可以将当前的 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)

您可以按顺序处理该元组以产生您想要的结果(通过连续附加或适当扩展以 [] 开头的列表)。

关于python - 丑陋的代码 : Amusing comment?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1780721/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com