1

Тема: Допомога з рефакторингом скрипта

Привіт, задали на лабораторну відрефакторити скрипт, як він працює зрозумів, але мої знання пайтону не дозволяють зробити максимально компактним і зрозумілим, що міг зробив, підскажіть будь ласка, в якому місці можно ще щось змінити, буду вдячний.

#!/usr/bin/env python3

from itertools import combinations
from random import shuffle
from functools import partial
from math import ceil
from pathlib import Path
from transliterate import translit
from yaml import safe_load

translit = partial(translit, language_code='uk', reversed=True)

def parse_students(filename, lang='uk'):
    with open(filename) as f:
        dct = safe_load(f)
        dct = {translit(key): [(translit(v).replace(' ', '_'), v)
                               for v in values]
               for key, values in dct.items()}
        return dct


def read_questions(directory):
    pth = Path(directory)
    dct = {}
    for file in sorted(list(pth.glob('*.*'))):
        with open(file) as f:
            qst = f.read().strip().split('\n#')
            qst[1:] = ['#' + q for q in qst[1:]]
            dct[file.name] = qst

    return dct


def generate_questions(students, questions, *, numeach=2):
    sep = '=' * 30 + '\n'
    files = dict()
    for group, lst in students.items():
        for tr, orig in lst:
            files[f'{group}_{tr}.rst'] = f'{sep}{orig}\n{sep}\n'

    for catname, category in questions.items():
        print(f'{catname:<40}', end='\t')
        personal = list(combinations(category, numeach))
        print(f'{len(personal)} combinations')
        assert len(personal) >= len(files)
        shuffle(personal)
        for f in files:
            files[f] += '\n' + '\n'.join(personal.pop(0)) + '\n'

    return files


def write_files(outdir, files):
    odir = Path(outdir)
    odir.mkdir(exist_ok=True)
    for filename, contents in files.items():
        file = odir.joinpath(filename)
        with open(file, 'x') as f:
            f.write(contents)
        

if __name__ == '__main__':
    from sys import argv
    if len(argv) != 4:
        print(f'Usage\n{argv[0]} student_list questions_dir out_dir')
        exit(-1)
    student_list, questions_dir, out_dir = argv[1:]
    st = parse_students(student_list)
    q = read_questions(questions_dir)
    cont = generate_questions(st, q, numeach=2)
    write_files(out_dir, cont)

2 Востаннє редагувалося mamkin haker (24.01.2022 17:52:06)

Re: Допомога з рефакторингом скрипта

3

Re: Допомога з рефакторингом скрипта

Вам задали відрефакторити цей скрипт, чи це вже результат вашого рефакторінгу? У другому разі ви б не могли навести оригінал?

Подякували: 0xDADA11C71