Python 仅当函数接受某个参数时才将该参数传递给该函数
我有一个“验证”方法,其工作原理如下:Python 仅当函数接受某个参数时才将该参数传递给该函数,python,parameter-passing,Python,Parameter Passing,我有一个“验证”方法,其工作原理如下: def validate(self, allow_deferred_fields=False): """ Validate the data in the group. Raises ValidationError if there is any incorrect data. """ # Check custom validation of current group self.custom_validat
def validate(self, allow_deferred_fields=False):
"""
Validate the data in the group.
Raises ValidationError if there is any incorrect data.
"""
# Check custom validation of current group
self.custom_validation()
而且,自定义的_验证方法因要验证的组而异。我的一个自定义\u验证定义希望传递参数“允许\u延迟\u字段”,如下所示:
def custom_validation(self, allow_deferred_fields=False):
if allow_deferred_fields:
.... some code
但其他自定义的_验证方法不接受此参数。如何将此参数传递到validate方法内的自定义\u验证调用中,而不必将其作为参数添加到它可能调用的所有其他自定义\u验证方法中?这是一个设计问题。目前,
validate
的“契约”的一部分是它将调用一个带有零参数的方法custom\u validation
。您需要更改validate
以接受要传递的其他参数:
def validate(self, *args, **kwargs):
self.custom_validation(*args, **kwargs)
或者,您需要将标志“嵌入”到对象本身中,以便custom\u validation
可以在调用时访问它
def validate(self):
self.custom_validation()
def custom_validation(self):
if self.allow_deferred_fields:
...
...
obj.allow_deferred_fields = True
obj.validate()
不过,第二种选择有点老套。这并不比使用一个全局变量进行custom\u验证
检查好多少
第三个选项是强制所有自定义验证方法在被
validate
调用时接受(可能是任意的)关键字参数,尽管它们可以随意忽略参数。在这种情况下,很难检查函数是否接受参数(请参阅inspect.signature)但是,如果函数不支持参数,调用该函数并捕获错误是非常容易的,只要您知道该函数永远不会引发TypeError
这也具有使用基于C的函数的优点
def验证(self,allow_deferred_fields=False):
"""
验证组中的数据。
如果存在任何不正确的数据,则引发ValidationError。
"""
#检查当前组的自定义验证
尝试:
self.custom\u验证(允许\u延迟\u字段=True)
除类型错误外:
self.custom_验证()
如果您不能依赖函数从不抛出TypeError,您可以尝试以下方法,但请记住,如果函数是用C实现的,那么它将失败
def验证(self,allow_deferred_fields=False):
"""
验证组中的数据。
如果存在任何不正确的数据,则引发ValidationError。
"""
#检查当前组的自定义验证
如果在inspect.signature(self.custom\u验证)中出现“allow\u deferred\u fields”:
self.custom\u验证(允许\u延迟\u字段=True)
其他:
self.custom_验证()
对不起,我不明白您想说什么,您能添加其他自定义\u验证器的定义吗?您是否经历过**kwargs、*args
?你知道python中的方法重载吗?