Python非正则解析用户输入日期的方法及类初始化逻辑优化问题
问题解答
一、无正则的用户输入日期解析方案
- 方案1:字符串分割法
你的输入固定用/作为分隔符,直接调用字符串split('/')方法拆分即可,天然适配单/双位的月日输入,转int的过程还能自动去除前导零,修改后的__init__示例:def __init__(self, digits): month_str, day_str, year_str = digits.split('/') # 转int再转回str自动去掉前导零,匹配monthdic的键规则 self.month = str(int(month_str)) self.day = str(int(day_str)) self.year = year_str - 方案2:标准库
datetime.strptime解析
用Python内置的日期处理工具直接按指定格式解析,自带日期合法性校验,不用自己处理边界问题:
输入from datetime import datetime def __init__(self, digits): date_obj = datetime.strptime(digits, '%m/%d/%y') self.month = str(date_obj.month) self.day = str(date_obj.day) self.year = str(date_obj.year)[2:] # 取年份后两位1/12/14或者01/12/14都能正常解析,输入不存在的日期比如2/30/23会直接抛出明确的格式错误,不用自己写校验逻辑。 - 方案3:第三方库通用解析
如果需要适配更多无固定格式的用户输入,可以用第三方日期解析库的自动适配能力,无需指定格式即可识别绝大多数常见日期写法。
二、checkday()和checkmonth()放在__init__内部调用的合理性
完全合理,甚至更符合面向对象的封装原则:
- 这两个方法的作用是完善Date类的属性初始化,属于类自身的内部逻辑,不应该暴露给外部调用者,避免出现实例化后忘记调用这两个方法导致输出结果不符合预期的问题
- 放在
__init__中调用可以保证Date类实例化完成后,所有属性就已经是最终可用的状态,外部调用者直接使用即可,不需要关心内部的转换逻辑 - 建议直接把这两个函数改成Date类的私有内部方法,不要作为独立的外部函数存在,避免外部误调用修改属性。
内容的提问来源于stack exchange,提问作者Aiden Choi
相关产品推荐
相关产品推荐

