HW8 | Питон и КИЛИ

Домашнее задание

Дедлайн: 29 января 23:59:59


Мета-задачка на 8 баллов

Пусть у вас есть текстовый файл с кодом на питоне.

Напишите функцию inspect_func, которая принимает на себя название файла с кодом на питоне и название выходного файла.

В свою очередь программа должна найти в коде все функции (давайте считать, что все по pep-8, то есть после запятых есть пробелы, перед скобками нет пробела и тд, а также нет всяких слэшей, звездочек, типизации…), получить вот такой словарь

{
    'fancy_function': {
        'args': ['first_arg', 'second_arg'],
        'kwargs': {
            'third_arg': 'value3',
            'fourth_arg': 'value4'
            }
    }
}

и записать его в формате JSON в указанный выходной файл.

Если у функции нет позиционных аргументов, то для нее будет 'args': [], аналогично, если нет именованных, то будет 'kwargs': {}.

В примере args – это позиционные аргументы функции, а kwargs – это именованые. Более поняный пример:

def func(a, b, c=1):
    ...

превратится в

{
    "func": {
        "args": ["a", "b"],
        "kwargs": {
            "c": 1
        }
    }
}

Значениями именованных аргументов (кваргов) могут быть только числа и строки из латинских букв/цифр.

Найдите где-нибудь (или напишите сами) код, который содержит минимум 3 различные функции (желательно, чтобы покрывало все возможные случаи с args/kwargs), обработайте файл с помощью написанной программы и положите результат в файл output.json.

Оценка за задание будет складываться следующим образом:

  • (2 балла) Решение оформлено в виде функции inspect_func и дает корректный результат хотя бы при наличии одной функции в файле.
  • (2 балла) Код корректно работает для любого количества функций в текстовом файле, в том числе 0.
  • (3 балла) К домашке приложен найденных или написанный пример кода, на котором проверялось решение, также приложен ответ в файле output.json, соответствующий входному файлу.
  • (1 балла) В работе учтены случаи, когда у функции нет позиционных или именованных аргументов, либо того и другого.

Задача еще на 2 балла

WARNING!!! Задачу надо решать через рекурсию. Без рекурсии приниматься не будет.

Представьте, что у вас есть последовательность команд.

В примере ниже с долларом в начале указаны команды, а без доллара – их вывод.

Вы уже немножечко знаете, как работать с консолькой, но напомним, что

  • cd x – позволяет перейти в директорию x. Если написано cd /, то это означает “перейти в корень”, если cd .., то вернуться на папку назад
  • ls – выводит, что находится в текущей директории
$ cd /
$ ls
dir a
14848514 b.txt
8504156 c.dat
dir d
$ cd a
$ ls
dir e
29116 f
2557 g
62596 h.lst
$ cd e
$ ls
584 i
$ cd ..
$ cd ..
$ cd d
$ ls
4060174 j
8033020 d.log
5626152 d.ext
7214296 k

Для упрощения будем считать, что если пользователь вводит команду ls, то ему выводится список папкок и файлов. Если это папка, то она будет указана в формате dir a, если файл, то в формате 12345 x, где x – название, а 12345 – размер (в байтах).

Пример выше для удобства можно представить в виде дерева.

- / (dir)
  - a (dir)
    - e (dir)
      - i (file, size=584)
    - f (file, size=29116)
    - g (file, size=2557)
    - h.lst (file, size=62596)
  - b.txt (file, size=14848514)
  - c.dat (file, size=8504156)
  - d (dir)
    - j (file, size=4060174)
    - d.log (file, size=8033020)
    - d.ext (file, size=5626152)
    - k (file, size=7214296)

Итак, вам нужно найти все директории, размер которых не больше 100000 и получить их сумму. В примере выше, это директории a и e. Получится 94853 + 584 = 95437.

Ссылка на файл, на который надо получить ответ: тык. Ответ можете написать комментарием в коде, либо отдельным файлом.

Важно

Задачи как обычно сдавайте на гитлаб в отдельную папку.