4

파이썬에서는 목록 이해력을 사용할 때 구현이 얼마나 간결한지를 정말로 즐깁니다.파이썬 코드를 자동으로 단순화/리팩터링 (예 : 루프 -> 목록 이해)?

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

그러나, 나는 종종 더 자세한 이와 같은 구현 발생 : 나는 간결 지능형리스트이이해야 할 사랑 for loop가 하나 명의 데이터 구조 (예를 들어 myList[])를 통해 보이는 경우

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]) 

을,이 일반적으로 루프에 해당하는 간단한 목록 이해 문장.
이 점을 염두에두고, 자세한 파이썬 루프를 간결한 목록 이해 문장으로 변환하는 리팩토링 도구가 있습니까?


PreviousStackOverflowquestions는 지능형리스트로 루프를 변환에 대한 조언을 요청했다. 그러나 나는 아직 에 대한 질문을 찾기 위해 자동으로을 목록 이해력 표현으로 변환해야한다.


동기 부여 : "깨끗로 코드를 의미 하는가 무엇을" 질문에 대답하는 방법에는 여러 가지가 있습니다 개인적으로 코드를 간결하게 만들고 보풀을 제거하는 것이 코드를보다 명확하고 읽기 쉽게 만들어주는 경향이 있습니다. 당연히 모래 속에 "간결한 코드"와 "이해할 수없는 한 줄짜리"사이의 선이 있습니다. 여전히 간결한 코드로 작성하고 작업하는 것이 만족 스럽다는 것을 종종 알게됩니다.

+0

그게 내가하는 일이기도합니다. 불행히도, 나는 불필요하게 장황한 코드를 많이 보았다. 'xrange (0, len (myList)) '를'enumerate (myList)'로 대체하는 리팩토링 도구가 있습니까? 이 방법은 다른 사람의 코드를 정리하거나 지저분한 코드를 자습서에서 사용할 수있는 코드로 변환하려고 할 때 특히 유용합니다. – solvingPuzzles

+1

@AshwiniChaudhary 아니면 그냥 for my elelist in :를 사용하십시오. – jimhark

+1

'파이썬이란 무엇입니까? "범위 (len (seq))에있는 i의 경우 :"? No. "for obj in seq :"를 사용하십시오. – PaulMcG

답변

5

2to3은 구문 패턴으로 지정할 수있는 임의의 리펙토링을 수행 할 수있는 리팩터링 도구입니다. 당신이 보길 원하는 것일 수도 패턴이이

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

이, 이것은 다음

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

을 줄 것입니다 특정 예에서

VARIABLE1 = [EXPRESSION3 for VARIABLE2 in EXPRESSION1 if EXPRESSION2] 

안전하게 리팩토링 할 수있다, 당신은 할 수 있습니다 xrange (N)을 xrange (N)로 대체하는 다른 리펙토링, 및 다른 하나는

VARIABLE3로 대체 VARIABLE1[VARIABLE2]의 모든 항목에

  • EXPRESSION1PRIME해야 EXPRESSION1 :
    [VARIABLE1[VARIABLE2] for VARIABLE2 in xrange(len(VARIABLE1)) if EXPRESSION1] 
    

    [VARIABLE3 for VARIABLE3 in VARIABLE1 if EXPRESSION1PRIME] 
    

    와 함께 몇 가지 리팩토링에 문제가 있습니다. 2to3에서 가능하지만 순회 및 교체를 수행하는 데 명시적인 코드가 필요합니다.

  • EXPRESSION1PRIME 다음 더 이상 발생하지 않아야합니다 VARIABLE1. 이것은 명시 적 코드로 확인할 수도 있습니다.
  • VARIABLE3의 이름이 필요합니다. x을 선택했습니다. 이 작업을 자동으로 수행 할 수있는 합리적인 방법은 없습니다. 은 VARIABLE1 (즉, i)을 재활용하기로 선택했으나 i은 여전히 ​​색인임을 나타내는 것처럼 을 혼동스럽게 할 수 있습니다. VARIABLE1_VARIABLE2 (예 : myList_i)과 같이 합성 이름을 선택하고 그렇지 않으면 이 사용되지 않는지 확인하십시오.
  • iter(VARIABLE1)을 사용할 때 VARIABLE1 [VARIABLE2]이 (가) 을 얻는 것과 같아야합니다. 이 작업은 자동으로 수행 할 수 없습니다.

2to3 해결사를 쓰는 방법을 배우려면 Lennart Regebro's 책을 살펴보십시오.

+0

어째서 대문자인가? 그건 조금 미친 찾는 lol – jackcogdill

+3

나는 대문자 사용이 자명 한 것이기를 바랬다 : 그들은 자리 표시 자이고, 나머지는 구체적인 구문이다. –