Рефакторинг понимания списка с несколькими условиями - PullRequest
1 голос
/ 18 апреля 2019
def detect_long_method(directory):
    path, dirs, files = next(os.walk(directory))
    output = lm.output_long_methods(directory)
    # print (output.stdout)
    split_lines = output.splitlines()
    output_lines = [output.decode('utf-8') for output in split_lines if len(output) > 3 and\
                    ('R0915' in output.decode('utf-8') or 'R0913' in output.decode('utf-8') or 'R0912' in output.decode('utf-8') or \
                    'R0904' in output.decode('utf-8') or 'R0902' in output.decode('utf-8'))]

    return output_lines

Эта функция выполняет команду командной строки, получает стандартный вывод и назначает его переменной output. Он разбивается на строки с помощью функции .splitlines().

В output_lines он проверяет, содержит ли каждая строка (в байтах) слово R0915..etc., и если длина строки превышает 3, то, наконец, преобразует их в строку.

Однако, это довольно медленно, и я чувствую, что есть способ написать это более аккуратно и более эффективно.

Любая помощь?

1 Ответ

2 голосов
/ 18 апреля 2019

Вот более эффективный скрипт:

import os
import re

def detect_long_method(directory):
    path, dirs, files = next(os.walk(directory))
    output = lm.output_long_methods(directory).decode('utf-8')
    # print (output.stdout)
    split_lines = output.splitlines()
    output_lines = [output for output in split_lines if len(output) > 3 and\
                    re.search("(R0915|R0913|R0912|R0904|R0902)", output) is not None]
    return output_lines

Как предложил juanpa.arrivillaga, использование регулярных выражений и однократный вызов decode('utf-8') должны привести к ускорению выполнения.

...