Автоматическое упрощение / рефакторинг кода Python (например, для циклов -> понимание списка)?

В 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[] только одну структуру данных (например, myList[] ), обычно существует простой отчет о понимании списка, который эквивалентен циклу.
Имея это в виду, есть ли инструмент рефакторинга, который преобразует многословные циклы Python в краткие заявления о понимании списка?


Предыдущие вопросы StackOverflow просили совета по преобразованию циклов в понимание списка. Но мне еще предстоит найти вопрос о автоматическом преобразовании циклов в выражения для понимания списков.


Мотивация. Существует множество способов ответить на вопрос: «Что значит, чтобы код был чистым?» Лично я считаю, что сделать код кратким и избавиться от некоторых пухов, как правило, делает код более понятным и понятным. Естественно, в песке есть линия между «кратким кодом» и «непонятными однострочными». Тем не менее, я часто нахожу, что это удовлетворительно писать и работать с кратким кодом.

    One Solution collect form web for “Автоматическое упрощение / рефакторинг кода Python (например, для циклов -> понимание списка)?”

    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 (0, N) на xrange (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, взгляните на книгу Леннарта Регебро .

    Python - лучший язык программирования в мире.