sol*_*les 4 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]
Run Code Online (Sandbox Code Playgroud)
但是,我经常遇到更多冗长的实现,如下所示:
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])
Run Code Online (Sandbox Code Playgroud)
当for loop只查看一个数据结构(例如myList[])时,通常会有一个简单的列表推导语句,它等同于循环.
考虑到这一点,是否有一个重构工具将详细的Python循环转换为简明的列表理解语句?
之前的 StackOverflow 问题已经询问有关将循环转换为列表理解的建议.但是,我还没有找到一个关于自动将循环转换为列表推导表达式的问题.
动机:有很多方法可以回答"代码清洁意味着什么?"这个问题.就个人而言,我发现使代码简洁并摆脱一些漏洞往往会使代码更清晰,更易读.当然,在"简洁代码"和"难以理解的单行代码"之间存在着一条线.尽管如此,我仍然觉得编写和使用简洁的代码令人满意.
2to3是一个可以执行任意重构的重构工具,只要您可以使用语法模式指定它们.您可能想要寻找的模式是这样的
VARIABLE1 = []
for VARIABLE2 in EXPRESSION1:
if EXPRESSION2:
VARIABLE1.append(EXPRESSION3)
Run Code Online (Sandbox Code Playgroud)
这可以安全地重构
VARIABLE1 = [EXPRESSION3 for VARIABLE2 in EXPRESSION1 if EXPRESSION2]
Run Code Online (Sandbox Code Playgroud)
在您的具体示例中,这将给出
bigNumbers = [myList[i] for i in xrange(0, len(myList)) if myList[i] > 10]
Run Code Online (Sandbox Code Playgroud)
然后,您可以进行另一次重构,将xrange(0,N)替换为xrange(N),另一次重新替换xrange(N)
[VARIABLE1[VARIABLE2] for VARIABLE2 in xrange(len(VARIABLE1)) if EXPRESSION1]
Run Code Online (Sandbox Code Playgroud)
同
[VARIABLE3 for VARIABLE3 in VARIABLE1 if EXPRESSION1PRIME]
Run Code Online (Sandbox Code Playgroud)
这个重构有几个问题:
EXPRESSION1PRIME必须EXPRESSION1与VARIABLE1[VARIABLE2]VARIABLE3取代所有出现的事件
.这可以使用2to3,但需要显式代码才能进行遍历和替换.EXPRESSION1PRIME那么一定不能再包含了
VARIABLE1.这也可以使用显式代码进行检查.x; 没有合理的方法可以自动完成.您可以选择回收VARIABLE1(即i),但这可能会令人困惑,因为它表明它i仍然是一个索引.它可能适用于选择合成名称,例如VARIABLE1_VARIABLE2(ie myList_i),并检查是否未使用.iter(VARIABLE1).这是不可能自动执行此操作.如果你想学习如何编写2to3 修复工具,请看一下Lennart Regebro的书.
| 归档时间: |
|
| 查看次数: |
1573 次 |
| 最近记录: |