""" 数据模型:Kanji(汉字-假名-拼音)、Tango(单词-假名) """ from pydantic import BaseModel class Kanji(BaseModel): """单个汉字的三要素:汉字、假名读音、拼音""" kanji: str = "" kana: str = "" pinyin: str = "" @classmethod def parse_string(cls, s: str, splitter: str = '->') -> 'Kanji': """将 '中->zhong->ちゅう' 格式的字符串解析为 Kanji 对象""" if splitter not in s: raise ValueError("字符串格式应为 '汉字->拼音->假名' ") kanji, pinyin, kana = s.split(splitter, maxsplit=2) return cls(kanji=kanji.strip(), pinyin=pinyin.strip(), kana=kana.strip()) def to_json(self, indent=None) -> str: """将对象转为 JSON 字符串""" return self.model_dump_json(indent=indent) def format(self, splitter: str = '->') -> str: """格式化输出""" return f"{self.kanji}{splitter}{self.pinyin}{splitter}{self.kana}" class Tango(BaseModel): """一个日语单词:单词本身 + 假名读音""" tango: str kana: str @classmethod def parse_string(cls, s: str, splitter: str = '->') -> 'Tango': """将 '日本語->にほんご' 格式的字符串解析为 Tango 对象""" if splitter not in s: raise ValueError("字符串格式应为 '日语单词->假名' ") tango, kana = s.split(splitter, maxsplit=1) return cls(tango=tango.strip(), kana=kana.strip()) def to_json(self, indent=None) -> str: """将对象转为 JSON 字符串""" return self.model_dump_json(indent=indent) def format(self, splitter: str = '->') -> str: """格式化输出""" return f"{self.tango}{splitter}{self.kana}" def __eq__(self, other: object) -> bool: if not isinstance(other, Tango): return False return (self.tango, self.kana) == (other.tango, other.kana) def __hash__(self) -> int: return hash((self.tango, self.kana))