Вопрос проверяет инженерное мышление: умение писать код, который легко сопровождать, расширять и безопасно использовать в production.
Читаемость улучшается, когда логика проста и разделена на понятные блоки: явные именования, единый стиль обработки символов, ранние выходы при ошибках. Надёжность повышают проверки краевых случаев и покрытие тестами. Полезно выделить маппинг пар скобок в одну структуру и не раздувать условные ветки. Ещё важно заранее решить, что делать с не-скобочными символами: игнорировать или считать ошибкой.
Читаемость — это насколько легко другому разработчику понять код, а надёжность — насколько предсказуемо он ведёт себя на разных входных данных, включая ошибочные.
Вместо нескольких if удобнее использовать один словарь.
PAIRS = {')': '(', ']': '[', '}': '{'}
OPEN = set(PAIRS.values())
CLOSE = set(PAIRS.keys())
Перед списками важно зафиксировать идею: чем меньше вложенности, тем легче читать и меньше шансов пропустить ветку.
Если закрывающая скобка встретилась при пустом стеке — ошибка
Если тип не совпадает — ошибка
Иначе продолжаем
stack — нормально и общепринято
pairs / PAIRS — говорит о назначении
ch / char — нейтрально и понятно
Нужно выбрать одну политику и сделать её явной:
Игнорировать всё, кроме скобок (часто удобнее)
Считать любой другой символ ошибкой (если валидируете формат)
Пример “игнорировать”:
def is_valid_brackets(s: str) -> bool:
stack: list[str] = []
pairs = {')': '(', ']': '[', '}': '{'}
open_set = set(pairs.values())
for ch in s:
if ch in open_set:
stack.append(ch)
elif ch in pairs:
if not stack or stack.pop() != pairs[ch]:
return False
# else: игнорируем прочие символы
return not stack
Пустая строка "" → корректно
Строка без скобок "abc" → зависит от политики (часто корректно)
Только открывающие "(((" → некорректно
Только закрывающие ")))" → некорректно
Смешанные типы "([{}])" → корректно
Вместо сложных сценариев лучше держать компактный набор базовых примеров.
def test_is_valid_brackets():
assert is_valid_brackets("") is True
assert is_valid_brackets("()[]{}") is True
assert is_valid_brackets("([{}])") is True
assert is_valid_brackets("(]") is False
assert is_valid_brackets("([)]") is False
assert is_valid_brackets("(()") is False
Читаемость достигается простыми правилами: минимум вложенности, явные структуры данных и предсказуемое поведение на входе. Надёжность — через раннее обнаружение ошибок, обработку краевых случаев и тесты.