#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2025/3/15 19:52 # @Author : AngesZhu # @File : province_rules.py # @Desc : 省份相关规则 import random import re from typing import Dict, List, Optional, Tuple from functools import lru_cache # 不可变的基础数据 PROVINCE_DATA = ( ("北京", "京", "北京", "010", "华北"), ("天津", "津", "天津", "022", "华北"), ("河北", "冀", "石家庄", "0311", "华北"), # ... 其他省份数据 ("台湾", "台", "台北", "00886", "华东"), ("香港", "港", "香港", "00852", "华南"), ("澳门", "澳", "澳门", "00853", "华南") ) # 类型别名 Province = Tuple[str, str, str, str, str] ProvinceDict = Dict[str, str] # 纯函数:数据转换 def create_mappings(data: Tuple[Province, ...]) -> Tuple[Dict[str, Province], Dict[str, Province]]: """创建名称和简称的映射""" name_map = {p[0]: p for p in data} abbr_map = {p[1]: p for p in data} return name_map, abbr_map # 初始化映射 NAME_MAP, ABBR_MAP = create_mappings(PROVINCE_DATA) ALL_VALID_NAMES = frozenset(NAME_MAP.keys()) | frozenset(ABBR_MAP.keys()) # 纯函数:输入清理 def clean_input(input_str: str) -> str: """清理和标准化输入字符串""" if not input_str or not isinstance(input_str, str): return "" cleaned = input_str.strip().translate(str.maketrans('()', '()')) return re.sub(r'\s+', '', cleaned) # 带缓存的函数:省份验证 @lru_cache(maxsize=128) def validate_province(input_str: str) -> Optional[Province]: """验证并返回省份信息""" cleaned = clean_input(input_str) if not cleaned: return None # 处理带后缀的情况 def remove_suffix(text: str, suffix: str) -> Optional[Province]: if text.endswith(suffix) and len(text) > len(suffix): base = text[:-len(suffix)] return NAME_MAP.get(base) return None # 尝试各种匹配方式 return (NAME_MAP.get(cleaned) or ABBR_MAP.get(cleaned) or remove_suffix(cleaned, '省') or remove_suffix(cleaned, '自治区') or remove_suffix(cleaned, '特别行政区')) # 纯函数:随机选择 def get_random_province(region: Optional[str] = None) -> Province: """随机获取一个省份""" pool = [p for p in PROVINCE_DATA if not region or p[4] == region] if not pool: raise ValueError(f"无效的地区:{region}") return random.choice(pool) # 纯函数:信息转换 def province_to_dict(province: Province) -> ProvinceDict: """将省份元组转换为字典""" keys = ("name", "abbr", "capital", "area_code", "region") return dict(zip(keys, province)) # 组合函数:获取完整信息 def get_province_info(input_str: str) -> ProvinceDict: """获取省份的完整信息""" province = validate_province(input_str) if not province: raise ValueError(f"无效的省份输入:{input_str}") return province_to_dict(province) # 使用示例 if __name__ == "__main__": # 随机获取一个省份 random_prov = get_random_province() print(f"随机省份:{random_prov}") # 验证省份 test_cases = ["北京", "上海市", " 浙 ", "黑", "台湾省", "invalid"] for case in test_cases: result = validate_province(case) print(f"验证 '{case}': {'有效' if result else '无效'}") # 获取省份信息 try: info = get_province_info("广东") print("\n广东省信息:") print(info) except ValueError as e: print(e)