- 任务化清洗流程:Task/TaskManager + BatchProcessor 三方法
- 数据目录规范化:data/{db,sources,backup}
- CLI 入口移进包,注册 jclean 命令
- 工作流测试驱动(tests/test_cleaner_workflow.py)
- 40 测试通过
58 lines
2.0 KiB
Python
58 lines
2.0 KiB
Python
"""
|
||
数据模型: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))
|