端口输入验证函数因缺少return语句默认返回None,导致验证恒为False。修复后添加显式return及正则与数值范围校验,确保单端口、列表或范围格式正确解析。
port_is_valid()函数虽然执行了正则匹配并打印了结果,但少了一句关键的return语句。Python机制很清楚,函数没有显式返回,默认就是None。而if port_is_valid(str_ports):实际等价于if None:,结果恒为False。验证分支直接被跳过,get_port()也因为未覆盖所有执行路径而隐式返回None。不要小看这一点差别,整个逻辑链路就断了。
修复后的完整版本如下,已经是经过检验、可直接上手的实现:
import re
import termcolor
# 改进的正则:更精确匹配合法端口(1–65535)及格式
port_regex = re.compile(r'^(d{1,5})(-(d{1,5}))?$|^(d{1,5})(,(d{1,5}))*$')
def port_is_valid(port: str) -> bool:
"""验证端口字符串是否符合 '80'、'22,80,443' 或 '80-443' 格式,且数值在有效范围内"""
if not port.strip():
return False
# 先检查基础格式
if not port_regex.match(port):
return False
# 解析并校验数值范围
try:
if '-' in port:
start, end = map(int, port.split('-'))
if not (1 <= start <= 65535 and 1 <= end <= 65535 and start <= end):
return False
elif ',' in port:
ports = [int(p.strip()) for p in port.split(',')]
if not all(1 <= p <= 65535 for p in ports):
return False
else:
port_num = int(port)
if not (1 <= port_num <= 65535):
return False
except ValueError:
return False
return True
def get_port() -> list[int] | int:
"""安全获取用户输入的端口,支持单端口、逗号分隔、范围格式,自动去重并排序"""
while True:
str_ports = input(termcolor.colored("Specify The Ports (e.g., 22, 80-443, 443): ", "light_cyan")).strip()
if not str_ports:
print(termcolor.colored(" Port input cannot be empty.", "yellow"))
continue
if not port_is_valid(str_ports):
print(termcolor.colored(" Invalid port format or out-of-range value. Please retry.", "red"))
continue
# 解析逻辑(已确保格式合法)
if ',' in str_ports:
int_ports = [int(p.strip()) for p in str_ports.split(',')]
return sorted(list(set(int_ports))) # 去重 + 排序
elif '-' in str_ports:
start, end = map(int, str_ports.split('-'))
return list(range(start, end + 1))
else:
return int(str_ports)
# 正确调用示例
if __name__ == "__main__":
ports = get_port()
print(termcolor.colored(f" Valid ports parsed: {ports}", "green"))
关键修复与增强点:
port_is_valid()显式return result,杜绝None干扰布尔判断;get_port()使用while True持续提示,直到输入合法为止,消除递归调用风险(原代码中get_port()递归未返回值,导致上层调用仍得None);get_port()而不return——这会导致调用栈“丢失”返回值。始终用循环替代递归处理交互式输入,这才是生产环境下的正确姿势。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述