如何优化Python关键字参数校验:仅允许传入一个非None参数
优化方案
核心思路是统一收集并校验有效参数,避免逐个参数写重复的判断逻辑,扩展性更强:
实现步骤
- 定义允许的参数列表,后续新增动物只需往列表里添加元素即可
- 过滤出所有非
None的有效参数 - 校验有效参数的数量:超过1个则抛出错误;0个则跳过处理;1个则执行对应逻辑
优化后的代码
def animal(*args, **kwargs): # 定义所有允许的动物参数,新增动物直接加在这里 allowed_animals = ["duck", "lion", "wolf"] # 补充位置参数校验(原代码未处理,让逻辑更严谨) if args: raise ValueError("Positional arguments are not allowed.") # 过滤出所有非None的有效参数 provided_animals = [animal for animal in allowed_animals if kwargs.get(animal) is not None] # 校验互斥规则 if len(provided_animals) > 1: raise ValueError(f"When '{provided_animals[0]}' is specified, you cannot provide other arguments.") # 处理单个有效参数的情况 if provided_animals: animal_type = provided_animals[0] print(f"{animal_type.capitalize()}: {kwargs[animal_type]}!") # other stuff ... # 测试用例 animal() # ✓ animal(duck="quack") # ✓ animal(duck="quack", lion=None) # ✓ animal(duck="quack", lion="roar") # X animal(lion="roar", wolf="howl") # X
优势
- 扩展性极强:新增动物参数时,只需修改
allowed_animals列表,无需改动校验和处理逻辑 - 代码简洁:避免了大量重复的
if...or判断,可读性更高 - 逻辑统一:所有互斥校验规则集中处理,减少出错概率
内容的提问来源于stack exchange,提问作者Mustafa AHCI
相关产品推荐
相关产品推荐

