Счетчик строк в файлах в заданном каталоге по заданным параметрам

Возникли затруднения со следующей задачей: Дописать код без использования конструкций if/for/while так, чтобы программа вычисляла количество строк кода в некотором каталоге. Застрял на моментах project_stats и total_number_of_lines (Вернуть общее число строк в файлах filenames), а также не могу сложить итоговую логику, чтобы на описанных инструкциях построить ход выполнения программы. Через какие приемы это можно сделать?

import os
import sys
import itertools

def project_stats(path, extensions):
    """
    Вернуть число строк в исходниках проекта.

    Файлами, входящими в проект, считаются все файлы
    в папке ``path`` (и подпапках), имеющие расширение
    из множества ``extensions``.
    """
    pass


def total_number_of_lines(filenames):
    """
    Вернуть общее число строк в файлах ``filenames``.
    """
    pass


def number_of_lines(filename):
    """
    Вернуть число строк в файле.
    """
    return sum(1 for line in open(filename,'r'))

def iter_filenames(path):
    """
    Итератор по именам файлов в дереве.
    """
    filenames = os.listdir(path)
    return filenames

def with_extensions(extensions, filenames):
    """
    Оставить из итератора ``filenames`` только
    имена файлов, у которых расширение - одно из ``extensions``.
    """
    return [map(lambda i: filenames + '/' + i, filter(lambda i: extensions[-1] in i, filenames)) for x in
            range(len(filenames))]


def get_extension(filename):
    """
    Вернуть расширение файла
    """
    extensions = os.path.splitext(filename)
    return extensions[-1]



def print_usage():
    print("Usage: python project_sourse_stats_3.py <project_path>")


#if __name__ == '__main__':
#    if len(sys.argv) != 2:
#        print_usage()
#        sys.exit(1)
#
#    project_path = sys.argv[1]
#    print(project_stats(project_path, {'.py'}))

Части кода (дописал) по отдельности работают, кроме пропущенных.

Буду очень благодарен за советы!


Ответы (1 шт):

Автор решения: Mmaxim

После некоторых поисков, получился следующий рабочий код без использования if/for/while. Может кому-нибудь пригодится.

import os
import sys
import itertools
import codecs

def project_stats(path, extensions):
    """
    Вернуть число строк в исходниках проекта.

    Файлами, входящими в проект, считаются все файлы
    в папке ``path`` (и подпапках), имеющие расширение
    из множества ``extensions``.
    """
    filenames = iter_filenames(path)
    filt_filenames = with_extensions(extensions, filenames)
    total_lines = total_number_of_lines(filt_filenames)
    print(total_lines)
    return total_lines

def total_number_of_lines(filenames):
    """
    Вернуть общее число строк в файлах ``filenames``.
    """
    total_lines = sum(map(number_of_lines, filenames))
    print(total_lines)
    return total_lines

def number_of_lines(filename):
    """
    Вернуть число строк в файле.
    """
    lines = sum(1 for line in codecs.open(filename, 'r', "utf_8_sig"))
    return lines


def iter_filenames(path):
    """
    Итератор по именам файлов в дереве.
    """
    file_list = [[os.path.join(root, name) for name in files] for root, dirs, files in os.walk(path)]
    filenames = [x for y in file_list for x in y]
    return filenames

def with_extensions(extensions, filenames):
    """
    Оставить из итератора ``filenames`` только
    имена файлов, у которых расширение - одно из ``extensions``.
    """
    filt_filenames = [file for file in filenames if file.endswith(extensions)]
    return filt_filenames

def get_extension(filename):
    """
    Вернуть расширение файла
    """
    extension = os.path.splitext(filename)[1]
    print(extension)
    return extension

def print_usage():
    print("Usage: python project_sourse_stats_3.py <project_path>")

# if __name__ == '__main__':
#     if len(sys.argv) != 2:
#         print_usage()
#         sys.exit(1)
#
#     project_path = sys.argv[1]
#     print(project_stats(project_path, {'.py'}))
→ Ссылка