Python排球预约系统如何从各校验函数取值生成正确打印收据
核心问题根源
- 自定义的
date()、checkemail()、phone()三个校验函数没有设置返回值,Python中无显式return的函数默认返回None,因此你赋值给Email、ContactNumber、Date变量的内容自然都是空值 - 校验失败触发递归调用时,没有将递归后的结果返回,即使后续输入正确也无法拿到有效值
- 打印收据时重复调用
date()会导致用户需要二次输入日期,且你直接打印validateEmail(email)会输出正则匹配对象而非邮箱地址,同时引用的email是checkemail函数内的局部变量,全局未定义会直接报错
修复步骤
1. 修改三个校验函数,补全返回逻辑
import datetime import re from rich.console import Console # 你代码里用到了console输入,需要导入对应模块 console = Console() def date(): inputDate = input("Enter the booking date in format 'dd/mm/yy' : ") isValidDate = True try: day, month, year = inputDate.split('/') datetime.datetime(int(year), int(month), int(day)) except (ValueError, IndexError): isValidDate = False if isValidDate: print("Input date is valid ..") return inputDate # 校验通过返回合法日期 else: print("Input date is not valid..") return date() # 递归调用时要return结果,否则拿不到正确值 def validateEmail(email): return re.match(r'[\w-]{1,20}@\w{2,20}\.\w{2,3}$', email) def checkemail(): email = console.input('[bright_white]Please enter your email address: [/]') valid = validateEmail(email) if valid: print(email, 'is valid') return email # 返回合法邮箱 else: print("invalid email format", email) return checkemail() # 返回递归结果 def phone(): phoneno = console.input('[bright_white]Please enter your phone number :[/] ') pattern = r"^(1|8|9)[0-9]{7}" if re.match(pattern, phoneno) and len(phoneno) == 8: print("Valid") return phoneno # 返回合法手机号 else: print("Invalid") return phone() # 返回递归结果
2. 修改booking_form函数的打印逻辑
def booking_form(): bookings = [] FirstName = input('Please enter your first name: ') LastName = input('Please enter your last name: ') Email = checkemail() ContactNumber = phone() Date = date() Time = input('Enter time in 00:00 AM/PM format:') Gym = input("Please Enter the Name of the Gym Again to Ensure that to be the Correct one: ") Commentsrequest = input('Comments/Additional Request: ') bookings.append(FirstName) bookings.append(LastName) bookings.append(Email) bookings.append(ContactNumber) bookings.append(Date) bookings.append(Time) bookings.append(Gym) bookings.append(Commentsrequest) with open("booking.csv", 'a', newline='') as csvfile: import csv writer = csv.writer(csvfile) writer.writerow(bookings) # 这里不要重新调用date(),用之前存储的Date变量;邮箱直接用Email变量,不要调用validateEmail print(" Date:", Date) print(" Time:", Time) print(" First Name:", FirstName) print(" Last Name:", LastName) print(" Email:", Email) print(" Phone Number:", ContactNumber) print(" Chosen Location [Area/Gym]:", Gym) print(" Additional Notes/Requests:", Commentsrequest) print("**********************************************************************", ) print("| Thank You for Using the Volleyball Booking System |", ) print("| You have Successfully Booked a Court/Gym |", ) print("| Please Screenshot this Receipt to Keep |", ) print("| as Proof of Booking |", ) print("| Have a Good Day, We will see you on the Court!! |", ) print( " ★★★★★★★★★★★★ ") print("**********************************************************************", ) exit()
额外优化建议
- 递归校验输入如果用户连续输错多次容易触发递归深度报错,建议用while循环替代递归做输入校验,逻辑更稳定
- 日期拆分前加异常捕获,避免用户输入不符合
/分隔格式时程序直接崩溃
内容的提问来源于stack exchange,提问作者vedha
相关产品推荐
相关产品推荐

