Как обьединить код в питоне из нескольких модулей в один?
Код из файла 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)