Python中如何定义两个需同时传值或均不传的互依参数
Python类互依共存参数的实现与校验
核心规则
start_date和end_date为绑定互存参数,实例化时必须满足以下要求:
- 两个参数同时不传值,使用默认值
None - 两个参数同时传入有效值
- 仅传入其中任意一个参数时,直接抛出异常
实现逻辑
直接在__init__方法中做参数状态校验:利用布尔值异或逻辑,判断两个参数是否为None的状态是否一致——如果一个为None、另一个不为None,就说明违反了互存规则,抛出异常即可。
完整实现代码
class TestEvent: def __init__(self, start_date=None, end_date=None, **kwargs): # 互存参数校验 if (start_date is None) ^ (end_date is None): missing_param = "end_date" if start_date is not None else "start_date" raise ValueError(f"start_date与end_date为互存参数,必须同时传值,当前缺失参数:{missing_param}") # 校验通过后完成属性赋值 self.start_date = start_date self.end_date = end_date # 处理其他关键字参数 for key, value in kwargs.items(): setattr(self, key, value)
效果验证
- 合法场景1:无参实例化
valid_event_1 = TestEvent() # 实例化正常,start_date、end_date均为None - 合法场景2:同时传入两个日期参数
valid_event_2 = TestEvent(start_date='2022-07-01', end_date='2022-08-01') # 实例化正常,可正常读取两个日期属性 - 非法场景1:仅传入start_date
invalid_event_1 = TestEvent(start_date='2022-07-01') # 抛出ValueError,提示缺失end_date参数 - 非法场景2:仅传入end_date
invalid_event_2 = TestEvent(end_date='2022-08-01') # 抛出ValueError,提示缺失start_date参数
扩展说明
如果后续需要支持更多同组互存参数,可以把同组参数放到列表里做统一校验:统计组内非None参数的个数,只有当个数为0(全不传)或者等于组参数总数(全传)时校验通过,否则抛出异常,不需要为每组参数单独写重复的异或判断。
内容的提问来源于stack exchange,提问作者Stevoisiak
相关产品推荐
相关产品推荐

