Python:如何仅向支持参数的custom_validation传递allow_deferred_fields?
解决方法:兼容带/不带参数的
custom_validation调用 我来给你几个实用的解决思路,完美适配你的场景——不用给所有custom_validation方法都加allow_deferred_fields参数:
思路1:通过检查方法签名动态传递参数
这是最稳妥的方式,先判断当前类的custom_validation是否接受allow_deferred_fields参数,再决定要不要传:
import inspect def validate(self, allow_deferred_fields=False): """ Validate the data in the group. Raises ValidationError if there is any incorrect data. """ # 获取custom_validation的参数签名 method_sig = inspect.signature(self.custom_validation) # 检查方法是否包含目标参数 if "allow_deferred_fields" in method_sig.parameters: self.custom_validation(allow_deferred_fields=allow_deferred_fields) else: self.custom_validation()
优点:完全不影响现有代码,无需修改任何子类的custom_validation方法,适配所有情况;
缺点:需要引入inspect模块,稍微增加一点代码量。
思路2:给基类的custom_validation统一添加默认参数
如果你的这些类都继承自同一个基类,那直接在基类的抽象方法里加上这个参数的默认值,子类按需重写即可:
from abc import ABC, abstractmethod # 基类定义 class BaseDataGroup(ABC): @abstractmethod def custom_validation(self, allow_deferred_fields=False): """基类抽象方法,统一参数规范""" pass # 需要用到参数的子类 class DeferredSupportGroup(BaseDataGroup): def custom_validation(self, allow_deferred_fields=False): if allow_deferred_fields: # 你的延迟字段校验逻辑 print("处理延迟字段") # 其他校验逻辑 pass # 不需要参数的子类 class NormalDataGroup(BaseDataGroup): def custom_validation(self, allow_deferred_fields=False): # 直接忽略参数,写自己的校验逻辑 print("普通校验逻辑") pass
然后在validate方法里直接传参数就行:
def validate(self, allow_deferred_fields=False): """ Validate the data in the group. Raises ValidationError if there is any incorrect data. """ self.custom_validation(allow_deferred_fields=allow_deferred_fields)
优点:代码更简洁,统一了方法签名规范;
缺点:如果没有基类的话需要重构代码,子类即使不用参数也要保留方法签名(不过有默认值,不影响使用)。
思路3:用异常捕获兼容调用(应急可用,不推荐)
如果不想引入inspect也不想改基类,可以用try-except来尝试两种调用方式:
def validate(self, allow_deferred_fields=False): """ Validate the data in the group. Raises ValidationError if there is any incorrect data. """ try: # 先尝试带参数调用 self.custom_validation(allow_deferred_fields=allow_deferred_fields) except TypeError: # 如果报错(说明方法不接受该参数),再无参调用 self.custom_validation()
优点:零依赖,代码简单;
缺点:不够优雅,可能会捕获到其他原因导致的TypeError,风险较高。
内容的提问来源于stack exchange,提问作者watermelon123
相关产品推荐
相关产品推荐

