Python代码重构咨询:重复输入校验函数能否简化?
重构重复的输入校验函数(保留全局变量)
嘿,作为Python新手能注意到代码重复并想着重构,这点超棒!你的两段enterA和enterB函数逻辑几乎完全一致,只是操作的全局变量不同,当然可以简化重构,而且完全能保留你需要的aCount和bCount全局变量。
核心思路:抽离通用逻辑
我们可以把重复的输入校验、循环、异常处理逻辑抽成一个独立的工具函数,让它只负责获取合法的正浮点数;然后原来的enterA和enterB只需要做一件事:把工具函数返回的合法值赋值给对应的全局变量。
重构后的代码
# 先初始化全局变量(如果之前未初始化) aCount = 0.0 bCount = 0.0 def get_positive_float(message): """通用函数:获取用户输入的正浮点数,不合法则循环提示""" while True: try: value = float(input(message)) # 明确断言错误信息,方便后续维护 assert value > 0.00, "Value must be greater than 0" return value except (ValueError, AssertionError): # 捕获具体异常类型,避免隐藏未知bug print("Error, please enter a positive float number") def enterA(message): global aCount aCount = get_positive_float(message) def enterB(message): global bCount bCount = get_positive_float(message)
为什么这样更好?
- 消除重复代码:如果后续需要新增类似的
enterC、enterD函数,只需要复制enterA的结构,改一下全局变量名就行,不用再复制整段循环和校验逻辑。 - 可维护性更高:如果要修改提示语、调整校验规则(比如改成大于0.01),只需要在
get_positive_float里改一次,所有调用它的函数都会生效。 - 更安全:原来的代码捕获了所有
except,容易隐藏其他未知错误;重构后只捕获ValueError(输入无法转成float)和AssertionError(值不大于0),避免意外吞掉其他异常。
小建议(可选进阶)
如果你的项目后续会扩展,全局变量可能会让代码变得难以追踪。可以考虑用类来管理这些计数变量,比如:
class CounterManager: def __init__(self): self.aCount = 0.0 self.bCount = 0.0 def get_positive_float(self, message): while True: try: value = float(input(message)) assert value > 0.00 return value except (ValueError, AssertionError): print("Error, enter positive float") def enterA(self, message): self.aCount = self.get_positive_float(message) def enterB(self, message): self.bCount = self.get_positive_float(message) # 使用方式 manager = CounterManager() manager.enterA("Enter A: ") print(manager.aCount)
不过这个是进阶用法,如果你现在只需要满足当前需求,前面的重构方案完全足够啦。
内容的提问来源于stack exchange,提问作者r0llie
相关产品推荐
相关产品推荐

