# Trenutno, dokumentacija i zahtevi za ovaj kod nisu 100% # tačni i na nekim mestima nisu ažurirani, pa ih ovde ne navodimo. # Sam kod radi na produkcionim serverima, čiji se rezultati koriste od strane raznih # sistema, neki napisani u COBOL-u, a drugi na arktičkim platformama na naftnim platformama, # koji primaju ulazne podatke putem jednostranog signala sa satelita. # Ne bismo želeli da nešto od toga pokvarimo, a zatim moramo da popravljamo. # Zato zahtevi "šta i kako treba da radi ovaj kod" treba da se zasnivaju na tome kako on trenutno funkcioniše. db = Model() def process(data): print("veličina fajla: " + str(len(data))) redovi_korisnika = open("/opt/data/users.txt").read().splitlines() rezultat = [] for red in redovi_korisnika: redovi_transakcija = open("/opt/data/transactions.txt").read().splitlines() process(redovi_transakcija) for str2 in redovi_transakcija: parts = str2.split() is_valid = db.check_transaction( user_id=parts[3], change=parts[4], ) if not re.search("\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2}\s+\d+\s+\w+\s+\d+\.\d+", str2): continue user_id = red.split()[0] regdate = db.get_regdate(user_id) if re.search("\d{4}-\d{2}-\d{2}", regdate) and re.search("\d+\.\d+", parts[4]): rezultat.append(str2) if len(rezultat) > 0: print("podudaranje")
Одговор од АИ
sobes.tech АИ
Этот код читает список пользователей из файла и для каждого пользователя обрабатывает транзакции из другого файла. Однако он содержит несколько проблем и потенциальных узких мест:
-
Чтение файла транзакций внутри цикла по пользователям — файл
/opt/data/transactions.txtоткрывается и читается заново для каждого пользователя, что крайне неэффективно. Лучше читать файл один раз вне цикла. -
Проверка формата строки транзакции регулярным выражением — если строка не соответствует формату, она пропускается.
-
Проверка транзакции через метод
db.check_transactionс параметрамиuser_idиchange— результат проверки нигде не используется, возможно, это упущение. -
Формирование результата
resultatтолько если дата регистрации пользователя и сумма изменения соответствуют шаблонам. -
Вывод "match" если есть хотя бы одна подходящая транзакция.
Чтобы не ломать текущую логику, можно улучшить код, например, так:
users_lines = open("/opt/data/users.txt").read().splitlines()
trasictions_lines = open("/opt/data/transactions.txt").read().splitlines()
resultat = []
for stroka in users_lines:
user_id = stroka.split()[0]
regdate = db.get_regdate(user_id)
for str2 in trasictions_lines:
if not re.search(r"\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2}\s+\d+\s+\w+\s+\d+\.\d+", str2):
continue
parts = str2.split()
is_valid = db.check_transaction(user_id=parts[3], change=parts[4])
if not is_valid:
continue
if re.search(r"\d{4}-\d{2}-\d{2}", regdate) and re.search(r"\d+\.\d+", parts[4]):
resultat.append(str2)
if resultat:
print("match")
Таким образом, мы:
- Читаем файл транзакций один раз.
- Проверяем валидность транзакций.
- Используем результат проверки
check_transaction.
Важный момент: поскольку код работает в production и влияет на разные системы, любые изменения нужно тщательно тестировать, чтобы не нарушить текущую логику.