From 7a53cda2941f046170a00674caa96b98de7e940d Mon Sep 17 00:00:00 2001 From: pajjilykk Date: Wed, 1 Apr 2026 14:33:43 +0700 Subject: [PATCH] add surname separators support --- lab3/main.py | 40 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/lab3/main.py b/lab3/main.py index 293f2ef..f269609 100644 --- a/lab3/main.py +++ b/lab3/main.py @@ -1,8 +1,11 @@ import math from decimal import Decimal, InvalidOperation +import unicodedata class Worker: + SURNAME_SEPARATORS = {"-", "'"} + def __init__(self, surname: str, position: str, salary: float): self.surname = None self.position = None @@ -18,12 +21,41 @@ class Worker: @staticmethod def validate_surname(surname: str) -> str: - surname = surname.strip() + surname = unicodedata.normalize("NFKC", surname.strip()) + surname = surname.replace("’", "'").replace("`", "'").replace("−", "-") + if len(surname) < 2: raise ValueError("Фамилия слишком короткая") - if not surname.isalpha(): - raise ValueError("Фамилия должна содержать только буквы") - return surname.capitalize() + + if surname[0] in Worker.SURNAME_SEPARATORS or surname[-1] in Worker.SURNAME_SEPARATORS: + raise ValueError("Фамилия не может начинаться или заканчиваться разделителем") + + previous_is_separator = False + for char in surname: + if char in Worker.SURNAME_SEPARATORS: + if previous_is_separator: + raise ValueError("Фамилия содержит подряд идущие разделители") + previous_is_separator = True + continue + + if not char.isalpha(): + raise ValueError("Фамилия может содержать только буквы, дефис и апостроф") + + previous_is_separator = False + + parts: list[str] = [] + token = "" + for char in surname: + if char in Worker.SURNAME_SEPARATORS: + parts.append(token) + parts.append(char) + token = "" + else: + token += char + parts.append(token) + + normalized_parts = [part[:1].upper() + part[1:].lower() if part not in Worker.SURNAME_SEPARATORS else part for part in parts] + return "".join(normalized_parts) # проверка должности def set_position(self, position: str):