Как обьединить код в питоне из нескольких модулей в один?

Код из файла Main

from datetime import datetime as dt
from data_valid import DataValid
from svv import CopmAKSH
from work_file import WorkFile

valid = DataValid()
svv = CopmAKSH()
wf = WorkFile()

intr_text = "Выберите действие:\n1 – Оценить риск осложнений после АКШ\n2 – Показать историю проведенных расчетов\n3 — Завершить работу с программой\n"

while True:
command = input(intr_text)
if command.isdigit():
    command = int(command)

    if command == 1:
        current_date = dt.now()

        fio = valid.input_fio()
        age_x1 = valid.input_age()
        lh_x2 = valid.input_lh()
        ca_x3 = valid.input_ca()
        hemo_x4 = valid.input_hemo()
        charls_x5 = valid.input_charleson()
        euro_score_x6 = valid.input_euro()
        other_x7 = valid.input_other_comp()
        dindo_x8 = valid.input_dindo()
        access_x9 = valid.input_sym_access()
        suture_x10 = valid.input_suture()

        res_risk = svv.calc_risk_comp(age_x1, lh_x2, ca_x3, hemo_x4, charls_x5, euro_score_x6, other_x7, dindo_x8, access_x9, suture_x10)
        if res_risk[1] == 1:
            res_text = "Прогнозируется наличие осложнений"
        else:
            res_text = "Осложнения маловероятны"
        print(f"Риск развития осложнений при АКШ: {res_risk[0]}\n{res_text}")
id = str(wf.get_last_index())
current_date_str = f"{current_date.year}-{current_date.month}-{current_date.day}"
        list_res = [id,  current_date_str, fio, str(res_risk[0]), res_text]
        list_res_str = ";".join(list_res)
        wf.save_note(list_res_str)

    elif command == 2:
        lines = wf.get_history()
        for el in lines:
            elem_str = el.split(";")
            elem_str[-1] = elem_str[-1].rstrip()
            print(" – ".join(elem_str))

    elif command == 3:
        break
else:
    print("Используйте команды")
    print(intr_text)

Код из файла Work_file

import os
class WorkFile:
def __init__(self):
    self.catalogy = "src"
    self.file = "src\data.csv"
    self.init_folder()
    self.init_save_file()

def init_folder(self):
    pres_folder = os.path.isdir(self.catalogy)
    if not pres_folder:
        os.mkdir(self.catalogy)

def init_save_file(self):
    pres_save = os.path.exists(self.file)
    if not pres_save:
        with open(self.file, 'w', encoding='utf-8') as f:
            f.write("id;Дата;ФИО;Результат оценки риска осложнений после АКШ;Оценка риска\n")

def save_note(self, note_str: str):
    with open(self.file, "a", encoding="utf-8") as f:
        f.write(note_str + "\n")

def get_last_index(self) -> int:
    with open(self.file, "r", encoding="utf-8") as f:
        lines = f.readlines()
        return len(lines)

def get_history(self) -> list:
    with open(self.file, "r", encoding="utf-8") as f:
        lines = f.readlines()
        if len(lines) == 1:
            return []
        else:
            lines.pop(0)
            lines.reverse()
            return lines

  Код из файла Svv

class CopmAKSH:
def calc_math_svv(self, x1: int, x2: int, x3: float | int, x4: int, x5: int, x6: float | int, x7: int, x8: int, x9: int, x10: int) -> int or float:
    """
    Расчет риска осложнений АКШ по математической формуле
    :param x1: возраст пациента (количество полных лет): int
    :param x2: легочная гипертензия (в мм.рт.ст.): int
    :param x3: степень поражения коронарных артерий (в %): float or int
    :param x4: принимает значения 1 или 0 (1 – кровотечение 1000 мл и более; 0 – кровотечение менее 1000 мл): int
    :param x5: значение индекса коморбидности Чарлсона: int
    :param x6: значение риска по системе EuroScore: float or int
    :param x7: принимает значения 1 или 0 (1 – есть другие осложнения; 0 – нет осложнений): int in [0, 1]
    :param x8: значение показателя классификатора хирургических осложнений Dindo: int in [1, 2, 3, 4]
    :param x9: принимает значения 1 или 0 (1 – несимметричный доступ; 0 – симметричный доступ): int in [0, 1]
    :param x10: принимает значения 1 или 0 (1 – швы наложены неправильно; 0 – швы наложены правильно): int in [0, 1]
    :return: возвращает значение расчета риска осложнений после АКШ
    """
    res = (0.80806 + (0.04355 * x1) - (0.07624 * x2) + (0.0245 * x3) - (1.366 * x4) - (1.4601 * x5) - (0.30636 * x6) - (1.37319 * x7) - (0.34939 * x8) - (0.94 * x9) - (1.46815 * x10))
    return res

def assess_risk_comp(self, calc_risk: float or int) -> int:
    if calc_risk > -0.650215:
        return 0
    else:
        return 1

def calc_risk_comp(self, x1: int, x2: int, x3: float | int, x4: int, x5: int, x6: float | int, x7: int, x8: int, x9: int, x10: int) -> tuple[int | float, int]:
    calc_risk = self.calc_math_svv(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10)
    res_risk = self.assess_risk_comp(calc_risk)
    return calc_risk, res_risk

Код из файла Data_valid

class DataValid:
def input_strip(self, text: str) -> str:
    res = input(text)
    return res.strip()

def valid_fio(self, fio: str) -> bool:
    while "  " in fio:
        fio = fio.replace("  ", " ", 999)
    len_fio = len(fio.split(" "))
    if len_fio in (2, 3, 4):
        return True
    else:
        return False

def input_fio(self) -> str:
    fio = self.input_strip("Введите ФИО:\n")
    res_fio = self.valid_fio(fio)
    while not res_fio:
        fio = self.input_strip("Проверьте правильность ФИО и введите еще раз (должно содержать Фамилию и Имя, Отчество при наличии):\n")
        res_fio = self.valid_fio(fio)
    else:
        return fio

def valid_age(self, age: str) -> bool:
    if age.isdigit():
        age = int(age)
        if age > 0:
            return True
        else:
            return False
    else:
        return False


def input_age(self) -> int:
    age = self.input_strip("Введите Возраст:\n")
    res_age = self.valid_age(age)
    while not res_age:
        age = self.input_strip("Проверьте правильность введенного возраста и введите его ещё раз (должно быть целым значением больше нуля):\n")
        res_age = self.valid_age(age)
    else:
        return int(age)


def valid_lh(self, lh_str: str) -> bool:
    if lh_str.isdigit():
        lh_str = int(lh_str)
        if lh_str > 0:
            return True
        else:
            return False
    else:
        return False


def input_lh(self) -> int:
    lh_str = self.input_strip("Введите давление в легочной артерии в мм рт ст:\n")
    res_lh = self.valid_lh(lh_str)
    while not res_lh:
        lh_str = self.input_strip("Проверьте правильность введенного легочного давления и введите повторно целым числом:\n")
        res_lh = self.valid_lh(lh_str)
    else:
        return int(lh_str)

def valid_ca(self, ca_str: str) -> float or int:
    if ca_str.isdigit():
        ca_str = int(ca_str)
        if ca_str >= 0 and ca_str <= 100:
            return True
        else:
            return False
    else:
        return False


def input_ca(self) -> float:
    ca_str = self.input_strip("Введите % поражение коронарных артерий:\n")
    res_ca = self.valid_ca(ca_str)
    while not res_ca:
        ca_str = self.input_strip("Проверьте правильность введенного поражения коронарных артерий (% от 1 до 100) и введите его повторно:\n")
        res_ca = self.valid_lh(ca_str)
    else:
        return int(ca_str) / 100


def valid_0_or_1(self, numer_srt: str) -> bool:
    if numer_srt.isdigit():
        numer = int(numer_srt)
        if numer in (0, 1):
            return True
    return False

def input_hemo(self) -> int:
    hemo_str = self.input_strip("Введите степень кровопотери:\n")
    res_hemo = self.valid_0_or_1(hemo_str)
    while not res_hemo:
        hemo_str = self.input_strip("Проверьте правильность введенных кровопотерь и введите значение 1 или 0 (1 – кровотечение 1000 мл и более; 0 – кровотечение менее 1000 мл):\n")
        res_hemo = self.valid_0_or_1(hemo_str)
    else:
        return int(res_hemo)

def valid_charleson(self, index_str: str) -> bool:
    if index_str.isdigit():
        index_str = int(index_str)
        if index_str >= 0:
            return True
        else:
            return False
    else:
        return False


def input_charleson(self) -> int:
    charls = self.input_strip("Введите значение индекса коморбидности Чарлсона;:\n")
    res_charls = self.valid_charleson(charls)
    while not res_charls:
        charls = self.input_strip("Проверьте правильность введенного индекса коморбидности Чарлсона:\n")
        res_charls = self.valid_charleson(charls)
    else:
        return int(charls)

def valid_numer_float(self, numer_str: str) -> bool:
    numer_str = numer_str.replace(",", ".")
    if numer_str.count(".") == 1:
        if numer_str.replace(".", "").isdigit():
            return True
        return False
    elif numer_str.count(".") == 0:
        return True
    else:
        return False

def input_euro(self) -> float or int:
    euro_str = self.input_strip("Введите значение EuroScore:\n")
    res_euro = self.valid_numer_float(euro_str)
    while not res_euro:
        euro_str = self.input_strip("Проверьте правильность введенного значение EouroRisk и введите его повторно:\n")
        res_euro = self.valid_charleson(euro_str)
    else:
        euro_str = euro_str.replace(",", ".")
        euro = float(euro_str)
        return int(euro)

def input_other_comp(self) -> int:
    other_str = self.input_strip("Имеются другие осложнения, если да введите 1, если нет то 0:\n")
    res_other = self.valid_0_or_1(other_str)
    while not res_other:
        other_str = self.input_strip("Проверьте правильность введенных данных, принимает значения 1 или 0 (имеются другие осложнения, если да введите 1, если нет то 0):\n")
        res_other = self.valid_0_or_1(other_str)
    else:
        return int(other_str)

def valid_1_to_4(self, numer_srt: str) -> bool:
    if numer_srt.isdigit():
        numer = int(numer_srt)
        if numer in (1, 2, 3, 4):
            return True
    return False

def input_dindo(self) -> int:
    dindo_str = self.input_strip("Введите значение показателя классификатора хирургических осложнений Dindo (от 1 до 4):\n")
    res_dindo = self.valid_1_to_4(dindo_str)
    while not res_dindo:
        dindo_str = self.input_strip("Проверьте правильность введенного показателя классификатора хирургических осложнений Dindo (от 1 до 4):\n")
        res_dindo = self.valid_1_to_4(dindo_str)
    else:
        return int(dindo_str)

def input_sym_access(self) -> int:
    other_access = self.input_strip("Какой оперативный доступ, 1 – несимметричный доступ; 0 – симметричный доступ:\n")
    res_access = self.valid_0_or_1(other_access)
    while not res_access:
        other_access = self.input_strip("Проверьте правильность введенных данных, принимает значения 1 или 0 (1 – несимметричный доступ; 0 – симметричный доступ):\n")
        res_access = self.valid_0_or_1(other_access)
    else:
        return int(other_access)

def input_suture(self) -> int:
    suture = self.input_strip("Правильность наложенных швов, 1 – швы наложены неправильно; 0 – швы наложены правильно:\n")
    res_suture = self.valid_0_or_1(suture)
    while not res_suture:
        suture = self.input_strip("Проверьте правильность введенных данных, принимает значения 1 или 0 (1 – швы наложены неправильно; 0 – швы наложены правильно):\n")            res_suture = self.valid_0_or_1(suture)
    else:
        return int(res_suture)

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