尼日利亚手机号验证函数调用报错invalid token及功能问题求助
问题排查:尼日利亚手机号验证函数的"invalid token"报错与功能异常
一、先解决"invalid token"报错
你调用函数时传的参数是09064764777——这是个整数,但在Python里,整数不能以0开头(只有八进制数允许前导0,但八进制数只能包含0-7,你的数字里有9,所以解释器直接抛出"invalid token"错误)。
解决方法很简单:调用函数时必须传入字符串类型的手机号,比如:
is_PhoneNumber("09064764777")
二、验证功能的几个异常问题
除了报错,你的函数逻辑还有几个明显的问题,导致无法正确验证尼日利亚手机号:
前两位判断逻辑完全错误:
你用number[:2]取前两位,但如果number是字符串,这是字符串类型,而list(range(70, 91))是整数列表,两者根本无法直接比较。尼日利亚手机号的前缀是70-89之间的两位数,你需要先把前两位转成整数,再判断是否在这个范围内。exit()的使用太粗暴:
每次验证失败就直接终止整个程序,这会让函数的复用性极差。更好的做法是返回布尔值(True/False),让调用方自己决定后续操作。长度验证的逻辑漏洞:
当手机号长度不是10位时,你只打印了提示,但没有终止验证流程,程序会继续执行到最后,打印"This is a phone number",导致错误的判断结果。
三、修正后的完整代码
这里给你调整后的版本,修复了所有问题,同时让函数更健壮:
def is_PhoneNumber(number): # 先处理输入类型:如果不是字符串,尝试转成字符串 if not isinstance(number, str): try: number = str(number) except: print("This is not a valid input") return False # 检查是否全为数字字符 if not number.isdecimal(): print("This is not a number at all") return False # 验证长度是否为10位 if len(number) != 10: print("It's not a Nigerian phone number (invalid length)") return False # 验证前缀是否在70-89范围内 try: prefix = int(number[:2]) if not (70 <= prefix <= 89): print("This is not a Nigerian phone number (invalid prefix)") return False except: print("Invalid prefix format") return False print("This is a valid Nigerian phone number") return True # 正确调用方式(传入字符串) is_PhoneNumber("09064764777")
四、改进点说明
- 兼容字符串和可转换为字符串的输入,避免类型报错
- 用返回布尔值替代
exit(),函数可以在任何场景下复用 - 给不同的错误场景添加了更明确的提示信息
- 确保任何验证失败都会提前返回,不会出现"错误验证通过"的情况
内容的提问来源于stack exchange,提问作者thorwoden
相关产品推荐
相关产品推荐

