Создайте общий 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. Мусорный префикс, дробь и отсутствующее поле не считаются целым числом по этому контракту.