输入有效会员卡号时return语句未执行的Python代码问题排查
问题原因
- 重复调用校验方法:你在Account类的
__init__初始化方法中已经调用了一次self.scan_id(),执行a = Account()实例化的时候就会触发第一次输入校验,之后你又单独写了一行a.scan_id(),所以总共会弹出两次输入框。你输入有效卡号后第一次校验已经通过,返回的结果直接赋值给了私有属性__id没有打印,你看到的第二次输入框是第二次调用方法触发的,就会误以为有效卡号还会重复弹框。 - 遍历校验逻辑错误:当前
scan_id的循环只会校验第一个会员的卡号:如果输入的卡号和第一个会员的card_number不一致,会直接返回Invalid ID,根本不会遍历后面的会员数据,只有第一个会员的卡号13能被识别为有效,其余22、33、43都会被误判为无效。 - 额外兼容提示:你的members.json里的id字段前有BOM头标识(就是
\u00ef\u00bb\u00bf前缀),读取文件的时候指定编码为utf-8-sig可以避免后续读取id字段出现异常。
修正后代码
from enum import Enum from abc import ABC, abstractmethod import csv import json from datetime import datetime, timedelta, date membersJsonPath = 'members.json' class BookStatus(Enum): AVAILABLE, RESERVED, LOANED, LOST = 1, 2, 3, 4 class ReservationStatus(Enum): WAITING, PENDING, CANCELED, NONE = 1, 2, 3, 4 class AccountStatus(Enum): ACTIVE, CLOSED, CANCELED, NONE = 1, 2, 3, 4 class Account(ABC): def __init__(self, status=AccountStatus.ACTIVE): self.__id = self.scan_id() self.__status = status # 初始化完成后直接打印校验结果 print(self.__id) def scan_id(self): with open(membersJsonPath, 'r', encoding='utf-8-sig') as membersJson: data = json.load(membersJson) input_id = input("Please enter your member ID: ") for member in data['members']: if member['card_number'] == input_id: return f"Welcome, {member['first_name']}!" # 遍历完全部会员未匹配到,再返回无效 return "Invalid ID" # 实例化就会触发一次校验,无需额外单独调用scan_id a = Account() # 后续需要重新刷卡校验的时候再调用即可:print(a.scan_id())
内容的提问来源于stack exchange,提问作者d212digital
相关产品推荐
相关产品推荐

