Python使用phonenumbers校验手机号时main函数内print信息不输出问题求助
问题排查和修复方案
核心问题定位
导致main函数print无法正常输出的直接原因是你只覆盖了校验全通过场景的打印逻辑,其他分支没有输出逻辑,此外还存在多个逻辑缺陷:
- 仅当
phonenumbers.is_possible_number(pn)和phonenumbers.is_valid_number(pn)同时返回True时才执行打印,只要其中一项校验不通过,程序没有任何输出逻辑,自然看不到打印内容 - 存在重复解析的冗余操作:
validNumber函数已经完成过一次号码解析和格式化,main函数中再次对格式化后的字符串做解析属于无意义操作,额外增加了出错概率 validNumber中使用了裸except捕获所有异常,解析阶段的错误信息被直接吞掉,无法感知底层报错- 主动移除输入号码开头的
+属于多余操作,phonenumbers库本身支持解析带+的国际标准号码,手动移除反而可能干扰特殊场景下的解析逻辑
修复后可正常输出的代码
import phonenumbers from phonenumbers import NumberParseException def validNumber(phone_number, country): try: parsed = phonenumbers.parse(phone_number, country) return parsed, phonenumbers.is_possible_number(parsed), phonenumbers.is_valid_number(parsed) except NumberParseException as e: return None, False, False, str(e) def main(): while True: phone_number = input('Enter your telephone number: ') country = input('Enter your country: ') res = validNumber(phone_number, country) error_msg = "The phone format for passed country is wrong" if len(res) == 3: pn, is_possible, is_valid = res print("Possible %s, Valid %s, Explain: %s" % (is_possible, is_valid, pn)) print("国际标准格式:%s" % phonenumbers.format_number(pn, phonenumbers.PhoneNumberFormat.INTERNATIONAL)) else: _, _, _, err = res print(err, error_msg) if __name__ == "__main__": main()
优化建议
- 异常捕获要明确指定类型,不要使用裸
except吞掉所有异常,避免无法排查问题 - 合并重复的解析逻辑,一次解析完成后直接做有效性校验,不需要多次转换解析
- 所有分支都补全输出逻辑,不管校验成功还是失败都给出明确提示,方便排查输入问题
内容的提问来源于stack exchange,提问作者Satya V
相关产品推荐
相关产品推荐

