自动简化/重构Python代码(例如for循环 - > list comprehension)?

时间:2013-01-25 07:48:44

标签: python refactoring list-comprehension simplify automated-refactoring

在Python中,我非常喜欢使用列表理解时实现的简洁性。我喜欢简洁的列表理解:

myList = [1, 5, 11, 20, 30, 35] #input data
bigNumbers = [x for x in myList if x > 10]

但是,我经常会遇到更多详细的实现:

myList = [1, 5, 11, 20, 30, 35] #input data
bigNumbers = []
for i in xrange(0, len(myList)):
    if myList[i] > 10:
        bigNumbers.append(myList[i])

for loop只查看一个数据结构(例如myList[])时,通常会有一个简单的列表推导语句,它等同于循环。
考虑到这一点,是否有重构工具将详细的Python循环转换为简明的列表理解语句?


Previous StackOverflow questions已经请求将循环转换为列表理解的建议。但是,我还没有找到关于自动将循环转换为列表理解表达式的问题。


动机:有很多方法可以回答“代码清洁意味着什么?”就个人而言,我发现使代码简洁并摆脱一些漏洞往往会使代码更清晰,更易读。当然,在“简洁代码”和“难以理解的单行代码”之间存在着一条线。尽管如此,我仍然觉得编写和使用简洁的代码令人满意。

1 个答案:

答案 0 :(得分:5)

2to3是一个可以执行任意重构的重构工具,只要您可以使用语法模式指定它们即可。您可能想要查找的模式是

VARIABLE1 = []
for VARIABLE2 in EXPRESSION1:
    if EXPRESSION2:
        VARIABLE1.append(EXPRESSION3)

这可以安全地重构为

VARIABLE1 = [EXPRESSION3 for VARIABLE2 in EXPRESSION1 if EXPRESSION2]

在您的具体示例中,这将给出

bigNumbers = [myList[i] for i in xrange(0, len(myList)) if myList[i] > 10]

然后,你可以进行另一次重构,用xrange(N)替换xrange(0,N), 和另一个取代

[VARIABLE1[VARIABLE2] for VARIABLE2 in xrange(len(VARIABLE1)) if EXPRESSION1]

[VARIABLE3 for VARIABLE3 in VARIABLE1 if EXPRESSION1PRIME]

这种重构有几个问题:

    所有出现时,
  • EXPRESSION1PRIME必须为EXPRESSION1 VARIABLE1[VARIABLE2]替换为VARIABLE3。这是可能的 2to3,但需要显式代码才能进行遍历和替换。
  • EXPRESSION1PRIME则不得再包含任何内容 VARIABLE1。这也可以使用显式代码进行检查。
  • 需要为VARIABLE3提供一个名称。你选择了x; 没有合理的方法可以自动完成。你可以 我选择回收VARIABLE1(即i),但这可能令人困惑 因为它表明i仍然是一个索引。它可能适用于选择合成材料 名称,例如VARIABLE1_VARIABLE2(即myList_i),并检查是否 那是没有用的。
  • 需要确保VARIABLE1 [VARIABLE2]产生的效果与您相同 使用iter(VARIABLE1)时。这是不可能自动完成的。

如果您想了解如何编写2to3修复程序,请查看Lennart Regebro's本书。