Конвертация строки в целое число с использованием полиморфных парсеров

Создайте общий Parser.parse и две реализации: DecimalParser проверяет всю строку, JsonParser читает целочисленное поле value. Нераспознанные значения возвращают None.

Короткий ответ

Что ответить на собеседовании

Создайте общий Parser.parse и две реализации: DecimalParser проверяет всю строку, JsonParser читает целочисленное поле value. Нераспознанные значения возвращают None.

Подробный разбор

Ответ с пояснениями

Условие

Создать программу, которая принимает строковое значение и возвращает целочисленное представление, если оно присутствует. Возможные форматы входных данных:

  • обычное десятичное представление, например: "42";
  • JSON‑строка, содержащая поле "value": "{"value":42}". Если в переданной строке нет числа (или формат не соответствует указанным), функция должна вернуть None. Реализовать решение в объектно‑ориентированном стиле, используя полиморфизм: оформить два отдельных класса‑парсера (один обрабатывает обычные строки, второй – JSON), которые реализуют общий интерфейс/абстрактный класс.

Пример использования:

parser = get_parser(input_str)  # функция выбирает нужный парсер
result = parser.parse()

Где parse возвращает найденное целое число либо None.

Ответ

Создайте общий Parser.parse и две реализации: DecimalParser проверяет всю строку, JsonParser читает целочисленное поле value. Нераспознанные значения возвращают None.

from abc import ABC, abstractmethod
import json
import re

class Parser(ABC):
    def __init__(self, text):
        self.text = text

    @abstractmethod
    def parse(self):
        pass

class DecimalParser(Parser):
    def parse(self):
        text = self.text.strip()
        if not re.fullmatch(r'[+-]?[0-9]+', text):
            return None
        try:
            return int(text)
        except ValueError:
            return None

class JsonParser(Parser):
    def parse(self):
        try:
            obj = json.loads(self.text)
        except ValueError:
            return None
        if isinstance(obj, dict) and type(obj.get('value')) is int:
            return obj['value']
        return None

def get_parser(text):
    return JsonParser(text) if text.lstrip().startswith('{') else DecimalParser(text)

Проверка type(...) is int исключает True и False. Мусорный префикс, дробь и отсутствующее поле не считаются целым числом по этому контракту.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее