需求背景
在测试的时候需要mock个人信息,mock对象包含性别、姓名、出生日期、年龄、年龄单位、身份证号、怀孕标识、详细住址。
mock要求:尽可能地贴近显示,各个信息之间的关联性正确,不能出现冲突。尽可能地减少嵌套。
- 例如性别(不考虑政治正确)会影响姓名(大部分情况下)、身份证号、怀孕标识(基于目前科技水平);
- 出生日期(基于目前科技水平)影响身份证号、年龄、年龄单位;
- 身份证号影响详细住址(假设都不背井离乡)
基于上述要求,选择合适的元数据很重要。最终决定从性别和出生日期入手。Faker库就能解决这两个信息,之后就要基于性别判断姓名、身份证号3位顺序码、怀孕标识;基于出生日期判断身份证号7~14位、年龄、年龄单位。
解决方案
from datetime import date
def age_calculator(current_date: date, birth_date: date):
age = None
age_unit = None
date_gap = (current_date - birth_date).days
if date_gap < 365:
age = date_gap
age_unit = "天"
elif date_gap >= 365:
age_unit = "岁"
date_part1 = current_date.month, current_date.day
date_part2 = birth_date.month, birth_date.day
if date_part1 >= date_part2:
age = current_date.year - birth_date.year
elif date_part1 < date_part2:
age = current_date.year - birth_date.year - 1
return age, age_unit
- 上述代码先判断是否满1周岁,由此来确定年龄单位;
- 然后判断月和日部分,来确定是否满周岁,若不满周岁,则年份相减后再减去一。
总结
这种方法嵌套相对较少,且解决了基本的周岁判断。但缺陷同样不少:
- 计算规则比较粗糙,未考虑闰年;
- 年龄单位只考虑了岁和天;
- 其他潜在的逻辑漏洞...
以上方法权当抛砖引玉,欢迎大家一起交流,寻找更简洁、高效、全面、准确的计算方法。