You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python排球预约系统如何从各校验函数取值生成正确打印收据

核心问题根源

  1. 自定义的date()、checkemail()、phone()三个校验函数没有设置返回值,Python中无显式return的函数默认返回None,因此你赋值给Email、ContactNumber、Date变量的内容自然都是空值
  2. 校验失败触发递归调用时,没有将递归后的结果返回,即使后续输入正确也无法拿到有效值
  3. 打印收据时重复调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 20:30:02