Python使用switcher实现分支逻辑时私有字典被意外更新问题咨询
问题原因
你对Python用字典模拟switch case的用法存在错误,核心问题是:构造switcher字典时,所有value位置的update()方法会被立即执行,而非等到调用switcher.get()时才执行对应分支。
你写的switcher字典在定义阶段就会依次执行5个车位字典的update()操作,每次调用add_parking_spot()时,所有5类车位的字典都会被写入你传入的{type: slot_no}键值对。你在代码里仅打印了__handicapped_spots,所以看起来只有它被意外更新,实际剩余4类车位的字典也都被写入了相同的内容。
修复方案
要实现匹配到对应车位类型才执行更新的效果,需要把switcher的value改为未执行的可调用对象,匹配成功后再调用执行,修改后的add_parking_spot方法参考如下:
def add_parking_spot(self, spot_type, slot_no): # 注意:type是Python内置关键字,不要用作参数名,修改为spot_type避免命名冲突 switcher = { ParkingSpotType.HANDICAPPED: lambda: self.__handicapped_spots.update({spot_type: slot_no}), ParkingSpotType.COMPACT: lambda: self.__compact_spots.update({spot_type: slot_no}), ParkingSpotType.LARGE: lambda: self.__large_spots.update({spot_type: slot_no}), ParkingSpotType.MOTORBIKE: lambda: self.__motorbike_spots.update({spot_type: slot_no}), ParkingSpotType.ELECTRIC: lambda: self.__electric_spots.update({spot_type: slot_no}), } handler = switcher.get(spot_type, None) if not handler: return 'Wrong parking spot type' # 匹配到对应类型后才执行更新操作 handler() print(self.__handicapped_spots)
使用lambda把update操作包裹为匿名函数后,构造switcher时不会立即执行更新逻辑,只有get到对应分支后调用handler()才会执行对应车位字典的更新,就不会出现全量更新的问题。
内容的提问来源于stack exchange,提问作者myquest
相关产品推荐
相关产品推荐

