Python方法条件传参优化:children为True时必传children_age
优雅实现参数依赖检查的几种方案
针对你遇到的pick_filter方法中,children=True时必须传入children_age的需求,以下是几种比复杂条件判断更优雅的实现方式:
1. 极简内联条件检查
这是最直接的方案,不用额外依赖,只在函数开头加一行检查逻辑,完全不复杂:
from typing import List class YourSpiderClass: def pick_filter(self, adult: bool = True, children: bool = True, rooms: bool = True, count: List[int], children_age: List[int] = None) -> None: # 参数检查逻辑 if children and children_age is None: raise ValueError("当children为True时,必须传入children_age参数") # 后续Selenium爬虫逻辑 # 比如:self.driver.find_element(...)
2. 通用参数检查装饰器
如果你的项目中有多个方法需要类似的参数依赖检查,可以封装一个可复用的装饰器:
from functools import wraps import inspect from typing import Callable, List def require_param_when(condition: Callable[..., bool], required_param: str): def decorator(func: Callable): @wraps(func) def wrapper(*args, **kwargs): # 绑定函数参数,获取参数名和对应值 sig = inspect.signature(func) bound_args = sig.bind(*args, **kwargs).arguments # 触发条件时检查必填参数 if condition(**bound_args): if bound_args.get(required_param) is None: raise ValueError(f"当条件满足时,必须传入参数{required_param}") return func(*args, **kwargs) return wrapper return decorator class YourSpiderClass: @require_param_when(lambda children: children, "children_age") def pick_filter(self, adult: bool = True, children: bool = True, rooms: bool = True, count: List[int], children_age: List[int] = None) -> None: # 爬虫逻辑 pass
这个装饰器可以灵活定义各种参数依赖规则,复用性强。
3. Python 3.10+ 匹配语句(Match Case)
如果你的项目使用Python 3.10及以上版本,用match语句可以让条件判断更清晰:
from typing import List class YourSpiderClass: def pick_filter(self, adult: bool = True, children: bool = True, rooms: bool = True, count: List[int], children_age: List[int] = None) -> None: match (children, children_age): case (True, None): raise ValueError("当children为True时,必须传入children_age参数") case _: pass # 后续爬虫逻辑
4. 数据类(Dataclass)封装参数
如果方法参数较多,用dataclass封装参数并集中做验证,能让函数定义更简洁:
from dataclasses import dataclass from typing import List, Optional @dataclass class FilterParams: adult: bool = True children: bool = True rooms: bool = True count: List[int] children_age: Optional[List[int]] = None def __post_init__(self): # 初始化后自动执行参数检查 if self.children and self.children_age is None: raise ValueError("当children为True时,必须传入children_age参数") class YourSpiderClass: def pick_filter(self, params: FilterParams) -> None: # 直接使用params中的属性 # 比如:if params.adult: ... pass
内容的提问来源于stack exchange,提问作者biginner_sama
相关产品推荐
相关产品推荐

